当前位置: 首页 > news >正文

实现邮件发送

实现发送邮件的功能,可以在判定用户异地登录后发送邮件提醒或者使用邮件发送验证码的多种使用场景。

引入邮件依赖

<!--邮件发送依赖包-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--freemarker制作Html邮件模板依赖包-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

主要是引入了spring-boot-starter-mail和spring-boot-starter-freemarker的相关jar包。

其中,spring-boot-starter-mail是为了提供发生邮件的功能。

spring-boot-starter-freemarker是为了提供处理模板文件的功能。

配置邮箱参数

需要在application.yml文件中配置邮箱发送的相关参数(以QQ为例)

QQ邮箱授权码获取:https://service.mail.qq.com/detail/0/75

spring:mail:protocol: smtphost: smtp.qq.comport: 465username: xxxx@qq.com #你的邮箱password: xxxxxxxx  #你的授权码properties:mail:smtp:auth: truessl:enable: truesocketFactory:class: com.mysql.cj.jdbc.Socks5SocketFactoryfallback: true

增加发邮件类

创建IEmailService接口,为了对发邮件的功能指定一个规范,后面系统如果对接了其他的发邮件功能,也可以使用这套规范。

package com.kailong.service.email;import javax.mail.MessagingException;
import java.util.List;public interface IEmailService {/*** 发送简单文本邮件** @param receiveEmail 收件人邮箱* @param subject      主题* @param content      内容*/void sendEmail(String receiveEmail, String subject, String content);/*** 发送HTML格式的邮件** @param receiveEmail 收件人邮箱* @param subject      主题* @param htmlContent  内容* @throws MessagingException*/void sendHtmlEmail(String receiveEmail, String subject, String htmlContent) throws MessagingException;/*** 发送包含附件的邮件** @param receiveEmail 收件人邮箱* @param subject      主题* @param emailContent 内容* @param filePathList 附件地址* @throws MessagingException 异常*/void sendAttachmentsEmail(String receiveEmail, String subject, String emailContent, List<String> filePathList) throws MessagingException;
}

这个接口中定义了三个方法:

  1. 发生简单邮件。
  2. 发生html格式邮件。
  3. 发生带附件的邮件。

实现接口:

@Service
public class EmailServiceImpl implements IEmailService {@Autowiredprivate JavaMailSender javaMailSender;@Value("${spring.mail.username}")private String fromEmail;/*** 发送简单文本邮件** @param receiveEmail 收件人邮箱* @param subject      主题* @param content      内容*/@Overridepublic void sendEmail(String receiveEmail, String subject, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(fromEmail);message.setTo(receiveEmail);message.setSubject(subject);message.setText(content);javaMailSender.send(message);}/*** 发送HTML格式的邮件** @param receiveEmail 收件人邮箱* @param subject      主题* @param htmlContent  内容* @throws MessagingException*/@Overridepublic void sendHtmlEmail(String receiveEmail, String subject, String htmlContent) throws MessagingException {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(fromEmail);helper.setTo(receiveEmail);helper.setSubject(subject);helper.setText(htmlContent, true);javaMailSender.send(message);}/*** 发送包含附件的邮件** @param receiveEmail 收件人邮箱* @param subject      主题* @param emailContent 内容* @param filePathList 附件地址* @throws MessagingException 异常*/@Overridepublic void sendAttachmentsEmail(String receiveEmail, String subject, String emailContent, List<String> filePathList) throws MessagingException {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(fromEmail);helper.setTo(receiveEmail);helper.setSubject(subject);helper.setText(emailContent, true);//添加附件资源for (String item : filePathList) {FileSystemResource file = new FileSystemResource(new File(item));String fileName = item.substring(item.lastIndexOf(File.separator));helper.addAttachment(fileName, file);}//发送邮件javaMailSender.send(message);}
}

创建测试接口:

@RestController
@RequestMapping("/job")
public class TestController {private static final String SUCCESS = "success";@Autowiredprivate EmailServiceImpl emailService;@GetMapping("/test")public String test() {return SUCCESS;}@GetMapping("/sendEmail")public String sendEmail() {emailService.sendEmail("12lisu@163.com", "test", "test123");return SUCCESS;}
}

效果测试:

  • 获取用户ip所在城市
  • 记录用户业务请求日志
http://www.hskmm.com/?act=detail&tid=20885

相关文章:

  • AGC073C 赛后补题记录
  • LuatOS赋能Air780EPM:FTP通信开发教程正式上线!
  • DM40万用表为何全网爆火?!它有哪些与众不同?DM40万用表比肩千元级表,让您轻松实现专业级测量自由!
  • 树形dp [POI 2013] LUK-Triumphal arch
  • 【论术】t-design tree组件判断点击了角标还是label
  • leetCode刷题记录1
  • k8s下部署kuboard
  • ACL 第一周模拟赛题解
  • 万象EXCEL开发(三)格式解读calcChain.xml——东方仙盟练气期 - 指南
  • 302、寄门人
  • 达梦数据库用户开启限制白名单导致自身无法登录
  • 【转发】Nginx配置https
  • 本地文件多人多端同步工具:10款高性价比选择
  • 打破AI孤岛:CIO集成实战指南
  • 密码学学习记录(四)
  • Sharding-Proxy、ShardingSphere 和 Sharding-JDBC区别
  • echarts4升级为echarts5的常见问题
  • ISO 周计算 记录
  • 从 “被动耗能” 到 “主动优化”:MyEMS 开启商业建筑能源管理 “新范式”
  • 【故障排查】视频汇聚EasyCVR接入设备通道数为0?通道编码长度不规范导致
  • 来信小程序管理系统:匿名信息传递与社交互动平台
  • PCIe加速卡设计资料:416-基于Kintex Ultrasacle的万兆网络光纤 PCIe加速卡
  • 多生产者,多消费者
  • GEO优化实战指南:一周内让豆包、Deepseek、Kimi等推荐了我的插件
  • 房产楼盘小程序管理系统:助力房产营销数字化升级的优质解决方案
  • 高速信号处理设计方案:413-基于双XCVU9P+C6678的100G光纤加速卡
  • Teamcenter:结构管理器查询(又称:BOM结构查询)
  • 2025年最好用的同步云盘是哪个?一个老用户的真实体验分享
  • 使用 ShedLock 实现多实例定时任务单执行的常见错误及解决办法
  • 1_二分查找