第18章 Java Mail邮件发送

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: springboot 专栏: springboot3.0新教材 标签: javamail

2024-03-05 17:21:42 486浏览

Java Mail邮件发送

发送简单邮件

首先需要对拥有的邮箱申请开启 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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695