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