第18章 Java Mail邮件发送
分类: springboot 专栏: springboot3.0新教材 标签: javamail
2024-03-05 17:21:42 716浏览
发送简单邮件
首先需要对拥有的邮箱申请开启 POP3/ SMTP 服务,获取授权码,授权码记录下来,后面项目实例会用到
以网易邮箱为例
- 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- application文件
spring.mail.host=smtp.163.com
spring.mail.port=587
spring.mail.username=15336574540@163.com
spring.mail.password=换成你的授权码
spring.mail.default-encoding=utf-8
#这个配置用于设置邮件传输协议(SMTP)的 SocketFactory 类,
# 这里指定为 javax.net.ssl.SSLSocketFactory,
# 表示使用 SSL 加密协议进行邮件传输,确保邮件内容在传输过程中是加密的,
# 提高安全性。
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
#这个配置开启了邮件调试模式,会在控制台输出更详细的邮件传输日志信息,
# 方便进行故障排查和调试。在开发和测试阶段,
spring.mail.properties.mail.debug=true
注意:username改为个人邮箱名,password改成刚刚生成的授权码
- 实体类
创建实体类 Mail 封装邮件信息,包括收件人,发件人,抄送人,标题,邮件内容, 附件等多种属性。
@Data
@AllArgsConstructor
public class Mail {
private String from;//发件人
private String to;//收件人
private String cc;//抄送人
private String subject;//标题
private String content;//邮件内容
private File file;//附件
}
- service
创建 MailService 类,调用 JavaMailSender 实例发送简单邮件
@Service
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
//发送简单邮件
public void sendSimpleMailMessage(Mail mail){
System.out.println(mail);
//封装simpleMailMessage对象
SimpleMailMessage simpleMailMessage=new SimpleMailMessage();
simpleMailMessage.setFrom(mail.getFrom());
simpleMailMessage.setTo(mail.getTo());
simpleMailMessage.setCc(mail.getCc());
simpleMailMessage.setSubject(mail.getSubject());
simpleMailMessage.setText(mail.getContent());
javaMailSender.send(simpleMailMessage); //发送
}
}
- controller
@Controller
public class MailController {
@Autowired
MailService mailService;
@ResponseBody
@PostMapping("/sendSimpleMail")
public String sendSimpleMail(Mail mail){
mailService.sendSimpleMailMessage(mail);
return "简单邮件发送成功!";
}
}
- 邮件界面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="sendSimpleMail" method="post">
发送者邮箱:<input type="text" name="from"/><br/>
收件人邮箱:<input type="text" name="to"/><br/>
抄送人邮箱:<input type="text" name="cc"/><br/>
邮件的主题:<input type="text" name="subject"/><br/><br/>
邮件的内容:<textarea rows="10" cols="40" name="content"></textarea><br/>
<input type="submit" value="发送">
</form>
</body>
</html>
发送带附件的邮件
- 修改controller
MailController添加sendMailWithFile()方法,关键点是要发送的附件要先上传到服务器中来,参数 uploadfile 用来接收上传文件。
@ResponseBody
@PostMapping("/sendMailWithFile")
public String sendMailWithFile(Mail mail, MultipartFile uploadfile, HttpServletRequest request) throws IOException {
//存储上传文件的目标文件夹(服务器上的,每个人的路径都不同,按个人实际情况设置)
String path="D:\\upimgs\\email";
String filename=uploadfile.getOriginalFilename(); //获取上传的文件名称
File file=new File(path,filename); //构造上传目标File
uploadfile.transferTo(file);//上传文件
mail.setFile(file); //将上传文件设置到要发送的邮件的附件
mailService.sendMailWithFile(mail);
return "带附件邮件发送成功!";
}
- service增加方法
public void sendMailWithFile(Mail mail) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(mail.getFrom());
mimeMessageHelper.setTo(mail.getTo());
mimeMessageHelper.setCc(mail.getCc());
mimeMessageHelper.setSubject(mail.getSubject());
mimeMessageHelper.setText(mail.getContent());
//添加附件
mimeMessageHelper.addAttachment(mail.getFile().getName(),mail.getFile());
javaMailSender.send(mimeMessage);
}catch (MessagingException e){
e.printStackTrace();
}
}
- 前端页面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="sendMailWithFile" enctype="multipart/form-data" method="post">
发送者邮箱:<input type="text" name="from"/><br/>
收件人邮箱:<input type="text" name="to"/><br/>
抄送人邮箱:<input type="text" name="cc"/><br/>
邮件的主题:<input type="text" name="subject"/><br/><br/>
邮件的内容:<textarea rows="10" cols="40" name="content"></textarea><br/>
邮件的附件:<input type="file" name="uploadfile"/><br/>
<input type="submit" value="发送">
</form>
</body>
</html>
发送模板邮件
可以在 HTML 文件中使用 thymeleaf 创建好邮件模板,从前端获取真实数据后,数据与模板合并成完整邮件再发送。需要注入TemplateEngine 实例进行合并模板与数据。
service层
@Autowired
TemplateEngine templateEngine;
//发送模板邮件
public void sendTempateMail(Mail mail,String username,String orderNo,String amount,String mobile){
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(mail.getFrom());
mimeMessageHelper.setTo(mail.getTo());
mimeMessageHelper.setCc(mail.getCc());
mimeMessageHelper.setSubject(mail.getSubject());
Context context=new Context();
context.setVariable("username",username);
context.setVariable("orderNo",orderNo);
context.setVariable("amount",amount);
context.setVariable("mobile",mobile);
//合并模板与数据
String content= templateEngine.process("templateMail.html",context);
mimeMessageHelper.setText(content,true);
javaMailSender.send(mimeMessage);
}catch (MessagingException e){
e.printStackTrace();
}
}
}
Control层
@ResponseBody
@PostMapping("/sendTemplateMail")
public String sendTemplateMail(Mail mail,String username,String orderNo,String amount,String mobile){
mailService.sendTempateMail(mail,username,orderNo,amount,mobile);
return "模板邮件发送成功!";
}
邮件模板代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>邮件模板</title>
</head>
<body>
尊敬的<span th:text="${username}"></span>用户!<br/>
感谢你购买本公司产品,你的订单号是:<span th:text="${orderNo}"></span><br/>
金额:<span th:text="${amount}"></span><br/>
收货人手机:<span th:text="${mobile}"></span><br/>
</body>
</html>
在 resource/static 目录下创建发送邮件界面 sendTemplateMail.html,关键代码如下。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="sendTemplateMail" method="post">
发送者邮箱:<input type="text" name="from"/><br/>
收件人邮箱:<input type="text" name="to"/><br/>
抄送人邮箱:<input type="text" name="cc"/><br/>
邮件的主题:<input type="text" name="subject"/><br/><br/>
邮件模板:<br/>
用户名:<input type="text" name="username"/><br/>
订单号:<input type="text" name="orderNo"/><br/>
总金额:<input type="text" name="amount"/><br/>
手机号:<input type="text" name="mobile"/><br/>
<input type="submit" value="发送">
</form>
</body>
</html>
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客