最近在项目中用到一个定时通知功能,通知就联想到一个邮件通知的方式,此外通过邮件我们还可以进行用户通过邮件注册、通过邮件找回密码等功能,这篇博客就简单介绍以下邮件的发送功能。
在Java中,我们可以使用JavaMail API向任何电子邮件地址发送邮件,但是配置较为繁琐。Spring框架提供了一个JavaMailSender接口,进一步简化了邮件的配置,通过自动化配置类MailSenderAutoConfiguration,使得在Spring Boot应用中使用JavaMailSender更加方便。
在pom.xml中导入邮件实现依赖
-
org.springframework.boot -
spring-boot-starter-mail
下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击开启,按照qq邮箱提示进行一步步验证,最后获得授权吗,记得复制,授权码可重复进行申请,每次申请的授权码可能不同。
该配置为yml格式配置
- spring:
- mail:
- #配置smtp服务主机地址
- # qq邮箱为smtp.qq.com 端口号465或587
- # sina smtp.sina.cn
- # aliyun smtp.aliyun.com
- # 163 smtp.163.com 端口号465或994
- host: smtp.qq.com
- #发送者邮箱
- username: xxxx@qq.com
- #配置密码,注意不是真正的密码,而是刚刚申请到的授权码
- password: xxxxx
-
- #端口号465或587
- port: 587
- #默认的邮件编码为UTF-8
- default-encoding: UTF-8
- #其他参数
- properties:
- mail:
- #配置SSL 加密工厂
- smtp:
- ssl:
- #本地测试,先放开ssl
- enable: false
- required: false
- #开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误
- debug: true
- @Resource
- private JavaMailSender javaMailSender;
-
- @Override
- public void sendSimpleMail(String from, String to, String subject, String text) {
- SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
- // 发件人
- simpleMailMessage.setFrom(from);
- // 收件人
- simpleMailMessage.setTo(to);
- // 邮件主题
- simpleMailMessage.setSubject(subject);
- // 邮件内容
- simpleMailMessage.setText(text);
- javaMailSender.send(simpleMailMessage);
- }
- @GetMapping("/sendSimpleMail")
- public void sendSimpleMail() {
- empRetireService.sendSimpleMail("发送方@qq.com",
- "接收方@qq.com",
- "test",
- "感谢你这么可爱,这么优秀!!!!!!");
- }
邮件展示:
很多时候,邮件不止有简单的文字,很多邮件还可以携带样式和附件。
使用 javaMailSender
创建一个 MimeMessage
实例,用 MimeMessageHelper
设置开启内嵌和附件功能,然后通过 addInline
方法嵌入图片,addAttachment
方法添加附件。
- @Override
- public ResponseEntity
sendMimeMail(String from, String to, String subject, String text) { - MimeMessage mimeMessage = javaMailSender.createMimeMessage();
- try {
- //辅助创建MIME消息的类,使用它可以更加方便地创建和发送电子邮件。true表示创建的是表示创建的是多部分消息
- MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
- helper.setFrom(from);
- helper.setTo(to);
- helper.setSubject(subject);
- // 过调用helper.setText(text, true)设置邮件的内容,第二个参数true表示将邮件内容解析为HTML格式。您可以在text参数中编写HTML代码或普通文本。
- helper.setText(text, true);
- //通过调用helper.addInline()方法,将路径下的图片资源嵌入到邮件中。logo是嵌入资源的ID,可以在邮件内容中通过引用该ID来显示图片
- helper.addInline("phone", new FileSystemResource("C:\\Users\\ASUS\\Desktop\\test图片\\"+"2020122122203861963.jpg"));
- //添加附件:通过调用helper.addAttachment()方法,将doc/logo.pdf路径下的PDF文件作为附件添加到邮件中。logo.pdf是附件的文件名,可以在邮件中显示该附件并提供下载。
- helper.addAttachment("20205622141367241.jpg", new FileSystemResource("C:\\Users\\ASUS\\Desktop\\test图片\\"+"20205622141367241.jpg"));
- javaMailSender.send(mimeMessage);
- return ResponseEntity.status(HttpStatus.CREATED).body("发送成功");
- } catch (MessagingException e) {
- e.printStackTrace();
- return ResponseEntity.status(HttpStatus.NOT_FOUND).body("e.getMessage()");
- }
- }
*注意事项:
addAttachment
方法的第二个参数可指定附件文件的资源对象,可以使用ClassPathResource
、FileSystemResource
、ByteArrayResource
等实现:
ClassPathResource
:用于从类路径中加载资源文件。它使用相对于类路径的路径来查找并加载资源。FileSystemResource
:用于从文件系统中加载资源文件。它使用绝对或相对于当前工作目录的路径来查找并加载资源。以为我是直接从本地文件直接获取图片,所以采用FileSystemResource。
ByteArrayResource
:用于将字节数组作为资源进行封装。它适用于将内存中的数据作为资源传递,而不是从文件系统或类路径加载。- @GetMapping("/sendMimeMail")
- public ResponseEntity
sendMimeMail() { - return empRetireService.sendMimeMail("2842168871@qq.com",
- "ly1398650@163.com",
- "test1",
- "
感谢你这么可爱,这么优秀!!!!!!
"+""); - }
邮箱展示: