这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 22 additions & 17 deletions core-java-modules/core-java-networking-6/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,6 @@
</parent>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.spring-web.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${webflux.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
Expand All @@ -44,11 +34,6 @@
<artifactId>async-http-client</artifactId>
<version>${async-http-client.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
Expand All @@ -65,6 +50,16 @@
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.angus</groupId>
<artifactId>angus-mail</artifactId>
<version>${angus-mail.version}</version>
</dependency>
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>${greenmail.version}</version>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock</artifactId>
Expand All @@ -75,19 +70,29 @@

<build>
<finalName>core-java-networking-6</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>

<properties>
<springframework.spring-web.version>4.3.4.RELEASE</springframework.spring-web.version>
<apache.httpclient.version>4.5.14</apache.httpclient.version>
<greenmail.version>2.0.0-alpha-3</greenmail.version>
<apache.httpclient5.version>5.3.1</apache.httpclient5.version>
<async-http-client.version>2.4.5</async-http-client.version>
<jakarta.bind.version>2.3.3</jakarta.bind.version>
<apache.httpclient5.version>5.4.2</apache.httpclient5.version>
<okhttp.version>4.12.0</okhttp.version>
<webflux.version>3.4.3</webflux.version>
<commons-net.version>3.8.0</commons-net.version>
<angus-mail.version>2.0.3</angus-mail.version>
<greenmail.version>2.1.3</greenmail.version>
<wiremock.version>3.13.0</wiremock.version>
</properties>

Expand Down
Original file line number Diff line number Diff line change
@@ -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("<image1>");
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 = """
<p>Welcome to Baeldung, home of Java and its frameworks.</p>
<img src='cid:image1'></img>
<p> Explore and learn. </p>
""";
String imagePath = "src/main/resources/image/java.png";

inlineImage.sendEmail(session, to, subject, body, imagePath);
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -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 = """
<p>Welcome to Baeldung, home of Java and its frameworks.</p>
<img src='cid:image1'></img>
<p> Explore and learn. </p>
""";
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("<image1>"));

assertEquals(Part.INLINE, imagePart.getDisposition());
greenMail.stop();
}

}