package org.simplejavamail.mailer; import net.markenwerk.utils.mail.dkim.DkimMessage; import org.junit.Before; import org.junit.Test; import org.simplejavamail.converter.EmailConverter; import org.simplejavamail.email.Email; import org.simplejavamail.util.ConfigLoader; import org.simplejavamail.mailer.config.ProxyConfig; import org.simplejavamail.mailer.config.ServerConfig; import org.simplejavamail.mailer.config.TransportStrategy; import testutil.ConfigLoaderTestHelper; import testutil.EmailHelper; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Properties; import static javax.xml.bind.DatatypeConverter.parseBase64Binary; import static org.assertj.core.api.Assertions.assertThat; import static org.simplejavamail.mailer.config.TransportStrategy.SMTP_TLS; @SuppressWarnings("unused") public class MailerTest { @Before public void restoreOriginalStaticProperties() throws IOException { String s = "simplejavamail.javaxmail.debug=true\n" + "simplejavamail.transportstrategy=SMTP_TLS\n" + "simplejavamail.smtp.host=smtp.default.com\n" + "simplejavamail.smtp.port=25\n" + "simplejavamail.smtp.username=username smtp\n" + "simplejavamail.smtp.password=password smtp\n" + "simplejavamail.proxy.host=proxy.default.com\n" + "simplejavamail.proxy.port=1080\n" + "simplejavamail.proxy.username=username proxy\n" + "simplejavamail.proxy.password=password proxy\n" + "simplejavamail.proxy.socks5bridge.port=1081"; ConfigLoader.loadProperties(new ByteArrayInputStream(s.getBytes()), false); } @Test public void createMailSession_MinimalConstructor_WithoutConfig() throws Exception { ConfigLoaderTestHelper.clearConfigProperties(); Mailer mailer = new Mailer("host", 25, null, null); Session session = mailer.getSession(); assertThat(session.getDebug()).isFalse(); assertThat(session.getProperty("mail.smtp.host")).isEqualTo("host"); assertThat(session.getProperty("mail.smtp.port")).isEqualTo("25"); assertThat(session.getProperty("mail.transport.protocol")).isEqualTo("smtp"); assertThat(session.getProperty("mail.smtp.username")).isNull(); assertThat(session.getProperty("mail.smtp.auth")).isNull(); assertThat(session.getProperty("mail.smtp.socks.host")).isNull(); assertThat(session.getProperty("mail.smtp.socks.port")).isNull(); // all constructors, providing the same minimal information Mailer alternative1 = new Mailer(new ServerConfig("host", 25)); Mailer alternative2 = new Mailer(new ServerConfig("host", 25), (TransportStrategy) null); Mailer alternative3 = new Mailer(new ServerConfig("host", 25), (ProxyConfig) null); Mailer alternative4 = new Mailer(new ServerConfig("host", 25), null, null); Mailer alternative5 = new Mailer(session); Mailer alternative6 = new Mailer(session, null); assertThat(session.getProperties()).isEqualTo(alternative1.getSession().getProperties()); assertThat(session.getProperties()).isEqualTo(alternative2.getSession().getProperties()); assertThat(session.getProperties()).isEqualTo(alternative3.getSession().getProperties()); assertThat(session.getProperties()).isEqualTo(alternative4.getSession().getProperties()); assertThat(session.getProperties()).isEqualTo(alternative5.getSession().getProperties()); assertThat(session.getProperties()).isEqualTo(alternative6.getSession().getProperties()); } @Test public void createMailSession_AnonymousProxyConstructor_WithoutConfig() throws Exception { ConfigLoaderTestHelper.clearConfigProperties(); Mailer mailer = createFullyConfiguredMailer(false, ""); Session session = mailer.getSession(); assertThat(session.getDebug()).isTrue(); assertThat(session.getProperty("mail.smtp.host")).isEqualTo("smtp host"); assertThat(session.getProperty("mail.smtp.port")).isEqualTo("25"); assertThat(session.getProperty("mail.transport.protocol")).isEqualTo("smtp"); assertThat(session.getProperty("mail.smtp.starttls.enable")).isEqualTo("true"); assertThat(session.getProperty("mail.smtp.username")).isEqualTo("username smtp"); assertThat(session.getProperty("mail.smtp.auth")).isEqualTo("true"); assertThat(session.getProperty("mail.smtp.socks.host")).isEqualTo("proxy host"); assertThat(session.getProperty("mail.smtp.socks.port")).isEqualTo("1080"); assertThat(session.getProperty("extra1")).isEqualTo("value1"); assertThat(session.getProperty("extra2")).isEqualTo("value2"); } @Test public void createMailSession_MaximumConstructor_WithoutConfig() throws Exception { ConfigLoaderTestHelper.clearConfigProperties(); Mailer mailer = createFullyConfiguredMailer(true, ""); Session session = mailer.getSession(); assertThat(session.getDebug()).isTrue(); assertThat(session.getProperty("mail.smtp.host")).isEqualTo("smtp host"); assertThat(session.getProperty("mail.smtp.port")).isEqualTo("25"); assertThat(session.getProperty("mail.transport.protocol")).isEqualTo("smtp"); assertThat(session.getProperty("mail.smtp.starttls.enable")).isEqualTo("true"); assertThat(session.getProperty("mail.smtp.username")).isEqualTo("username smtp"); assertThat(session.getProperty("mail.smtp.auth")).isEqualTo("true"); // the following two are because authentication is needed, otherwise proxy would be straightworward assertThat(session.getProperty("mail.smtp.socks.host")).isEqualTo("localhost"); assertThat(session.getProperty("mail.smtp.socks.port")).isEqualTo("999"); assertThat(session.getProperty("extra1")).isEqualTo("value1"); assertThat(session.getProperty("extra2")).isEqualTo("value2"); } @Test public void createMailSession_MinimalConstructor_WithConfig() { Mailer mailer = new Mailer(); Session session = mailer.getSession(); assertThat(session.getDebug()).isTrue(); assertThat(session.getProperty("mail.smtp.host")).isEqualTo("smtp.default.com"); assertThat(session.getProperty("mail.smtp.port")).isEqualTo("25"); assertThat(session.getProperty("mail.transport.protocol")).isEqualTo("smtp"); assertThat(session.getProperty("mail.smtp.starttls.enable")).isEqualTo("true"); assertThat(session.getProperty("mail.smtp.username")).isEqualTo("username smtp"); assertThat(session.getProperty("mail.smtp.auth")).isEqualTo("true"); // the following two are because authentication is needed, otherwise proxy would be straightworward assertThat(session.getProperty("mail.smtp.socks.host")).isEqualTo("localhost"); assertThat(session.getProperty("mail.smtp.socks.port")).isEqualTo("1081"); } @Test public void createMailSession_MaximumConstructor_WithConfig() throws Exception { Mailer mailer = createFullyConfiguredMailer(false, "overridden "); Session session = mailer.getSession(); assertThat(session.getDebug()).isTrue(); assertThat(session.getProperty("mail.smtp.host")).isEqualTo("overridden smtp host"); assertThat(session.getProperty("mail.smtp.port")).isEqualTo("25"); assertThat(session.getProperty("mail.transport.protocol")).isEqualTo("smtp"); assertThat(session.getProperty("mail.smtp.starttls.enable")).isEqualTo("true"); assertThat(session.getProperty("mail.smtp.username")).isEqualTo("overridden username smtp"); assertThat(session.getProperty("mail.smtp.auth")).isEqualTo("true"); // the following two are because authentication is needed, otherwise proxy would be straightworward assertThat(session.getProperty("mail.smtp.socks.host")).isEqualTo("localhost"); assertThat(session.getProperty("mail.smtp.socks.port")).isEqualTo("1081"); assertThat(session.getProperty("extra1")).isEqualTo("overridden value1"); assertThat(session.getProperty("extra2")).isEqualTo("overridden value2"); } @Test public void testDKIMPriming() throws IOException, MessagingException { final Email email = EmailHelper.createDummyEmail(); // System.out.println(printBase64Binary(Files.readAllBytes(Paths.get("D:\\keys\\dkim.der")))); // needs jdk 1.7 String privateDERkeyBase64 = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMYuC7ZjFBSWJtP6JH8w1deJE+5sLwkUacZcW4MTVQXTM33BzN8Ec64KO1Hk2B9oxkpdunKt" + "BggwbWMlGU5gGu4PpQ20cdPcfBIkUMlQKaakHPPGNYaF9dQaZIRy8XON6g1sOJGALXtUYX1r5hdDH13kC/YBw9f1Dsi2smrB0qabAgMBAAECgYAdWbBuYJoWum4hssg49hiVhT2ob+k" + "/ZQCNWhxLe096P18+3rbiyJwBSI6kgEnpzPChDuSQG0PrbpCkwFfRHbafDIPiMi5b6YZkJoFmmOmBHsewS1VdR/phk+aPQV2SoJ0S0FAGZkOnOkagHfmEMSgjZzTpJouu5NU8mwqz8z" + "/s0QJBAOUnELTMG/Se3Pw4FQ49K49lA81QaMoL63lYIEvc6uSVoJSEcrBFxv5sfJW2LFWs8VIDyTvYzsCjLwZj6nwA3k0CQQDdZgVHX7crlpUxO/cjKtTa/Nq9S6XLv3S6XX3YJJ9/Z" + "pYpqAWJbbR+8scBgVxS+9NLLeHhlx/EvkaZRdLhwRyHAkEAtr1ThkqrFIXHxt9Wczd20HCG+qlgF5gv3WHYx4bSTx2/pBCHgWjzyxtqst1HN7+l5nicdrxsDJVVv+vYJ7FtlQJAWPgG" + "Zwgvs3Rvv7k5NwifQOEbhbZAigAGCF5Jk/Ijpi6zaUn7754GSn2FOzWgxDguUKe/fcgdHBLai/1jIRVZQQJAXF2xzWMwP+TmX44QxK52QHVI8mhNzcnH7A311gWns6AbLcuLA9quwjU" + "YJMRlfXk67lJXCleZL15EpVPrQ34KlA=="; email.signWithDomainKey(new ByteArrayInputStream(parseBase64Binary(privateDERkeyBase64)), "somemail.com", "select"); MimeMessage mimeMessage = EmailConverter.emailToMimeMessage(email); // success, signing did not produce an error assertThat(mimeMessage).isInstanceOf(DkimMessage.class); } @Test public void testParser() throws Exception { final Email emailNormal = EmailHelper.createDummyEmail(); // let's try producing and then consuming a MimeMessage -> final MimeMessage mimeMessage = EmailConverter.emailToMimeMessage(emailNormal); final Email emailFromMimeMessage = EmailConverter.mimeMessageToEmail(mimeMessage); assertThat(emailFromMimeMessage).isEqualTo(emailNormal); } private Mailer createFullyConfiguredMailer(boolean authenticateProxy, String prefix) { ServerConfig serverConfig = new ServerConfig(prefix + "smtp host", 25, prefix + "username smtp", prefix + "password smtp"); ProxyConfig proxyConfigAnon = new ProxyConfig(prefix + "proxy host", 1080); ProxyConfig proxyConfigAuth = new ProxyConfig(prefix + "proxy host", 1080, prefix + "username proxy", prefix + "password proxy"); proxyConfigAuth.setProxyBridgePort(999); Mailer mailer = new Mailer(serverConfig, SMTP_TLS, authenticateProxy ? proxyConfigAuth : proxyConfigAnon); mailer.setDebug(true); Properties extraProperties = new Properties(); extraProperties.put("extra1", prefix + "value1"); extraProperties.put("extra2", prefix + "value2"); mailer.applyProperties(extraProperties); return mailer; } }