实现发送邮件的功能,可以在判定用户异地登录后发送邮件提醒或者使用邮件发送验证码的多种使用场景。
引入邮件依赖
<!--邮件发送依赖包-->
<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;
}
这个接口中定义了三个方法:
- 发生简单邮件。
- 发生html格式邮件。
- 发生带附件的邮件。
实现接口:
@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所在城市
- 记录用户业务请求日志