From 2029d0a27ba740ac04569af569f7f4ac69609d23 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Wed, 17 Nov 2021 21:06:29 +0000 Subject: [PATCH] [JAVA-8383] Add charset to email mime type to handle special chars --- .../java/com/baeldung/mail/EmailService.java | 90 +++++++++++-------- .../src/main/resources/attachment.txt | 1 + .../baeldung/mail/EmailServiceLiveTest.java | 60 +++++++++++++ 3 files changed, 113 insertions(+), 38 deletions(-) create mode 100644 core-java-modules/core-java-networking-2/src/main/resources/attachment.txt create mode 100644 core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java index bd2024fdfa..3d1e25e7a4 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java @@ -1,40 +1,55 @@ package com.baeldung.mail; -import javax.mail.*; +import javax.mail.Authenticator; +import javax.mail.Message; +import javax.mail.Multipart; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.io.File; +import java.net.URI; import java.util.Properties; public class EmailService { - private String host = ""; - private int port = 0; - private String username = ""; - private String password = ""; + private String username; + private String password; + private final Properties prop; public EmailService(String host, int port, String username, String password) { - - this.host = host; - this.port = port; - this.username = username; - this.password = password; - - sendMail(); - } - - private void sendMail() { - - Properties prop = new Properties(); + prop = new Properties(); prop.put("mail.smtp.auth", true); prop.put("mail.smtp.starttls.enable", "true"); prop.put("mail.smtp.host", host); prop.put("mail.smtp.port", port); prop.put("mail.smtp.ssl.trust", host); + this.username = username; + this.password = password; + } + + public EmailService(String host, int port) { + prop = new Properties(); + prop.put("mail.smtp.host", host); + prop.put("mail.smtp.port", port); + } + + public static void main(String... args) { + try { + new EmailService("smtp.mailtrap.io", 25, "87ba3d9555fae8", "91cb4379af43ed") + .sendMail(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void sendMail() throws Exception { + Session session = Session.getInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { @@ -42,36 +57,35 @@ public class EmailService { } }); - try { + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress("from@gmail.com")); + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@gmail.com")); + message.setSubject("Mail Subject"); - Message message = new MimeMessage(session); - message.setFrom(new InternetAddress("from@gmail.com")); - message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@gmail.com")); - message.setSubject("Mail Subject"); + String msg = "This is my first email using JavaMailer"; - String msg = "This is my first email using JavaMailer"; + MimeBodyPart mimeBodyPart = new MimeBodyPart(); + mimeBodyPart.setContent(msg, "text/html; charset=utf-8"); - MimeBodyPart mimeBodyPart = new MimeBodyPart(); - mimeBodyPart.setContent(msg, "text/html"); + MimeBodyPart attachmentBodyPart = new MimeBodyPart(); - MimeBodyPart attachmentBodyPart = new MimeBodyPart(); - attachmentBodyPart.attachFile(new File("pom.xml")); + attachmentBodyPart.attachFile(getFile()); - Multipart multipart = new MimeMultipart(); - multipart.addBodyPart(mimeBodyPart); - multipart.addBodyPart(attachmentBodyPart); + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(mimeBodyPart); + multipart.addBodyPart(attachmentBodyPart); - message.setContent(multipart); + message.setContent(multipart); - Transport.send(message); - - } catch (Exception e) { - e.printStackTrace(); - } + Transport.send(message); } - public static void main(String ... args) { - new EmailService("smtp.mailtrap.io", 25, "87ba3d9555fae8", "91cb4379af43ed"); + private File getFile() throws Exception { + URI uri = this.getClass() + .getClassLoader() + .getResource("attachment.txt") + .toURI(); + return new File(uri); } } diff --git a/core-java-modules/core-java-networking-2/src/main/resources/attachment.txt b/core-java-modules/core-java-networking-2/src/main/resources/attachment.txt new file mode 100644 index 0000000000..a726ded018 --- /dev/null +++ b/core-java-modules/core-java-networking-2/src/main/resources/attachment.txt @@ -0,0 +1 @@ +sample attachment content \ No newline at end of file diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java new file mode 100644 index 0000000000..7f543bc612 --- /dev/null +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java @@ -0,0 +1,60 @@ +package com.baeldung.mail; + +import com.icegreen.greenmail.junit.GreenMailRule; +import com.icegreen.greenmail.util.ServerSetupTest; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +public class EmailServiceLiveTest { + + @Rule + public final GreenMailRule greenMail = new GreenMailRule(ServerSetupTest.SMTP); + + private EmailService emailService; + + @Before + public void setup() { + emailService = new EmailService("localhost", greenMail.getSmtp().getPort()); + } + + @Test + public void givenEmailMessageWithAttachment_whenEmailIsSent_MessageIsReceived() throws Exception { + + emailService.sendMail(); + + MimeMessage[] receivedMessages = greenMail.getReceivedMessages(); + assertEquals(1, receivedMessages.length); + + MimeMessage receivedMessage = receivedMessages[0]; + assertEquals("Mail Subject", subjectFromMessage(receivedMessage)); + assertEquals("This is my first email using JavaMailer", emailTextFrom(receivedMessage)); + assertEquals("sample attachment content", attachmentContentsFrom(receivedMessage)); + } + + private static String subjectFromMessage(MimeMessage receivedMessage) throws MessagingException { + return receivedMessage.getSubject(); + } + + private static String emailTextFrom(MimeMessage receivedMessage) throws IOException, MessagingException { + return ((MimeMultipart) receivedMessage.getContent()) + .getBodyPart(0) + .getContent() + .toString(); + } + + private static String attachmentContentsFrom(MimeMessage receivedMessage) throws Exception { + return ((MimeMultipart) receivedMessage.getContent()) + .getBodyPart(1) + .getContent() + .toString(); + } + +}