diff --git a/core-java-modules/core-java-networking-6/pom.xml b/core-java-modules/core-java-networking-6/pom.xml index 20864d0808bb..854f63dd2d10 100644 --- a/core-java-modules/core-java-networking-6/pom.xml +++ b/core-java-modules/core-java-networking-6/pom.xml @@ -14,16 +14,6 @@ - - org.springframework - spring-web - ${springframework.spring-web.version} - - - org.springframework.boot - spring-boot-starter-web - ${webflux.version} - org.springframework.boot spring-boot-starter-webflux @@ -44,11 +34,6 @@ async-http-client ${async-http-client.version} - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - com.squareup.okhttp3 okhttp @@ -65,6 +50,16 @@ commons-net ${commons-net.version} + + org.eclipse.angus + angus-mail + ${angus-mail.version} + + + com.icegreen + greenmail + ${greenmail.version} + org.wiremock wiremock @@ -75,12 +70,20 @@ core-java-networking-6 + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + 21 + + + - 4.3.4.RELEASE 4.5.14 - 2.0.0-alpha-3 5.3.1 2.4.5 2.3.3 @@ -88,6 +91,8 @@ 4.12.0 3.4.3 3.8.0 + 2.0.3 + 2.1.3 3.13.0 diff --git a/core-java-modules/core-java-networking-6/src/main/java/com/baeldung/inlineimagesinemail/InlineImage.java b/core-java-modules/core-java-networking-6/src/main/java/com/baeldung/inlineimagesinemail/InlineImage.java new file mode 100644 index 000000000000..b6c3812c40ec --- /dev/null +++ b/core-java-modules/core-java-networking-6/src/main/java/com/baeldung/inlineimagesinemail/InlineImage.java @@ -0,0 +1,101 @@ +package com.baeldung.inlineimagesinemail; + +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import jakarta.mail.Authenticator; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; + +import com.icegreen.greenmail.util.GreenMail; + +public class InlineImage { + + private final String USERNAME = "YOUR_SMTP_USERNAME"; + private final String PASSWORD = "YOUR_SMTP_PASSWORD"; + private final String HOST = "SMTP HOST"; + private final String PORT = "SMTP PORT"; + + public Properties smtpProperties() { + 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.user", USERNAME); + prop.put("mail.smtp.password", PASSWORD); + + return prop; + } + + public Session smtpsession(Properties props) { + final String username = props.getProperty("mail.smtp.user"); + final String password = props.getProperty("mail.smtp.password"); + + Session session = Session.getInstance(props, new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + + return session; + } + + public Session smtpsession(GreenMail greenMail) { + + Session session = greenMail.getSmtp() + .createSession(); + + return session; + } + + public void sendEmail(Session session, String to, String subject, String body, String filePath) throws MessagingException, IOException { + + MimeMessage message = new MimeMessage(session); + message.setFrom(new InternetAddress("example@gmail.com")); + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); + message.setSubject(subject); + + MimeBodyPart htmlPart = new MimeBodyPart(); + htmlPart.setContent(body, "text/html"); + + MimeBodyPart imagePart = new MimeBodyPart(); + imagePart.attachFile(new File(filePath)); + imagePart.setContentID(""); + imagePart.setDisposition(MimeBodyPart.INLINE); + + MimeMultipart mimeMultipart = new MimeMultipart("related"); + mimeMultipart.addBodyPart(htmlPart); + mimeMultipart.addBodyPart(imagePart); + + message.setContent(mimeMultipart); + + Transport.send(message); + } + + public static void main(String[] args) throws MessagingException, IOException { + InlineImage inlineImage = new InlineImage(); + Properties properties = inlineImage.smtpProperties(); + Session session = inlineImage.smtpsession(properties); + + String to = "receiver@gmail.com"; + String subject = "Baeldung"; + String body = """ +

Welcome to Baeldung, home of Java and its frameworks.

+ +

Explore and learn.

+ """; + String imagePath = "src/main/resources/image/java.png"; + + inlineImage.sendEmail(session, to, subject, body, imagePath); + } +} diff --git a/core-java-modules/core-java-networking-6/src/main/resources/image/java.png b/core-java-modules/core-java-networking-6/src/main/resources/image/java.png new file mode 100644 index 000000000000..dcea7ef16d34 Binary files /dev/null and b/core-java-modules/core-java-networking-6/src/main/resources/image/java.png differ diff --git a/core-java-modules/core-java-networking-6/src/test/java/com/baeldung/inlineimagesinemail/InlineImageUnitTest.java b/core-java-modules/core-java-networking-6/src/test/java/com/baeldung/inlineimagesinemail/InlineImageUnitTest.java new file mode 100644 index 000000000000..74155e82832b --- /dev/null +++ b/core-java-modules/core-java-networking-6/src/test/java/com/baeldung/inlineimagesinemail/InlineImageUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.inlineimagesinemail; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import jakarta.mail.BodyPart; +import jakarta.mail.Multipart; +import jakarta.mail.Part; +import jakarta.mail.Session; +import jakarta.mail.internet.MimeMessage; + +import org.junit.jupiter.api.Test; + +import com.icegreen.greenmail.util.GreenMail; +import com.icegreen.greenmail.util.ServerSetupTest; + +class InlineImageUnitTest { + + @Test + void givenHtmlEmailWithInlineImage_whenSentViaGreenMailSmtp_thenReceivesEmailWithInlineImage() throws Exception { + GreenMail greenMail = new GreenMail(ServerSetupTest.SMTP); + greenMail.start(); + InlineImage inlineImage = new InlineImage(); + Session session = inlineImage.smtpsession(greenMail); + + String to = "receiver@localhost"; + String subject = "Test Subject"; + String body = """ +

Welcome to Baeldung, home of Java and its frameworks.

+ +

Explore and learn.

+ """; + String imagePath = "src/main/resources/image/java.png"; + + inlineImage.sendEmail(session, to, subject, body, imagePath); + + MimeMessage[] receivedMessages = greenMail.getReceivedMessages(); + assertEquals(1, receivedMessages.length); + + MimeMessage message = receivedMessages[0]; + + Multipart multipart = (Multipart) message.getContent(); + assertEquals(2, multipart.getCount()); + + BodyPart htmlPart = multipart.getBodyPart(0); + assertTrue(htmlPart.getContentType() + .contains("text/html")); + String htmlContent = (String) htmlPart.getContent(); + assertTrue(htmlContent.contains("cid:image1")); + + BodyPart imagePart = multipart.getBodyPart(1); + String contentId = imagePart.getHeader("Content-ID")[0]; + assertTrue(contentId.contains("image1") || contentId.contains("")); + + assertEquals(Part.INLINE, imagePart.getDisposition()); + greenMail.stop(); + } + +} \ No newline at end of file