SpringBoot发送邮件附件(超详细讲解)

àì夳堔傛蜴生んèń 2023-07-13 12:25 40阅读 0赞

现在发送邮件是一个网站必备的功能,比如注册激活,或者忘记密码等等都需要发送邮件。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。也就是我们使用SpringBoot来发送邮件的话,代码就简单许多,毕竟SpringBoot是开箱即用的 ,它提供了什么,我们了解之后觉得可行,就使用它,自己没必要再写原生的。

发送邮件流程图

在这里插入图片描述
现在的Java项目大多都是按照MVC架构模型来开发的,但是这里不使用Controller层,是直接在测试中发送邮件,假如测试中发送邮件成功,那么改为用户发送请求来发送邮件也会成功。发送邮件,也就是要有发送方和接收方,我们需要在系统中配置发送方的信息,而接受方的信息我们需要根据从客户端发来的请求决定。作为发送方的我们,需要被授权,被谁授权?

  1. 假如我使用QQ邮箱发送邮件,那么我就需要开启QQ邮箱授权码。
  2. 假如我使用网易邮箱发送邮件,那我就需要开启网易邮箱授权码。

我们接下来就一 一开启这两个邮箱的授权码

  1. 开启QQ邮箱授权码
    在这里插入图片描述
  2. 开启网易邮箱授权码
    在这里插入图片描述

上图的步骤都会生成授权码,我们需要记住它,可以选择保存在本地电脑上,因为我们接下来配置发送方信息需要授权码。
接下来我们就开始编写代码发送邮件,我们使用IDEA创建SpringBoot项目,下篇博客可以快速了解如何在IDEA中创建SpringBoot项目。
SpringBoot快速入门

导入依赖

spring-boot-starter-mail:这个启动器内部封装了发送邮件的代码,必须引入的。
spring-boot-starter-web:这个启动器整合了JavaWeb常用的功能,如果只是简单在测试中发送邮件,那么就不需要引入它。
spring-boot-starter-thymeleaf:模板引擎依赖,如果需要将数据渲染到页面上,就需要引入它。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-mail</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-web</artifactId>
  12. </dependency>

配置发送方信息

我们需要在SpringBoot配置文件(application.yml)中配置发送方的信息,包括以下信息:

  1. 用户名:也就是我们的邮箱账号
  2. 密码:我们刚刚生成的授权码
  3. 邮箱主机:配置使用哪个邮箱服务器发送邮件
    还有等等其他可选配置,在下面配置代码中,大家需要填写自己的用户名、密码、from(和用户名一样)。

QQ邮箱配置

  1. spring:
  2. mail:
  3. host: smtp.qq.com #发送邮件服务器
  4. username: #发送邮件的邮箱地址
  5. password: #客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
  6. properties.mail.smtp.port: 465 #端口号465或587
  7. from: # 发送邮件的地址,和上面username一致
  8. properties.mail.smtp.starttls.enable: true
  9. properties.mail.smtp.starttls.required: true
  10. properties.mail.smtp.ssl.enable: true
  11. default-encoding: utf-8

网易邮箱配置

  1. spring:
  2. mail:
  3. host: smtp.163.com #发送邮件服务器
  4. username: #发送邮件的邮箱地址
  5. password: #客户端授权码,不是邮箱密码,网易的是自己设置的
  6. properties.mail.smtp.port: 994 #465或者994
  7. from: # 发送邮件的地址,和上面username一致
  8. properties.mail.smtp.starttls.enable: true
  9. properties.mail.smtp.starttls.required: true
  10. properties.mail.smtp.ssl.enable: true
  11. default-encoding: utf-8

EmailService

