如何使用 ThymeLeaf 发送带有内联图像的电子邮件
How to send email with inline image using ThymeLeaf
我正在尝试使用 ThymeLeaf 和 Spring 发送带有内联图像的电子邮件,但到目前为止没有成功。电子邮件已发送,但内联图像不会显示在电子邮件中。
该项目不是基于网络的(不是网站),而是桌面独立的,不是移动的
这是我获取图像文件的方式:
URL url = getClass().getResource("/LawFirmAdvisoryGroup.jpg");
File file = new File(url.getPath());
MultipartFile multipartFile = new MockMultipartFile(file.getName(),
file.getName(), "image/jpeg", IOUtils.toByteArray(input));
我的服务class:
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
public void sendMailWithInline(final String recipientName, final String recipientEmail, final MultipartFile image, final byte[] imageBytes)
throws MessagingException {
final Context ctx = new Context();
ctx.setVariable("imageResourceName", image.getName()); // so that we can reference it from HTML
final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
final MimeMessageHelper message
= new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.setSubject("Inline Image");
message.setFrom("XXXX@yahoo.com");
message.setTo(recipientEmail);
// Add the inline image, referenced from the HTML code as "cid:${imageResourceName}"
final InputStreamSource imageSource = new ByteArrayResource(imageBytes);
message.addInline(image.getName(), imageSource, image.getContentType());
final String htmlContent = this.templateEngine.process("left_sidebar.html", ctx);
message.setText(htmlContent, true);
this.mailSender.send(mimeMessage);
}
HTML:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:remove="all">Email with inline image</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>
<img src="LawFirmAdvisoryGroup.jpg" th:src="'cid:' + ${imageResourceName}" />
</p>
</body>
</html>
只需将您的呼叫移至 setText()
几行。
MimeMessageHelper.addInLine()
的 javadoc 说:
NOTE: Invoke addInline
after setText(java.lang.String)
; else, mail readers might not be able to resolve inline references correctly.
这非常有效:
只需将 link 添加到托管在远离您桌面的外部服务器上的图像。使用内联 CSS,而不是 CSS 类.
本网站将帮助您将 CSS 类 转换为内联 CSS, Premailer.Dialect.
避免花哨CSS,只使用最基本的。如果您希望 HTML 邮件轻松流动,即使在移动设备和其他较小的屏幕中,也应尽可能避免浮动(如 float: left;)。
包括 NekoHTML in your project libraries, and change your Spring spring.xml 到:
<!-- THYMELEAF: Template Resolver for email templates -->
<bean id="emailTemplateResolver" class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver">
<property name="prefix" value="resources/WEB_INF/HTMLMailTemplates/XXXX/html/" />
<!-- <property name="templateMode" value="HTML5" /> -->
<property name="templateMode" value="LEGACYHTML5" />
<property name="characterEncoding" value="UTF-8" />
<property name="order" value="1" />
</bean>
示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Email With Inline Images</title>
<style>
body {
background-image: url('https://dl.dropbox.com/s/XXXX/pageBackGround.gif');
background-repeat: repeat;
margin:0;
outline:0;
}
.pageContentWrapper {
padding:10px;
width: 100%;
background-image: url('https://dl.dropbox.com/s/XXXX/smallerInlineImage.gif');
background-repeat: repeat;
}
.smallerInlineImage {
width: 22px;
height: 22px;
padding: 0 4px 6px 0;
float: left;
}
</style>
</head>
<body>
<div class="pageContentWrapper">
<div class="smallerInlineImage">
<img src="https://dl.dropboxusercontent.com/s/3ydel6zp53pb65b/smallerInlineImage.png" height="22" width="22">
</div>
</div>
</body>
服务Class:
@Service
public class ThymeEmailService {
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
public void sendMailWithInline() throws MessagingException {
final Context ctx = new Context();
final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.setSubject("Sample Email Subject");
message.setFrom("senderEmail@yahoo.com");
message.setTo("recipientEmail@yahoo.com");
final String htmlContent = this.templateEngine.process("emailTemplate.html", ctx);
message.setText(htmlContent, true);
String[] attachments = {"C:\Users\MyPc\Dropbox\CV\myPDFAttachment.pdf"};
for (String attachment : attachments) {
FileSystemResource file = new FileSystemResource(attachment);
message.addAttachment(file.getFilename(), file);
}
this.mailSender.send(mimeMessage);
}
}
我正在尝试使用 ThymeLeaf 和 Spring 发送带有内联图像的电子邮件,但到目前为止没有成功。电子邮件已发送,但内联图像不会显示在电子邮件中。
该项目不是基于网络的(不是网站),而是桌面独立的,不是移动的
这是我获取图像文件的方式:
URL url = getClass().getResource("/LawFirmAdvisoryGroup.jpg");
File file = new File(url.getPath());
MultipartFile multipartFile = new MockMultipartFile(file.getName(),
file.getName(), "image/jpeg", IOUtils.toByteArray(input));
我的服务class:
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
public void sendMailWithInline(final String recipientName, final String recipientEmail, final MultipartFile image, final byte[] imageBytes)
throws MessagingException {
final Context ctx = new Context();
ctx.setVariable("imageResourceName", image.getName()); // so that we can reference it from HTML
final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
final MimeMessageHelper message
= new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.setSubject("Inline Image");
message.setFrom("XXXX@yahoo.com");
message.setTo(recipientEmail);
// Add the inline image, referenced from the HTML code as "cid:${imageResourceName}"
final InputStreamSource imageSource = new ByteArrayResource(imageBytes);
message.addInline(image.getName(), imageSource, image.getContentType());
final String htmlContent = this.templateEngine.process("left_sidebar.html", ctx);
message.setText(htmlContent, true);
this.mailSender.send(mimeMessage);
}
HTML:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:remove="all">Email with inline image</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>
<img src="LawFirmAdvisoryGroup.jpg" th:src="'cid:' + ${imageResourceName}" />
</p>
</body>
</html>
只需将您的呼叫移至 setText()
几行。
MimeMessageHelper.addInLine()
的 javadoc 说:
NOTE: Invoke
addInline
aftersetText(java.lang.String)
; else, mail readers might not be able to resolve inline references correctly.
这非常有效:
只需将 link 添加到托管在远离您桌面的外部服务器上的图像。使用内联 CSS,而不是 CSS 类.
本网站将帮助您将 CSS 类 转换为内联 CSS, Premailer.Dialect.
避免花哨CSS,只使用最基本的。如果您希望 HTML 邮件轻松流动,即使在移动设备和其他较小的屏幕中,也应尽可能避免浮动(如 float: left;)。
包括 NekoHTML in your project libraries, and change your Spring spring.xml 到:
<!-- THYMELEAF: Template Resolver for email templates -->
<bean id="emailTemplateResolver" class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver">
<property name="prefix" value="resources/WEB_INF/HTMLMailTemplates/XXXX/html/" />
<!-- <property name="templateMode" value="HTML5" /> -->
<property name="templateMode" value="LEGACYHTML5" />
<property name="characterEncoding" value="UTF-8" />
<property name="order" value="1" />
</bean>
示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Email With Inline Images</title>
<style>
body {
background-image: url('https://dl.dropbox.com/s/XXXX/pageBackGround.gif');
background-repeat: repeat;
margin:0;
outline:0;
}
.pageContentWrapper {
padding:10px;
width: 100%;
background-image: url('https://dl.dropbox.com/s/XXXX/smallerInlineImage.gif');
background-repeat: repeat;
}
.smallerInlineImage {
width: 22px;
height: 22px;
padding: 0 4px 6px 0;
float: left;
}
</style>
</head>
<body>
<div class="pageContentWrapper">
<div class="smallerInlineImage">
<img src="https://dl.dropboxusercontent.com/s/3ydel6zp53pb65b/smallerInlineImage.png" height="22" width="22">
</div>
</div>
</body>
服务Class:
@Service
public class ThymeEmailService {
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
public void sendMailWithInline() throws MessagingException {
final Context ctx = new Context();
final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.setSubject("Sample Email Subject");
message.setFrom("senderEmail@yahoo.com");
message.setTo("recipientEmail@yahoo.com");
final String htmlContent = this.templateEngine.process("emailTemplate.html", ctx);
message.setText(htmlContent, true);
String[] attachments = {"C:\Users\MyPc\Dropbox\CV\myPDFAttachment.pdf"};
for (String attachment : attachments) {
FileSystemResource file = new FileSystemResource(attachment);
message.addAttachment(file.getFilename(), file);
}
this.mailSender.send(mimeMessage);
}
}