View Javadoc

1   /*****************************************************************
2    * Licensed to the Apache Software Foundation (ASF) under one   *
3    * or more contributor license agreements.  See the NOTICE file *
4    * distributed with this work for additional information        *
5    * regarding copyright ownership.  The ASF licenses this file   *
6    * to you under the Apache License, Version 2.0 (the            *
7    * "License"); you may not use this file except in compliance   *
8    * with the License.  You may obtain a copy of the License at   *
9    *                                                              *
10   *   http://www.apache.org/licenses/LICENSE-2.0                 *
11   *                                                              *
12   * Unless required by applicable law or agreed to in writing,   *
13   * software distributed under the License is distributed on an  *
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15   * KIND, either express or implied.  See the License for the    *
16   * specific language governing permissions and limitations      *
17   * under the License.                                           *
18   ****************************************************************/
19  
20  
21  package org.apache.james.postage.client;
22  
23  import org.apache.james.postage.SamplingException;
24  import org.apache.james.postage.StartupException;
25  import org.apache.james.postage.mail.HeaderConstants;
26  import org.apache.james.postage.configuration.MailSender;
27  import org.apache.james.postage.execution.Sampler;
28  import org.apache.james.postage.result.MailProcessingRecord;
29  import org.apache.james.postage.result.PostageRunnerResult;
30  import org.apache.james.postage.user.UserList;
31  
32  import javax.mail.Message;
33  import javax.mail.MessagingException;
34  import javax.mail.Session;
35  import javax.mail.Transport;
36  import javax.mail.internet.InternetAddress;
37  import java.util.Properties;
38  
39  /***
40   * connects as a SMTP client and handles all mail according to its configuration.<br/>
41   * it is threadsafe and reentrant and thus can be reused over multiple parallel client session<br/>
42   */
43  public class SMTPClient implements Sampler {
44  
45      private String m_host;
46      private int m_port;
47      private UserList m_internalUsers;
48      private UserList m_externalUsers;
49      private PostageRunnerResult m_results;
50      private MailSender m_mailSender;
51  
52      public SMTPClient(String host, int port, UserList internalUsers, UserList externalUsers, PostageRunnerResult results, MailSender mailSender) {
53          m_host = host;
54          m_port = port;
55          m_internalUsers = internalUsers;
56          m_externalUsers = externalUsers;
57          m_mailSender = mailSender;
58          m_results = results;
59      }
60  
61      public boolean checkAvailability() throws StartupException {
62          try {
63  
64              MailProcessingRecord proformaMailProcessingRecord = new MailProcessingRecord();
65              Session session = getMailSession();
66              proformaMailProcessingRecord.setMailId(HeaderConstants.JAMES_POSTAGE_STARTUPCHECK_HEADER_ID);
67              Message message = m_mailSender.createMail(session, proformaMailProcessingRecord);
68              setMailFromAndTo(message, proformaMailProcessingRecord);
69              Transport.send(message);
70          } catch (Exception e) {
71              throw new StartupException("inbound SMTP service not available", e);
72          }
73          return true;
74      }
75  
76      private void setMailFromAndTo(Message message, MailProcessingRecord mailProcessingRecord) throws MessagingException {
77  
78          String senderUsername;
79          String senderMailAddress;
80          if (m_mailSender.getParentProfile().isSourceInternal()) {
81              senderUsername = m_internalUsers.getRandomUsername();
82          } else {
83              senderUsername = m_externalUsers.getRandomUsername();
84          }
85          if (m_mailSender.getParentProfile().isSourceInternal()) {
86              senderMailAddress = m_internalUsers.getEmailAddress(senderUsername);
87          } else {
88              senderMailAddress = m_externalUsers.getEmailAddress(senderUsername);
89          }
90          mailProcessingRecord.setSender(senderUsername);
91          mailProcessingRecord.setSenderMailAddress(senderMailAddress);
92          message.setFrom(new InternetAddress(senderMailAddress));
93  
94          String recepientUsername;
95          String recepientMailAddress;
96          if (m_mailSender.getParentProfile().isTargetInternal()) {
97              recepientUsername = m_internalUsers.getRandomUsername();
98          } else {
99              recepientUsername = m_externalUsers.getRandomUsername();
100         }
101         if (m_mailSender.getParentProfile().isTargetInternal()) {
102             recepientMailAddress = m_internalUsers.getEmailAddress(recepientUsername);
103         } else {
104             recepientMailAddress = m_externalUsers.getEmailAddress(recepientUsername);
105         }
106         mailProcessingRecord.setReceiver(recepientUsername);
107         mailProcessingRecord.setReceiverMailAddress(recepientMailAddress);
108         message.addRecipient(Message.RecipientType.TO, new InternetAddress(recepientMailAddress));
109     }
110 
111     public synchronized void doSample() throws SamplingException {
112 
113         MailProcessingRecord mailProcessingRecord = new MailProcessingRecord();
114         mailProcessingRecord.setMailId(MailProcessingRecord.getNextId());
115         m_results.addNewMailRecord(mailProcessingRecord);
116         mailProcessingRecord.setTimeConnectStart(System.currentTimeMillis());
117 
118         Message message = null;
119         try {
120             try {
121                 Session session = getMailSession();
122                 message = m_mailSender.createMail(session, mailProcessingRecord);
123             } catch (Exception e) {
124                 mailProcessingRecord.setErrorTextSending("Could not send mail");
125                 throw e;
126             }
127             try {
128                 setMailFromAndTo(message, mailProcessingRecord);
129             } catch (Exception e) {
130                 mailProcessingRecord.setErrorTextSending("Could not set recipient");
131                 throw e;
132             }
133             try {
134                 mailProcessingRecord.setTimeSendStart(System.currentTimeMillis());
135                 Transport.send(message);
136                 mailProcessingRecord.setTimeSendEnd(System.currentTimeMillis());
137             } catch (MessagingException e) {
138                 mailProcessingRecord.setErrorTextSending("Could not be transported.");
139                 throw e;
140             }
141         } catch (Exception e) {
142             throw new SamplingException("sample failed", e);
143         }
144     }
145 
146     private Session getMailSession() {
147         Properties props = System.getProperties();
148         props.put("mail.smtp.host", m_host);
149         props.put("mail.smtp.port", Integer.toString(m_port));
150         return Session.getDefaultInstance(props, null);
151     }
152 }