我们需要自己封装邮件服务,这个服务只是便于Controller层调用,也就是根据客户端发送的请求来调用,封装三种邮件服务

  1. 发送普通文本邮件
  2. 发送HTML邮件:一般在注册激活时使用
  3. 发送带附件的邮件:可以发送图片等等附件

    public interface EmailService {

    /* 发送文本邮件 @param to 收件人 @param subject 主题 @param content 内容 /
    void sendSimpleMail(String to, String subject, String content);

    /* 发送HTML邮件 @param to 收件人 @param subject 主题 @param content 内容 /
    void sendHtmlMail(String to, String subject, String content);

    /* 发送带附件的邮件 @param to 收件人 @param subject 主题 @param content 内容 @param filePath 附件 */
    public void sendAttachmentsMail(String to, String subject, String content, String filePath);
    }

EmailServiceImpl

我们需要实现上面的邮件服务,在具体的实现里面,则是调用了SpringBoot提供的JavaMailSender(封装了发送邮件的代码)。

  1. @Service
  2. public class EmailServiceImpl implements EmailService {
  3. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  4. @Autowired
  5. private JavaMailSender javaMailSender;
  6. //注入配置文件中配置的信息——>from
  7. @Value("${spring.mail.from}")
  8. private String from;
  9. @Override
  10. public void sendSimpleMail(String to, String subject, String content) {
  11. SimpleMailMessage message = new SimpleMailMessage();
  12. //发件人
  13. message.setFrom(from);
  14. //收件人
  15. message.setTo(to);
  16. //邮件主题
  17. message.setSubject(subject);
  18. //邮件内容
  19. message.setText(content);
  20. //发送邮件
  21. javaMailSender.send(message);
  22. }
  23. @Override
  24. public void sendHtmlMail(String to, String subject, String content) {
  25. MimeMessage message = javaMailSender.createMimeMessage();
  26. MimeMessageHelper messageHelper;
  27. try {
  28. messageHelper = new MimeMessageHelper(message,true);
  29. messageHelper.setFrom(from);
  30. messageHelper.setTo(to);
  31. message.setSubject(subject);
  32. messageHelper.setText(content,true);
  33. javaMailSender.send(message);
  34. logger.info("邮件已经发送!");
  35. } catch (MessagingException e) {
  36. logger.error("发送邮件时发生异常:"+e);
  37. }
  38. }
  39. @Override
  40. public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
  41. MimeMessage message = javaMailSender.createMimeMessage();
  42. MimeMessageHelper messageHelper;
  43. try {
  44. messageHelper = new MimeMessageHelper(message,true);
  45. messageHelper.setFrom(from);
  46. messageHelper.setTo(to);
  47. messageHelper.setSubject(subject);
  48. messageHelper.setText(content,true);
  49. //携带附件
  50. FileSystemResource file = new FileSystemResource(filePath);
  51. String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
  52. messageHelper.addAttachment(fileName,file);
  53. javaMailSender.send(message);
  54. logger.info("邮件加附件发送成功!");
  55. } catch (MessagingException e) {
  56. logger.error("发送失败:"+e);
  57. }
  58. }
  59. }

EmailServiceTest

我们直接在测试中发送邮件,如果测试中发送邮件没问题,那么转为用户请求发送邮件也没有问题的。

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class EmailServiceTest{
  4. @Autowired
  5. private EmailService emailService;
  6. @Test
  7. public void sendSimpleEmail(){
  8. String content = "你好,恭喜你...";
  9. emailService.sendSimpleMail("XXX@qq.com","祝福邮件",content);
  10. }
  11. @Test
  12. public void sendMimeEmail(){
  13. String content = "<a href='https://blog.csdn.net/'>你好,欢迎注册网站,请点击链接激活</a>";
  14. emailService.sendHtmlMail("XXX@163.com","激活邮件",content);
  15. }
  16. @Test
  17. public void sendAttachment(){
  18. emailService.sendAttachmentsMail("XX@qq.com","发送附件","这是Java体系图","F:/图片/爱旅行.jpg");
  19. }
  20. }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样我们就实现了提供Java代码来发送邮件。发送附件功能其实就是读取我们本地电脑的文件,然后添加到发送流中即可。
发送邮件附件的源代码

发表评论

表情:
评论列表 (有 0 条评论,40人围观)

还没有评论,来说两句吧...

相关阅读