赞
踩
- spring-boot-starter-mail : 通过此依赖进行邮件发送
- spring-boot-starter-thymeleaf : thymeleaf 邮件模板依赖
- spring-boot-starter-freemarker : freemarker 邮件模板依赖
<!--引入springboot父工程依赖--> <!--引入依赖作用: 可以省去version标签来获得一些合理的默认配置 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!--两个用来做测试的jar包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!--thymeleaf 邮件模板--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--freemarker 邮件模板--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> </dependencies>
- 我这里用的qq邮箱测试
- 注意邮箱的 host 和 port
spring:
mail:
host: smtp.qq.com # SMTP服务器主机(我这里使用qq发送 所以 smtp主机就是qq)
port: 587 # QQ邮箱 SMTP port号:25 (使用SSL时,port号465或587)如果使用端口为465,将protocol的smtp改为smtps
username: 1326303027@qq.com # 发件人的邮箱
password: xnkdngXXXXXXXd # QQ邮箱的授权码(网上搜一下 qq怎么获取自己的SMTP授权码 就行 有好多攻略)
default-encoding: UTF-8 # 默认MimeMessage编码
properties: # 其他JavaMail会话属性。
mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory #配饰 SSL 加密工厂
test-connection: true #是否在启动时测试邮件服务器是否可用
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @创建人: Mhh * @创建时间: 2022/3/14 * @描述: 发送邮件启动类 */ @SpringBootApplication public class MailSpringApplication { public static void main(String[] args) { SpringApplication.run(MailSpringApplication.class,args); } }
- 发件人必须是配在yml里的
spring.mail.username
的值;- 密送的邮箱 : 会把邮件秘密抄送给指定的秘密邮箱;
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * @创建人: Mhh * @创建时间: 2022/3/14 * @描述: 发送邮件 */ @SpringBootTest @RunWith(SpringRunner.class) public class MailTest { /* * 发送邮件对象 * */ @Autowired private JavaMailSender javaMailSender; /* * thymeleaf html渲染对象 * */ @Autowired private TemplateEngine templateEngine; // @Value("${spring.mail.username}") // private String from; /* * 发送简单的邮件 * */ @Test public void sendSimpleMail() { SimpleMailMessage smm = new SimpleMailMessage(); // 主题 smm.setSubject("发送简单邮件主题"); // 发件人的邮箱 // smm.setFrom(from); smm.setFrom("1326303027@qq.com"); // 发送日期 smm.setSentDate(new Date(1646100707000L));//2022-03-01 10:11:47 // 要发给的邮箱(收件人) smm.setTo("1326303027@qq.com"); // 抄送邮箱 smm.setCc("1326303027@qq.com"); // 邮件内容 smm.setText("简单邮件正文\n 您好,今天又是美好的一天"); // 快速回复 smm.setReplyTo("1326303027@qq.com"); // 密送的邮箱 smm.setBcc("1326303027@qq.com"); // 发送邮件 javaMailSender.send(smm); } }
- 创建 MimeMessageHelper对象时 入参multipart 必须为true;
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * @创建人: Mhh * @创建时间: 2022/3/14 * @描述: 发送邮件 */ @SpringBootTest @RunWith(SpringRunner.class) public class MailTest { /* * 发送邮件对象 * */ @Autowired private JavaMailSender javaMailSender; /* * thymeleaf html渲染对象 * */ @Autowired private TemplateEngine templateEngine; // @Value("${spring.mail.username}") // private String from; /* * 发送邮件携带附件 * */ @Test public void sendAttachFileMail() throws MessagingException, IOException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); //这里携带附件(入参 multipart 必须为true) MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); // 主题 helper.setSubject("发送邮件携带附件"); // 邮件内容 helper.setText("邮件正文\n 此邮件 携带附件 请查收"); // 发件人的邮箱 // smm.setFrom(from); helper.setFrom("1326303027@qq.com"); // 发送日期 helper.setSentDate(new Date()); // 要发给的邮箱 helper.setTo("1326303027@qq.com"); // 密送的邮箱 helper.setBcc("1326303027@qq.com"); // 抄送邮箱 helper.setCc("1326303027@qq.com"); // 快速回复 helper.setReplyTo("1326303027@qq.com"); // 附件(多个 就addAttachment()多个) FileSystemResource resource = new FileSystemResource(new File("D:\\采购需求单.xls")); helper.addAttachment( Objects.requireNonNull(resource.getFilename()),//附件名称 resource, //附件流 Files.probeContentType(Paths.get(Objects.requireNonNull(resource.getFilename()))));//附件类型 helper.addAttachment( Objects.requireNonNull(resource.getFilename()),//附件名称 resource,//附件流 Files.probeContentType(Paths.get(Objects.requireNonNull(resource.getFilename()))));//附件类型 //发送邮件 javaMailSender.send(mimeMessage); } }
- 内嵌式 : 只能是图片
- 邮件内容 : 配置html渲染 所以入参要填true
图片内嵌 邮件内容的 cid:{值}要和addInLine里的入参 contentId一致
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * @创建人: Mhh * @创建时间: 2022/3/14 * @描述: 发送邮件 */ @SpringBootTest @RunWith(SpringRunner.class) public class MailTest { /* * 发送邮件对象 * */ @Autowired private JavaMailSender javaMailSender; /* * thymeleaf html渲染对象 * */ @Autowired private TemplateEngine templateEngine; // @Value("${spring.mail.username}") // private String from; /* * 发送邮件 图片内嵌式 * */ @Test public void sendImgResMail() throws MessagingException, IOException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); //这里携带附件(入参 multipart 必须为true) MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); // 主题 helper.setSubject("图片内嵌式邮件主题"); // 发件人的邮箱 // smm.setFrom(from); helper.setFrom("1326303027@qq.com"); // 发送日期 helper.setSentDate(new Date()); // 要发给的邮箱 helper.setTo("1326303027@qq.com"); // 密送的邮箱 helper.setBcc("1326303027@qq.com"); // 抄送邮箱 helper.setCc("1326303027@qq.com"); // 快速回复 helper.setReplyTo("1326303027@qq.com"); // 邮件内容(html渲染 所以要填true) helper.setText("<p>hello 大家好,这是一封测试邮件,这封邮件包含两种图片,分别如下</p><p>第一张图片:</p><img src='cid:aa'/><p>第二张图片:</p><img src='cid:bb'/>",true); // 图片内嵌 邮件内容的 cid:{值}要和addInLine里的入参 contentId一致 FileSystemResource aaResource = new FileSystemResource(new File("D:\\aa.png")); FileSystemResource bbResource = new FileSystemResource(new File("D:\\bb.jpg")); helper.addInline("aa", aaResource); helper.addInline("bb", bbResource); //发送邮件 javaMailSender.send(mimeMessage); } }
<!--thymeleaf 邮件模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
resources/templates
下<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Thymeleaf: 放假通知</title>
</head>
<body>
<div>各位小伙伴们:</div><br>
<div><span style="color: red" th:text="${festival}"></span>即将到来,在此祝大家节日快乐!</div>
<div>根据公司安排将于<span style="color: #ff0000" th:text="${date}"></span>放假,请知悉。</div>
<p style="color: blue">内嵌图片:</p>
<br/>
<div><img src='cid:aa'/></div>
</body>
</html>
- 通过 Context 邮件模板进行配置需要参数
- 其中festival、date是模板参数,需要发送邮件时传给模板(模板参数自己随便定义 只要相互对应起来)
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * @创建人: Mhh * @创建时间: 2022/3/14 * @描述: 发送邮件 */ @SpringBootTest @RunWith(SpringRunner.class) public class MailTest { /* * 发送邮件对象 * */ @Autowired private JavaMailSender javaMailSender; /* * thymeleaf html渲染对象 * */ @Autowired private TemplateEngine templateEngine; // @Value("${spring.mail.username}") // private String from; /* * Thymeleaf邮件模板发送邮件(携带内嵌图片+附件):注意 FreemarkerMail与Thymeleaf的html写法不一样 * */ @Test public void sendThymeleafMail() throws MessagingException, IOException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); // 主题 helper.setSubject("Thymeleaf邮件模板 邮件主题"); // 发件人的邮箱 // smm.setFrom(from); helper.setFrom("1326303027@qq.com"); // 发送日期 helper.setSentDate(new Date()); // 要发给的邮箱 helper.setTo("1326303027@qq.com"); // 密送的邮箱 helper.setBcc("1326303027@qq.com"); // 抄送邮箱 helper.setCc("1326303027@qq.com"); // 快速回复 helper.setReplyTo("1326303027@qq.com"); //开始配置FreeMarker邮件模板 Context context = new Context(); //FreeMarker邮件模板参数 context.setVariable("festival", "春节"); context.setVariable("date", "2022-01-01"); //thymeleaf.html:映射的html名字 String process = templateEngine.process("thymeleaf.html", context); //邮件内容(html渲染 所以要填true) helper.setText(process, true); //内嵌图片 FileSystemResource aaResource = new FileSystemResource(new File("D:\\aa.png")); // 内嵌的名字 'aa'要和 html里img标签中cid:{值}一致 helper.addInline("aa", aaResource); // 附件(多个 就addAttachment()多个) FileSystemResource resource = new FileSystemResource(new File("D:\\采购需求单.xls")); helper.addAttachment( Objects.requireNonNull(resource.getFilename()),//附件名称 resource, //附件流 Files.probeContentType(Paths.get(Objects.requireNonNull(resource.getFilename()))));//附件类型 // 发送邮件 javaMailSender.send(mimeMessage); } }
<!--freemarker 邮件模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
resources/templates
下
- 这里的和thymeleaf的区别在于 freemarker可以放在自己随便的定义的包下(只要在代码中指定哪个包下就行)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Freemarker: 放假通知</title>
</head>
<body>
<div>各位小伙伴们:</div><br>
<div><span style="color: red">${festival}</span>即将到来,在此祝大家节日快乐!</div>
<div>根据公司安排将于<span style="color: red">${date}</span>放假,请知悉。</div>
<p style="color: green">内嵌图片:</p>
<br/>
<div><img src='cid:aa'/></div>
</body>
</html>
- 通过 Configuration 邮件模板进行配置需要参数以及模板位置和模板名称
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** * @创建人: Mhh * @创建时间: 2022/3/14 * @描述: 发送邮件 */ @SpringBootTest @RunWith(SpringRunner.class) public class MailTest { /* * 发送邮件对象 * */ @Autowired private JavaMailSender javaMailSender; /* * thymeleaf html渲染对象 * */ @Autowired private TemplateEngine templateEngine; // @Value("${spring.mail.username}") // private String from; /* * * FreemarkerMail 邮件模板发送邮件(带内嵌图片): 注意 FreemarkerMail与Thymeleaf的html写法不一样 * */ @Test public void sendFreemarkerMail() throws MessagingException, IOException, TemplateException { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); // 因为要携带附件所以为true MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); // 主题 helper.setSubject("FreemarkerMail 邮件模板 邮件主题"); // 发件人的邮箱 // smm.setFrom(from); helper.setFrom("1326303027@qq.com"); // 发送日期 helper.setSentDate(new Date()); // 要发给的邮箱 helper.setTo("1326303027@qq.com"); // 密送的邮箱 helper.setBcc("1326303027@qq.com"); // 抄送邮箱 helper.setCc("1326303027@qq.com"); // 快速回复 helper.setReplyTo("1326303027@qq.com"); //构建 Freemarker 的基本配置 Configuration configuration = new Configuration(Configuration.VERSION_2_3_0); // 配置模板位置 ClassLoader loader = this.getClass().getClassLoader(); //模板的位置 在templates包下 configuration.setClassLoaderForTemplateLoading(loader, "templates"); //加载模板(入参具体模板名称) Template template = configuration.getTemplate("freemarker.html"); //模板参数 Map<String,Object> map = new HashMap();//可以自定义自己的对象 map.put("date","2022-05-01"); map.put("festival","劳动节"); StringWriter out = new StringWriter(); //模板渲染,渲染的结果将被保存到 out 中 ,将out 中的 html 字符串发送即可 template.process(map, out); //邮件内容(html渲染 所以要填true) helper.setText(out.toString(), true); //内嵌图片 FileSystemResource aaResource = new FileSystemResource(new File("D:\\aa.png")); // 内嵌的名字 'aa'要和 html里img标签中cid:{值}一致 helper.addInline("aa", aaResource); // 附件(多个 就addAttachment()多个) FileSystemResource resource = new FileSystemResource(new File("D:\\采购需求单.xls")); helper.addAttachment( Objects.requireNonNull(resource.getFilename()),//附件名称 resource, //附件流 Files.probeContentType(Paths.get(Objects.requireNonNull(resource.getFilename()))));//附件类型 // 发送邮件 javaMailSender.send(mimeMessage); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。