diff --git a/core-plugins/src/main/java/io/cdap/plugin/batch/action/EmailAction.java b/core-plugins/src/main/java/io/cdap/plugin/batch/action/EmailAction.java index 6041abf62..5dbc63112 100644 --- a/core-plugins/src/main/java/io/cdap/plugin/batch/action/EmailAction.java +++ b/core-plugins/src/main/java/io/cdap/plugin/batch/action/EmailAction.java @@ -124,9 +124,8 @@ public PasswordAuthentication getPasswordAuthentication() { try { Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress(config.sender)); - for (InternetAddress internetAddress : InternetAddress.parse(config.recipients)) { - msg.addRecipient(Message.RecipientType.TO, internetAddress); - } + msg.setRecipients(Message.RecipientType.TO, + InternetAddress.parse(config.recipients)); msg.setSubject(config.subject); WorkflowToken token = context.getToken(); String message = config.includeWorkflowToken ? diff --git a/core-plugins/src/test/java/io/cdap/plugin/batch/action/EmailActionTestRun.java b/core-plugins/src/test/java/io/cdap/plugin/batch/action/EmailActionTestRun.java index 749caa2d4..9d128398e 100644 --- a/core-plugins/src/test/java/io/cdap/plugin/batch/action/EmailActionTestRun.java +++ b/core-plugins/src/test/java/io/cdap/plugin/batch/action/EmailActionTestRun.java @@ -19,9 +19,12 @@ import com.dumbster.smtp.SimpleSmtpServer; import com.dumbster.smtp.SmtpMessage; import com.google.common.collect.ImmutableMap; +import io.cdap.cdap.common.utils.Networks; +import io.cdap.cdap.etl.api.batch.BatchActionContext; import io.cdap.cdap.etl.api.batch.BatchSink; import io.cdap.cdap.etl.api.batch.BatchSource; import io.cdap.cdap.etl.api.batch.PostAction; +import io.cdap.cdap.etl.mock.validation.MockFailureCollector; import io.cdap.cdap.etl.proto.v2.ETLBatchConfig; import io.cdap.cdap.etl.proto.v2.ETLPlugin; import io.cdap.cdap.etl.proto.v2.ETLStage; @@ -30,7 +33,9 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; +import org.mockito.Mockito; +import java.lang.reflect.Field; import java.util.Iterator; /** @@ -87,4 +92,41 @@ public void testEmailAction() throws Exception { Assert.assertTrue(email.getBody().startsWith("Run for 1970-01-01 completed.")); Assert.assertFalse(emailIter.hasNext()); } + + @Test + public void testMultipleRecipientsSingleToHeader() throws Exception { + int smtpPort = Networks.getRandomPort(); + SimpleSmtpServer smtpServer = SimpleSmtpServer.start(smtpPort); + try { + EmailAction.Config config = new EmailAction.Config(); + setField(config, "sender", "from@test.com"); + setField(config, "recipients", "to1@test.com, to2@test.com"); + setField(config, "subject", "Test Multiple Recipients"); + setField(config, "message", "Test message body."); + setField(config, "port", smtpPort); + + BatchActionContext context = Mockito.mock(BatchActionContext.class); + Mockito.when(context.getFailureCollector()).thenReturn(new MockFailureCollector()); + + EmailAction emailAction = new EmailAction(config); + emailAction.run(context); + + Assert.assertEquals(1, smtpServer.getReceivedEmailSize()); + Iterator emailIter = smtpServer.getReceivedEmail(); + SmtpMessage email = (SmtpMessage) emailIter.next(); + Assert.assertEquals("Test Multiple Recipients", email.getHeaderValue("Subject")); + String[] toHeaders = email.getHeaderValues("To"); + Assert.assertEquals(1, toHeaders.length); + Assert.assertEquals("to1@test.com, to2@test.com", toHeaders[0]); + Assert.assertFalse(emailIter.hasNext()); + } finally { + smtpServer.stop(); + } + } + + private static void setField(Object target, String fieldName, Object value) throws Exception { + Field field = target.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(target, value); + } }