diff --git a/common/source/java/ch/systemsx/cisd/common/mail/JavaMailProperties.java b/common/source/java/ch/systemsx/cisd/common/mail/JavaMailProperties.java index d99365ab76d6b6127fc2b6d2c21b9cc1472d3322..2e294b389e44e3aeaf5c3b1e5a80320b7ce22c07 100644 --- a/common/source/java/ch/systemsx/cisd/common/mail/JavaMailProperties.java +++ b/common/source/java/ch/systemsx/cisd/common/mail/JavaMailProperties.java @@ -38,12 +38,15 @@ public final class JavaMailProperties /** The return email address of the current user. */ public static final String MAIL_FROM = "mail.from"; - /** The default host name of the mail server for Transports. */ + /** The host name of the mail server for Transports. */ public static final String MAIL_SMTP_HOST = "mail.smtp.host"; - /** The default user name to use when connecting to the mail server. */ - public static final String MAIL_SMTP_USER = "mail.smtp.user"; + /** The host port of the mail server for Transports. */ + public static final String MAIL_SMTP_PORT = "mail.smtp.port"; + /** The user name to use when connecting to the mail server. */ + public static final String MAIL_SMTP_USER = "mail.smtp.user"; + /** Whether authentication is needed when connecting to the mail server. */ public static final String MAIL_SMTP_AUTH = "mail.smtp.auth"; diff --git a/common/source/java/ch/systemsx/cisd/common/mail/MailClient.java b/common/source/java/ch/systemsx/cisd/common/mail/MailClient.java index df83a40cf1b3a735d93a584b8d8d98fe59651465..180e13d10142021fa3cd904f04c8efed49dcbe94 100644 --- a/common/source/java/ch/systemsx/cisd/common/mail/MailClient.java +++ b/common/source/java/ch/systemsx/cisd/common/mail/MailClient.java @@ -40,7 +40,6 @@ import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; -import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; @@ -48,6 +47,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.filesystem.FileUtilities; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.common.shared.basic.string.StringUtils; /** * A small mail client that simplifies the sending of emails using of <i>JavaMail API</i>. @@ -73,82 +73,68 @@ public final class MailClient extends Authenticator implements IMailClient private static final String UNICODE_CHARSET = "utf-8"; - private static final Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, MailClient.class); - - private final String smtpUsername; - - private final String smtpPassword; - - private final String smtpHost; - - private final String from; - - private final String testAddress; - + private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, MailClient.class); + + private final Properties properties; + public MailClient(final String from, final String smtpHost) { - this(from, smtpHost, null, null, null); + properties = new Properties(); + properties.put(JavaMailProperties.MAIL_FROM, from); + properties.put(JavaMailProperties.MAIL_SMTP_HOST, smtpHost); + init(); } - + public MailClient(MailClientParameters parameters) { - this(parameters.getFrom(), parameters.getSmtpHost(), parameters.getSmtpUser(), parameters - .getSmtpPassword(), null); + this.properties = parameters.getPropertiesInstance(); + init(); } - + public MailClient(Properties properties) { - this(properties.getProperty(JavaMailProperties.MAIL_FROM), properties - .getProperty(JavaMailProperties.MAIL_SMTP_HOST), properties - .getProperty(JavaMailProperties.MAIL_SMTP_USER), properties - .getProperty(MAIL_SMTP_PASSWORD), properties.getProperty(MAIL_TEST_ADDRESS)); - } - - public MailClient(final String from, final String smtpHost, final String smtpUsername, - final String smtpPassword, final String testAddress) - { - assert from != null; - assert smtpHost != null; - - this.from = from; - this.smtpHost = smtpHost; - this.smtpUsername = smtpUsername; - this.smtpPassword = smtpPassword; - this.testAddress = testAddress; + this.properties = properties; + init(); } - - private final Properties createProperties() - { - Properties properties = null; - try + + private void init() { + //Add some properties that don't need to come form the service + String smtpUsername = properties.getProperty(JavaMailProperties.MAIL_SMTP_USER); + String smtpPassword = properties.getProperty(MailClient.MAIL_SMTP_PASSWORD); + if (StringUtils.isNotBlank(smtpUsername) && StringUtils.isNotBlank(smtpPassword)) { - properties = new Properties(System.getProperties()); - } catch (SecurityException ex) - { - properties = new Properties(); + properties.put(JavaMailProperties.MAIL_SMTP_AUTH, Boolean.TRUE.toString()); } - if (smtpUsername != null) + + properties.put(JavaMailProperties.MAIL_DEBUG,operationLog.isDebugEnabled() ? Boolean.TRUE.toString() : Boolean.FALSE.toString()); + properties.put(JavaMailProperties.MAIL_TRANSPORT_PROTOCOL, "smtp"); + + //Get properties from System + try { - properties.put(JavaMailProperties.MAIL_SMTP_USER, smtpUsername); - } - if (smtpHost != null) + Properties systemProperties = System.getProperties(); + for(String key:systemProperties.stringPropertyNames()) { + if(!properties.containsKey(key)) { + properties.put(key, systemProperties.getProperty(key)); + } + } + } catch (SecurityException ex) { - properties.put(JavaMailProperties.MAIL_SMTP_HOST, smtpHost); + operationLog.error("System properties can't be read", ex); } - if (StringUtils.isNotBlank(smtpPassword) && StringUtils.isNotBlank(smtpUsername)) - { - properties.put(JavaMailProperties.MAIL_SMTP_AUTH, Boolean.TRUE.toString()); + + //Clear all properties not staring with mail. + for(String key:properties.stringPropertyNames()) { + if(!key.startsWith("mail.")) { + properties.remove(key); + } } - properties.put(JavaMailProperties.MAIL_DEBUG, operationLog.isDebugEnabled() ? Boolean.TRUE - .toString() : Boolean.FALSE.toString()); - properties.put(JavaMailProperties.MAIL_TRANSPORT_PROTOCOL, "smtp"); - return properties; } @Override public void sendTestEmail() { + String testAddress = properties.getProperty(MailClient.MAIL_TEST_ADDRESS); if (testAddress != null) { if (operationLog.isInfoEnabled()) @@ -169,14 +155,11 @@ public final class MailClient extends Authenticator implements IMailClient private final Session createSession() { - Properties properties = createProperties(); if (operationLog.isDebugEnabled()) { - operationLog.debug("Creating mail session with following properties '" + properties - + "'."); + operationLog.debug("Creating mail session with following properties '" + properties + "'."); } - boolean mailSmtpAuth = - Boolean.parseBoolean(properties.getProperty(JavaMailProperties.MAIL_SMTP_AUTH)); + boolean mailSmtpAuth = Boolean.parseBoolean(properties.getProperty(JavaMailProperties.MAIL_SMTP_AUTH)); Session session = Session.getInstance(properties, mailSmtpAuth ? this : null); session.setDebug(operationLog.isDebugEnabled()); return session; @@ -243,8 +226,8 @@ public final class MailClient extends Authenticator implements IMailClient } try { - return new InternetAddress(addressOrNull.tryGetEmailAddress(), addressOrNull - .tryGetPersonalName()); + return new InternetAddress(addressOrNull.tryGetEmailAddress(), + addressOrNull.tryGetPersonalName()); } catch (Exception e) { operationLog.error("Could not parse address [" + addressOrNull + "].", e); @@ -373,6 +356,8 @@ public final class MailClient extends Authenticator implements IMailClient InternetAddress replyTo, InternetAddress fromOrNull, InternetAddress[] recipients) throws EnvironmentFailureException { + String from = properties.getProperty(JavaMailProperties.MAIL_FROM); + final InternetAddress fromPerMail = (fromOrNull != null) ? fromOrNull : createInternetAddress(from); if (operationLog.isInfoEnabled()) @@ -428,6 +413,8 @@ public final class MailClient extends Authenticator implements IMailClient private void send(MimeMessage msg) throws MessagingException { + String smtpHost = properties.getProperty(JavaMailProperties.MAIL_SMTP_HOST); + if (smtpHost.startsWith(FILE_PREFIX)) { // We don't have a real SMTP server @@ -442,6 +429,8 @@ public final class MailClient extends Authenticator implements IMailClient @SuppressWarnings("unchecked") private void writeMessageToFile(MimeMessage msg) throws MessagingException { + String smtpHost = properties.getProperty(JavaMailProperties.MAIL_SMTP_HOST); + File emailFolder = new File(smtpHost.substring(FILE_PREFIX.length())); if (emailFolder.exists()) { @@ -495,6 +484,9 @@ public final class MailClient extends Authenticator implements IMailClient @Override protected final PasswordAuthentication getPasswordAuthentication() { + String smtpUsername = properties.getProperty(JavaMailProperties.MAIL_SMTP_USER); + String smtpPassword = properties.getProperty(MailClient.MAIL_SMTP_PASSWORD); + return new PasswordAuthentication(smtpUsername, smtpPassword); } diff --git a/common/source/java/ch/systemsx/cisd/common/mail/MailClientParameters.java b/common/source/java/ch/systemsx/cisd/common/mail/MailClientParameters.java index 231c5f808000dc34b9fa09439a184439501efbe7..fd9442da073fb831d938f58b10447467b07bb2a9 100644 --- a/common/source/java/ch/systemsx/cisd/common/mail/MailClientParameters.java +++ b/common/source/java/ch/systemsx/cisd/common/mail/MailClientParameters.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.common.mail; import java.io.Serializable; +import java.util.Properties; /** * @author Franz-Josef Elmer @@ -33,6 +34,8 @@ public class MailClientParameters implements Serializable private String smtpHost; + private String smtpPort; + private String testAddress; public final String getFrom() @@ -84,7 +87,17 @@ public class MailClientParameters implements Serializable { this.smtpHost = smtpHost; } + + public String getSmtpPort() + { + return smtpPort; + } + public void setSmtpPort(String smtpPort) + { + this.smtpPort = smtpPort; + } + public String getTestAddress() { return testAddress; @@ -94,4 +107,15 @@ public class MailClientParameters implements Serializable { this.testAddress = testAddress; } + + public Properties getPropertiesInstance() { + Properties properties = new Properties(); + properties.put(JavaMailProperties.MAIL_FROM, (from == null)?"":from); + properties.put(JavaMailProperties.MAIL_SMTP_USER, (smtpUser == null)?"":smtpUser); + properties.put(MailClient.MAIL_SMTP_PASSWORD, (smtpPassword == null)?"":smtpPassword); + properties.put(JavaMailProperties.MAIL_SMTP_HOST, (smtpHost == null)?"":smtpHost); + properties.put(JavaMailProperties.MAIL_SMTP_PORT, (smtpPort == null)?"":smtpPort); + properties.put(MailClient.MAIL_TEST_ADDRESS, (testAddress == null)?"":testAddress); + return properties; + } } diff --git a/openbis/source/java/genericApplicationContext.xml b/openbis/source/java/genericApplicationContext.xml index 1502f26f60c0634b5c26a503afe0ab99f9cbfda8..c3db443a4403ceadcd9334f20d84bffbaca9050f 100644 --- a/openbis/source/java/genericApplicationContext.xml +++ b/openbis/source/java/genericApplicationContext.xml @@ -333,11 +333,12 @@ <bean id="mail-client-parameters" class="ch.systemsx.cisd.common.mail.MailClientParameters"> <property name="from" value="${mail.from}"/> <property name="smtpHost" value="${mail.smtp.host}"/> + <property name="smtpPort" value="${mail.smtp.port}"/> <property name="smtpUser" value="${mail.smtp.user}"/> <property name="smtpPassword" value="${mail.smtp.password}"/> + <property name="testAddress" value="${mail.smtp.address}"/> </bean> - <!-- Maintenance Tasks -->