View Javadoc

1   /**
2    *
3    *  Licensed to the Apache Software Foundation (ASF) under one or more
4    *  contributor license agreements.  See the NOTICE file distributed with
5    *  this work for additional information regarding copyright ownership.
6    *  The ASF licenses this file to You under the Apache License, Version 2.0
7    *  (the "License"); you may not use this file except in compliance with
8    *  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, software
13   *  distributed under the License is distributed on an "AS IS" BASIS,
14   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   *  See the License for the specific language governing permissions and
16   *  limitations under the License.
17   */
18  package org.apache.geronimo.mail;
19  
20  import java.util.Properties;
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  
25  import org.apache.geronimo.gbean.GBeanInfo;
26  import org.apache.geronimo.gbean.GBeanInfoBuilder;
27  
28  /**
29   * A GBean that provides for the configuration of a JavaMail SMTP transport
30   * protocol.
31   * <p/>
32   * SMTP transport properties that are common to all SMTP transports are
33   * provided via member variables of this class.  Values that are set in the
34   * individual member variables will override any of the corresponding values
35   * that have been set in the properties set.
36   *
37   * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $
38   * @see MailGBean
39   */
40  public class SMTPTransportGBean extends ProtocolGBean {
41  
42      // the SMTP configuration property names
43      static public final String SMTP_PORT = "mail.smtp.port";
44      static public final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout";
45      static public final String SMTP_TIMEOUT = "mail.smtp.timeout";
46      static public final String SMTP_FROM = "mail.smtp.from";
47      static public final String SMTP_AUTH = "mail.smtp.auth";
48      static public final String SMTP_REALM = "mail.smtp.sasl.realm";
49      static public final String SMTP_QUITWAIT = "mail.smtp.quitwait";
50      static public final String SMTP_FACTORY_CLASS = "mail.smtp.socketFactory.class";
51      static public final String SMTP_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback";
52      static public final String SMTP_FACTORY_PORT = "mail.smtp.socketFactory.port";
53      static public final String SMTP_LOCALHOST = "mail.smtp.localhost";
54      static public final String SMTP_LOCALADDRESS = "mail.smtp.localaddress";
55      static public final String SMTP_LOCALPORT = "mail.smtp.localport";
56      static public final String SMTP_EHLO = "mail.smtp.ehlo";
57      static public final String SMTP_SUBMITTER = "mail.smtp.submitter";
58      static public final String SMTP_DSN_NOTIFY = "mail.smtp.dsn.notify";
59      static public final String SMTP_DSN_RET = "mail.smtp.dsn.ret";
60      static public final String SMTP_8BITMIME = "mail.smtp.allow8bitmime";
61      static public final String SMTP_SEND_PARTIAL = "mail.smtp.sendpartial";
62      static public final String SMTP_REPORT_SUCCESS = "mail.smtp.reportsuccess";
63      static public final String SMTP_MAIL_EXTENSION = "mail.smtp.mailextension";
64      static public final String SMTP_STARTTLS_ENABLE = "mail.smtp.starttls.enable";
65  
66      static public final String GBEAN_EHLO = "ehlo";
67      static public final String GBEAN_SUBMITTER = "submitter";
68      static public final String GBEAN_DSN_NOTIFY = "dsnNotify";
69      static public final String GBEAN_DSN_RET = "dsnRet";
70      static public final String GBEAN_8BITMIME = "allow8bitmime";
71      static public final String GBEAN_SEND_PARTIAL = "sendPartical";
72      static public final String GBEAN_REPORT_SUCCESS = "reportSuccess";
73      static public final String GBEAN_MAIL_EXTENSION = "mailExtension";
74  static public final String GBEAN_STARTTLS_ENABLE = "startTLSEnable";
75  
76  
77      private final Log log = LogFactory.getLog(SMTPTransportGBean.class);
78  
79      private Integer port;
80      private Integer connectionTimeout;
81      private Integer timeout;
82      private String from;
83      private String localhost;
84      private String localaddress;
85      private Integer localport;
86      private Boolean ehlo;
87      private Boolean auth;
88      private String submitter;
89      private String dsnNotify;
90      private String dsnRet;
91      private Boolean allow8bitmime;
92      private Boolean sendPartial;
93      private String saslRealm;
94      private Boolean quitWait;
95      private Boolean reportSuccess;
96      private String socketFactoryClass;
97      private Boolean socketFactoryFallback;
98      private Integer socketFactoryPort;
99      private String mailExtension;
100     private Boolean startTLSEnable;
101 
102 
103     /**
104      * Construct an instance of SMTPTransportGBean
105      * <p/>
106      * Values that are set in the individual member variables will override any of
107      * the corresponding values that have been set in the properties set.
108      *
109      * @param objectName            the object name of the protocol
110      * @param properties            the set of default properties for the protocol
111      * @param host                  the host the protocol connects to
112      * @param user                  the default name for the protocol
113      * @param port                  the SMTP server port
114      * @param connectionTimeout     the socket connection timeout value in milliseconds
115      * @param timeout               the socket I/O timeout value in milliseconds
116      * @param from                  the email address to use for SMTP MAIL command
117      * @param localhost             the local host name used in the SMTP HELO or EHLO command
118      * @param localaddress          the local address (host name) to bind to when creating the SMTP socket
119      * @param localport             the local port number to bind to when creating the SMTP socket
120      * @param ehlo                  whether an attempt will be made to sign on with the EHLO command
121      * @param auth                  whether an attempt will be made to authenticate the user using
122      *                              the AUTH command
123      * @param startTLSEnable          the flag that enables the use of the STARTTLS command (if supported by the server) to switch the connection to a TLS-protected connection before issuing any login commands
124      * @param submitter             the submitter to use in the AUTH tag in the MAIL FROM command
125      * @param dsnNotify             the NOTIFY option to the RCPT command
126      * @param dsnRet                the RET option to the MAIL command
127      * @param allow8bitmime         whether encodings are converted to use "8bit" under certain
128      *                              conditions
129      * @param sendPartial           whether to send email to valid addresses when others are invalid
130      * @param saslRealm             the realm to use with DIGEST-MD5 authentication
131      * @param quitWait              whether the transport will wait for the response to the QUIT command
132      * @param reportSuccess         whether the transport will include an SMTPAddressSucceededException
133      *                              for each address that is successful
134      * @param socketFactoryClass    the class that will be used to create SMTP sockets
135      * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
136      *                              socket factory class cannot be created
137      * @param socketFactoryPort     whether java.net.Socket class will be created if the specified
138      *                              socket factory class cannot be created
139      * @param mailExtension         the extension string to append to the MAIL command
140      */
141     public SMTPTransportGBean(String objectName, Properties properties, String host, String user,
142                               Integer port,
143                               Integer connectionTimeout,
144                               Integer timeout,
145                               String from,
146                               String localhost,
147                               String localaddress,
148                               Integer localport,
149                               Boolean ehlo,
150                               Boolean auth,
151                               Boolean startTLSEnable,
152                               String submitter,
153                               String dsnNotify,
154                               String dsnRet,
155                               Boolean allow8bitmime,
156                               Boolean sendPartial,
157                               String saslRealm,
158                               Boolean quitWait,
159                               Boolean reportSuccess,
160                               String socketFactoryClass,
161                               Boolean socketFactoryFallback,
162                               Integer socketFactoryPort,
163                               String mailExtension) {
164         super(objectName, "smtp", properties, host, user);
165 
166         setPort(port);
167         setConnectionTimeout(connectionTimeout);
168         setTimeout(timeout);
169         setFrom(from);
170         setLocalhost(localhost);
171         setLocaladdress(localaddress);
172         setLocalport(localport);
173         setEhlo(ehlo);
174         setAuth(auth);
175         setStartTLSEnable(startTLSEnable);
176         setSubmitter(submitter);
177         setDsnNotify(dsnNotify);
178         setDsnRet(dsnRet);
179         setAllow8bitmime(allow8bitmime);
180         setSendPartial(sendPartial);
181         setSaslRealm(saslRealm);
182         setQuitWait(quitWait);
183         setReportSuccess(reportSuccess);
184         setSocketFactoryClass(socketFactoryClass);
185         setSocketFactoryFallback(socketFactoryFallback);
186         setSocketFactoryPort(socketFactoryPort);
187         setMailExtension(mailExtension);
188     }
189 
190     /**
191      * Returns the SMTP server port to connect to, if the connect() method
192      * doesn't explicitly specify one.
193      */
194     public Integer getPort() {
195         return port;
196     }
197 
198     /**
199      * Sets the SMTP server port to connect to, if the connect() method
200      * doesn't explicitly specify one.
201      * <p/>
202      * Defaults to 25.
203      * <p/>
204      * Values that are set here will override any of the corresponding value
205      * that has been set in the properties.
206      *
207      * @param port the SMTP server port to connect to
208      */
209     public void setPort(Integer port) {
210         this.port = port;
211     }
212 
213     /**
214      * Returns the socket connection timeout value in milliseconds.
215      */
216     public Integer getConnectionTimeout() {
217         return connectionTimeout;
218     }
219 
220     /**
221      * Sets the socket connection timeout value in milliseconds.
222      * <p/>
223      * Default is infinite timeout.
224      * <p/>
225      * Values that are set here will override any of the corresponding value
226      * that has been set in the properties.
227      *
228      * @param connectionTimeout the socket connection timeout value in milliseconds.
229      */
230     public void setConnectionTimeout(Integer connectionTimeout) {
231         this.connectionTimeout = connectionTimeout;
232     }
233 
234     /**
235      * Returns the socket I/O timeout value in milliseconds.
236      */
237     public Integer getTimeout() {
238         return timeout;
239     }
240 
241     /**
242      * Sets the socket I/O timeout value in milliseconds.
243      * <p/>
244      * Default is infinite timeout.
245      * <p/>
246      * Values that are set here will override any of the corresponding value
247      * that has been set in the properties.
248      *
249      * @param timeout the socket I/O timeout value in milliseconds
250      */
251     public void setTimeout(Integer timeout) {
252         this.timeout = timeout;
253     }
254 
255     /**
256      * Returns the email address to use for SMTP MAIL command.
257      */
258     public String getFrom() {
259         return from;
260     }
261 
262     /**
263      * Sets the email address to use for SMTP MAIL command
264      * <p/>
265      * Email address to use for SMTP MAIL command. This sets the envelope
266      * return address. Defaults to msg.getFrom() or InternetAddress.getLocalAddress().
267      * NOTE: mail.smtp.user was previously used for this.
268      * <p/>
269      * Values that are set here will override any of the corresponding value
270      * that has been set in the properties.
271      *
272      * @param from the email address to use for SMTP MAIL command
273      */
274     public void setFrom(String from) {
275         this.from = from;
276     }
277 
278     /**
279      * Returns the local host name used in the SMTP HELO or EHLO command.
280      */
281     public String getLocalhost() {
282         return localhost;
283     }
284 
285     /**
286      * Sets the local host name used in the SMTP HELO or EHLO command.
287      * <p/>
288      * Local host name used in the SMTP HELO or EHLO command. Defaults to
289      * InetAddress.getLocalHost().getHostName(). Should not normally need to
290      * be set if your JDK and your name service are configured properly.
291      * <p/>
292      * Values that are set here will override any of the corresponding value
293      * that has been set in the properties.
294      *
295      * @param localhost the local host name used in the SMTP HELO or EHLO command
296      */
297     public void setLocalhost(String localhost) {
298         this.localhost = localhost;
299     }
300 
301     /**
302      * Returns the local address (host name) to bind to when creating the SMTP socket.
303      */
304     public String getLocaladdress() {
305         return localaddress;
306     }
307 
308     /**
309      * Sets the local address (host name) to bind to when creating the SMTP socket.
310      * <p/>
311      * Local address (host name) to bind to when creating the SMTP socket.
312      * Defaults to the address picked by the Socket class. Should not normally
313      * need to be set, but useful with multi-homed hosts where it's important
314      * to pick a particular local address to bind to.
315      * <p/>
316      * Values that are set here will override any of the corresponding value
317      * that has been set in the properties.
318      *
319      * @param localaddress the local address (host name) to bind to when creating the SMTP socket
320      */
321     public void setLocaladdress(String localaddress) {
322         this.localaddress = localaddress;
323     }
324 
325     /**
326      * Returns the local port number to bind to when creating the SMTP socket.
327      */
328     public Integer getLocalport() {
329         return localport;
330     }
331 
332     /**
333      * Sets the local port number to bind to when creating the SMTP socket.
334      * <p/>
335      * Local port number to bind to when creating the SMTP socket. Defaults to
336      * the port number picked by the Socket class.
337      * <p/>
338      * Values that are set here will override any of the corresponding value
339      * that has been set in the properties.
340      *
341      * @param localport the local port number to bind to when creating the SMTP socket
342      */
343     public void setLocalport(Integer localport) {
344         this.localport = localport;
345     }
346 
347     /**
348      * Returns whether an attempt will be made to sign on with the EHLO command.
349      * <p/>
350      * If false, do not attempt to sign on with the EHLO command. Normally
351      * failure of the EHLO command will fallback to the HELO command; this
352      * property exists only for servers that don't fail EHLO properly or don't
353      * implement EHLO properly.
354      */
355     public Boolean getEhlo() {
356         return ehlo;
357     }
358 
359     /**
360      * Set whether an attempt will be made to sign on with the EHLO command.
361      * <p/>
362      * If false, do not attempt to sign on with the EHLO command. Normally
363      * failure of the EHLO command will fallback to the HELO command; this
364      * property exists only for servers that don't fail EHLO properly or don't
365      * implement EHLO properly.
366      * <p/>
367      * Values that are set here will override any of the corresponding value
368      * that has been set in the properties.
369      *
370      * @param ehlo whether an attempt will be made to sign on with the EHLO command
371      */
372     public void setEhlo(Boolean ehlo) {
373         this.ehlo = ehlo;
374     }
375 
376     /**
377      * Returns whether an attempt will be made to authenticate the user using
378      * the AUTH command.
379      * <p/>
380      * Defaults to false.
381      */
382     public Boolean getAuth() {
383         return auth;
384     }
385 
386     /**
387      * Sets whether an attempt will be made to authenticate the user using
388      * the AUTH command.
389      * <p/>
390      * Defaults to false.
391      * <p/>
392      * Values that are set here will override any of the corresponding value
393      * that has been set in the properties.
394      *
395      * @param auth whether an attempt will be made to authenticate the user using
396      *             the AUTH command.
397      */
398     public void setAuth(Boolean auth) {
399         this.auth = auth;
400     }
401 
402     /**
403      * Returns the flag that enables the use of the STARTTLS command (if
404      * supported by the server) to switch the connection to a TLS-protected
405      * connection before issuing any login commands.
406      * <p/>
407      * If true, enables the use of the STARTTLS command (if supported by the
408      * server) to switch the connection to a TLS-protected connection before
409      * issuing any login commands. Note that an appropriate trust store must
410      * configured so that the client will trust the server's certificate.
411      * This feature only works on J2SE 1.4 and newer systems. Default is false.
412      */
413     public Boolean getStartTLSEnable() {
414         return startTLSEnable;
415     }
416 
417     /**
418      * Sets the flag that enables the use of the STARTTLS command (if
419      * supported by the server) to switch the connection to a TLS-protected
420      * connection before issuing any login commands.
421      * <p/>
422      * If true, enables the use of the STARTTLS command (if supported by the
423      * server) to switch the connection to a TLS-protected connection before
424      * issuing any login commands. Note that an appropriate trust store must
425      * configured so that the client will trust the server's certificate.
426      * This feature only works on J2SE 1.4 and newer systems. Default is false.
427      * <p/>
428      * Values that are set here will override any of the corresponding value
429      * that has been set in the properties.
430      *
431      * @param startTLSEnable the flag that enables the use of the STARTTLS command (if
432      *                       supported by the server) to switch the connection to a TLS-protected
433      *                       connection before issuing any login commands
434      */
435     public void setStartTLSEnable(Boolean startTLSEnable) {
436         this.startTLSEnable = startTLSEnable;
437     }
438 
439     /**
440      * Returns the submitter to use in the AUTH tag in the MAIL FROM command.
441      * <p/>
442      * Typically used by a mail relay to pass along information about the
443      * original submitter of the message. See also the setSubmitter method of
444      * SMTPMessage. Mail clients typically do not use this.
445      */
446     public String getSubmitter() {
447         return submitter;
448     }
449 
450     /**
451      * Sets the submitter to use in the AUTH tag in the MAIL FROM command.
452      * <p/>
453      * Typically used by a mail relay to pass along information about the
454      * original submitter of the message. See also the setSubmitter method of
455      * SMTPMessage. Mail clients typically do not use this.
456      * <p/>
457      * Values that are set here will override any of the corresponding value
458      * that has been set in the properties.
459      *
460      * @param submitter the submitter to use in the AUTH tag in the MAIL FROM command
461      */
462     public void setSubmitter(String submitter) {
463         this.submitter = submitter;
464     }
465 
466     /**
467      * Returns the NOTIFY option to the RCPT command.
468      * <p/>
469      * Either NEVER, or some combination of SUCCESS, FAILURE, and DELAY
470      * (separated by commas).
471      */
472     public String getDsnNotify() {
473         return dsnNotify;
474     }
475 
476     /**
477      * Sets the NOTIFY option to the RCPT command
478      * <p/>
479      * Either NEVER, or some combination of SUCCESS, FAILURE, and DELAY
480      * (separated by commas).
481      * <p/>
482      * Values that are set here will override any of the corresponding value
483      * that has been set in the properties.
484      *
485      * @param dsnNotify the NOTIFY option to the RCPT command
486      */
487     public void setDsnNotify(String dsnNotify) {
488         this.dsnNotify = dsnNotify;
489     }
490 
491     /**
492      * Returns the RET option to the MAIL command.
493      * <p/>
494      * Either FULL or HDRS.
495      */
496     public String getDsnRet() {
497         return dsnRet;
498     }
499 
500     /**
501      * Sets the RET option to the MAIL command
502      * <p/>
503      * Either FULL or HDRS.
504      * <p/>
505      * Values that are set here will override any of the corresponding value
506      * that has been set in the properties.
507      *
508      * @param dsnRet the RET option to the MAIL command
509      */
510     public void setDsnRet(String dsnRet) {
511         this.dsnRet = dsnRet;
512     }
513 
514     /**
515      * Returns whether encodings are converted to use "8bit" under certain
516      * conditions.
517      * <p/>
518      * If set to true, and the server supports the 8BITMIME extension, text
519      * parts of messages that use the "quoted-printable" or "base64" encodings
520      * are converted to use "8bit" encoding if they follow the RFC2045 rules
521      * for 8bit text.
522      */
523     public Boolean getAllow8bitmime() {
524         return allow8bitmime;
525     }
526 
527     /**
528      * Sets whether encodings are converted to use "8bit" under certain
529      * conditions.
530      * <p/>
531      * If set to true, and the server supports the 8BITMIME extension, text
532      * parts of messages that use the "quoted-printable" or "base64" encodings
533      * are converted to use "8bit" encoding if they follow the RFC2045 rules
534      * for 8bit text.
535      * <p/>
536      * Values that are set here will override any of the corresponding value
537      * that has been set in the properties.
538      *
539      * @param allow8bitmime whether encodings are converted to use "8bit" under certain
540      *                      conditions
541      */
542     public void setAllow8bitmime(Boolean allow8bitmime) {
543         this.allow8bitmime = allow8bitmime;
544     }
545 
546     /**
547      * Returns whether to send email to valid addresses when others are invalid.
548      * <p/>
549      * If set to true, and a message has some valid and some invalid addresses,
550      * send the message anyway, reporting the partial failure with a
551      * SendFailedException. If set to false (the default), the message is not
552      * sent to any of the recipients if there is an invalid recipient address.
553      */
554     public Boolean getSendPartial() {
555         return sendPartial;
556     }
557 
558     /**
559      * Sets whether to send email to valid addresses when others are invalid.
560      * <p/>
561      * If set to true, and a message has some valid and some invalid addresses,
562      * send the message anyway, reporting the partial failure with a
563      * SendFailedException. If set to false (the default), the message is not
564      * sent to any of the recipients if there is an invalid recipient address.
565      * <p/>
566      * Values that are set here will override any of the corresponding value
567      * that has been set in the properties.
568      *
569      * @param sendPartial whether to send email to valid addresses when others are invalid
570      */
571     public void setSendPartial(Boolean sendPartial) {
572         this.sendPartial = sendPartial;
573     }
574 
575     /**
576      * Returns the realm to use with DIGEST-MD5 authentication.
577      */
578     public String getSaslRealm() {
579         return saslRealm;
580     }
581 
582     /**
583      * Sets the realm to use with DIGEST-MD5 authentication.
584      * <p/>
585      * Values that are set here will override any of the corresponding value
586      * that has been set in the properties.
587      *
588      * @param saslRealm the realm to use with DIGEST-MD5 authentication
589      */
590     public void setSaslRealm(String saslRealm) {
591         this.saslRealm = saslRealm;
592     }
593 
594     /**
595      * Returns whether the transport will wait for the response to the QUIT command.
596      * <p/>
597      * If set to true, causes the transport to wait for the response to the QUIT
598      * command. If set to false (the default), the QUIT command is sent and the
599      * connection is immediately closed.
600      */
601     public Boolean getQuitWait() {
602         return quitWait;
603     }
604 
605     /**
606      * Sets whether the transport will wait for the response to the QUIT command
607      * <p/>
608      * If set to true, causes the transport to wait for the response to the QUIT
609      * command. If set to false (the default), the QUIT command is sent and the
610      * connection is immediately closed.
611      * <p/>
612      * Values that are set here will override any of the corresponding value
613      * that has been set in the properties.
614      *
615      * @param quitWait whether the transport will wait for the response to the QUIT command
616      */
617     public void setQuitWait(Boolean quitWait) {
618         this.quitWait = quitWait;
619     }
620 
621     /**
622      * Returns whether the transport will include an SMTPAddressSucceededException
623      * for each address that is successful.
624      * <p/>
625      * Note also that this will cause a SendFailedException to be thrown from
626      * the sendMessage method of SMTPTransport even if all addresses were
627      * correct and the message was sent successfully.
628      */
629     public Boolean getReportSuccess() {
630         return reportSuccess;
631     }
632 
633     /**
634      * Sets whether the transport will include an SMTPAddressSucceededException
635      * for each address that is successful.
636      * <p/>
637      * Note also that this will cause a SendFailedException to be thrown from
638      * the sendMessage method of SMTPTransport even if all addresses were
639      * correct and the message was sent successfully.
640      * <p/>
641      * Values that are set here will override any of the corresponding value
642      * that has been set in the properties.
643      *
644      * @param reportSuccess whether the transport will include an SMTPAddressSucceededException
645      *                      for each address that is successful
646      */
647     public void setReportSuccess(Boolean reportSuccess) {
648         this.reportSuccess = reportSuccess;
649     }
650 
651     /**
652      * Returns the class that will be used to create SMTP sockets.
653      * <p/>
654      * If set, specifies the name of a class that implements the
655      * javax.net.SocketFactory interface. This class will be used to create SMTP
656      * sockets.
657      */
658     public String getSocketFactoryClass() {
659         return socketFactoryClass;
660     }
661 
662     /**
663      * Sets the class that will be used to create SMTP sockets.
664      * <p/>
665      * If set, specifies the name of a class that implements the
666      * javax.net.SocketFactory interface. This class will be used to create SMTP
667      * sockets.
668      * <p/>
669      * Values that are set here will override any of the corresponding value
670      * that has been set in the properties.
671      *
672      * @param socketFactoryClass the class that will be used to create SMTP sockets
673      */
674     public void setSocketFactoryClass(String socketFactoryClass) {
675         this.socketFactoryClass = socketFactoryClass;
676     }
677 
678     /**
679      * Returns whether java.net.Socket class will be created if the specified
680      * socket factory class cannot be created.
681      * <p/>
682      * If set to true, failure to create a socket using the specified socket
683      * factory class will cause the socket to be created using the
684      * java.net.Socket class. Defaults to true.
685      */
686     public Boolean getSocketFactoryFallback() {
687         return socketFactoryFallback;
688     }
689 
690     /**
691      * Sets whether java.net.Socket class will be created if the specified
692      * socket factory class cannot be created.
693      * <p/>
694      * If set to true, failure to create a socket using the specified socket
695      * factory class will cause the socket to be created using the
696      * java.net.Socket class. Defaults to true.
697      * <p/>
698      * Values that are set here will override any of the corresponding value
699      * that has been set in the properties.
700      *
701      * @param socketFactoryFallback whether java.net.Socket class will be created if the specified
702      *                              socket factory class cannot be created
703      */
704     public void setSocketFactoryFallback(Boolean socketFactoryFallback) {
705         this.socketFactoryFallback = socketFactoryFallback;
706     }
707 
708     /**
709      * Returns the port to connect to when using the specified socket factory.
710      * <p/>
711      * Specifies the port to connect to when using the specified socket
712      * factory. If not set, the default port will be used.
713      */
714     public Integer getSocketFactoryPort() {
715         return socketFactoryPort;
716     }
717 
718     /**
719      * Sets the port to connect to when using the specified socket factory.
720      * <p/>
721      * Specifies the port to connect to when using the specified socket
722      * factory. If not set, the default port will be used.
723      * <p/>
724      * Values that are set here will override any of the corresponding value
725      * that has been set in the properties.
726      *
727      * @param socketFactoryPort the port to connect to when using the specified socket factory
728      */
729     public void setSocketFactoryPort(Integer socketFactoryPort) {
730         this.socketFactoryPort = socketFactoryPort;
731     }
732 
733     /**
734      * Returns the extension string to append to the MAIL command.
735      * <p/>
736      * Extension string to append to the MAIL command. The extension string
737      * can be used to specify standard SMTP service extensions as well as
738      * vendor-specific extensions. Typically the application should use the
739      * SMTPTransport method supportsExtension to verify that the server
740      * supports the desired service extension. See RFC 1869 and other RFCs
741      * that define specific extensions.
742      */
743     public String getMailExtension() {
744         return mailExtension;
745     }
746 
747     /**
748      * Sets the extension string to append to the MAIL command.
749      * <p/>
750      * Extension string to append to the MAIL command. The extension string
751      * can be used to specify standard SMTP service extensions as well as
752      * vendor-specific extensions. Typically the application should use the
753      * SMTPTransport method supportsExtension to verify that the server
754      * supports the desired service extension. See RFC 1869 and other RFCs
755      * that define specific extensions.
756      * <p/>
757      * Values that are set here will override any of the corresponding value
758      * that has been set in the properties.
759      *
760      * @param mailExtension the extension string to append to the MAIL command
761      */
762     public void setMailExtension(String mailExtension) {
763         this.mailExtension = mailExtension;
764     }
765 
766     /**
767      * Add the overrides from the member variables to the properties file.
768      */
769     public void addOverrides(Properties props) {
770         super.addOverrides(props);
771 
772         if (port != null) props.setProperty(SMTP_PORT, port.toString());
773         if (connectionTimeout != null) props.setProperty(SMTP_CONNECTION_TIMEOUT, connectionTimeout.toString());
774         if (timeout != null) props.setProperty(SMTP_TIMEOUT, timeout.toString());
775         if (from != null) props.setProperty(SMTP_FROM, from);
776         if (localhost != null) props.setProperty(SMTP_LOCALHOST, localhost);
777         if (localaddress != null) props.setProperty(SMTP_LOCALADDRESS, localaddress);
778         if (localport != null) props.setProperty(SMTP_LOCALPORT, localport.toString());
779         if (ehlo != null) props.setProperty(SMTP_EHLO, ehlo.toString());
780         if (auth != null) props.setProperty(SMTP_AUTH, auth.toString());
781         if (startTLSEnable != null) props.setProperty(SMTP_STARTTLS_ENABLE, startTLSEnable.toString());
782         if (submitter != null) props.setProperty(SMTP_SUBMITTER, submitter);
783         if (dsnNotify != null) props.setProperty(SMTP_DSN_NOTIFY, dsnNotify);
784         if (dsnRet != null) props.setProperty(SMTP_DSN_RET, dsnRet);
785         if (allow8bitmime != null) props.setProperty(SMTP_8BITMIME, allow8bitmime.toString());
786         if (sendPartial != null) props.setProperty(SMTP_SEND_PARTIAL, sendPartial.toString());
787         if (saslRealm != null) props.setProperty(SMTP_REALM, saslRealm);
788         if (quitWait != null) props.setProperty(SMTP_QUITWAIT, quitWait.toString());
789         if (reportSuccess != null) props.setProperty(SMTP_REPORT_SUCCESS, reportSuccess.toString());
790         if (socketFactoryClass != null) props.setProperty(SMTP_FACTORY_CLASS, socketFactoryClass);
791         if (socketFactoryFallback != null) props.setProperty(SMTP_FACTORY_FALLBACK, socketFactoryFallback.toString());
792         if (socketFactoryPort != null) props.setProperty(SMTP_FACTORY_PORT, socketFactoryPort.toString());
793         if (mailExtension != null) props.setProperty(SMTP_MAIL_EXTENSION, mailExtension);
794     }
795 
796     public void doStart() throws Exception {
797         log.debug("Started " + getObjectName());
798     }
799 
800     public void doStop() throws Exception {
801         log.debug("Stopped " + getObjectName());
802     }
803 
804     public void doFail() {
805         log.warn("Failed " + getObjectName());
806     }
807 
808     public static final GBeanInfo GBEAN_INFO;
809 
810     static {
811         GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(SMTPTransportGBean.class);
812 
813         infoFactory.addAttribute(GBEAN_PORT, Integer.class, true);
814         infoFactory.addAttribute(GBEAN_CONNECTION_TIMEOUT, Integer.class, true);
815         infoFactory.addAttribute(GBEAN_TIMEOUT, Integer.class, true);
816         infoFactory.addAttribute(GBEAN_AUTH, Boolean.class, true);
817         infoFactory.addAttribute(GBEAN_STARTTLS_ENABLE, Boolean.class, true);
818         infoFactory.addAttribute(GBEAN_EHLO, Boolean.class, true);
819         infoFactory.addAttribute(GBEAN_FROM, String.class, true);
820         infoFactory.addAttribute(GBEAN_LOCALHOST, String.class, true);
821         infoFactory.addAttribute(GBEAN_LOCALADDRESS, String.class, true);
822         infoFactory.addAttribute(GBEAN_LOCALPORT, Integer.class, true);
823         infoFactory.addAttribute(GBEAN_REALM, String.class, true);
824         infoFactory.addAttribute(GBEAN_QUITWAIT, Boolean.class, true);
825         infoFactory.addAttribute(GBEAN_FACTORY_CLASS, String.class, true);
826         infoFactory.addAttribute(GBEAN_FACTORY_FALLBACK, Boolean.class, true);
827         infoFactory.addAttribute(GBEAN_FACTORY_PORT, Integer.class, true);
828 
829         infoFactory.addAttribute(GBEAN_SUBMITTER, String.class, true);
830         infoFactory.addAttribute(GBEAN_DSN_NOTIFY, String.class, true);
831         infoFactory.addAttribute(GBEAN_DSN_RET, String.class, true);
832         infoFactory.addAttribute(GBEAN_8BITMIME, Boolean.class, true);
833         infoFactory.addAttribute(GBEAN_SEND_PARTIAL, Boolean.class, true);
834         infoFactory.addAttribute(GBEAN_REPORT_SUCCESS, Boolean.class, true);
835         infoFactory.addAttribute(GBEAN_MAIL_EXTENSION, String.class, true);
836 
837         infoFactory.addAttribute(GBEAN_OBJECTNAME, String.class, false);
838         infoFactory.addAttribute(GBEAN_PROTOCOL, String.class, true);
839         infoFactory.addAttribute(GBEAN_PROPERTIES, Properties.class, true);
840         infoFactory.addAttribute(GBEAN_HOST, String.class, true);
841         infoFactory.addAttribute(GBEAN_USER, String.class, true);
842         infoFactory.addOperation(GBEAN_ADD_OVERRIDES, new Class[]{Properties.class});
843 
844         infoFactory.setConstructor(new String[]{GBEAN_OBJECTNAME, GBEAN_PROPERTIES, GBEAN_HOST, GBEAN_USER,
845                                                 GBEAN_PORT,
846                                                 GBEAN_CONNECTION_TIMEOUT,
847                                                 GBEAN_TIMEOUT,
848                                                 GBEAN_FROM,
849                                                 GBEAN_LOCALHOST,
850                                                 GBEAN_LOCALADDRESS,
851                                                 GBEAN_LOCALPORT,
852                                                 GBEAN_EHLO,
853                                                 GBEAN_AUTH,
854                                                 GBEAN_STARTTLS_ENABLE,
855                                                 GBEAN_SUBMITTER,
856                                                 GBEAN_DSN_NOTIFY,
857                                                 GBEAN_DSN_RET,
858                                                 GBEAN_8BITMIME,
859                                                 GBEAN_SEND_PARTIAL,
860                                                 GBEAN_REALM,
861                                                 GBEAN_QUITWAIT,
862                                                 GBEAN_REPORT_SUCCESS,
863                                                 GBEAN_FACTORY_CLASS,
864                                                 GBEAN_FACTORY_FALLBACK,
865                                                 GBEAN_FACTORY_PORT,
866                                                 GBEAN_MAIL_EXTENSION});
867 
868         GBEAN_INFO = infoFactory.getBeanInfo();
869     }
870 
871     public static GBeanInfo getGBeanInfo() {
872         return GBEAN_INFO;
873     }
874 }