发送邮件的总结博客
前言
其实发送邮件是一个比较简单的操作,只是之前都没进行总结,这里汇总一下,大体分为四个大类:1、发送简单文本邮件。2、发送带有附件的邮件。3、发送带有HTML链接的邮件。4、发送模板渲染的邮件。
准备工作
通篇会以QQ邮箱为例来进行举例,并通过自己给自己发邮件的方式来完成实例。需要做的准备工作其实分为两个,一个是程序中相关配置的导入,另一个是自己邮箱SMTP服务的开通。
开通SMTP服务
1、进入自己的邮箱,然后找到设置按钮
2、进入到账户选项卡
3、然后找到下面的开通POP3/SMTP服务的选项
我这里已经是开通了,如果需要开通,还需要点击下面的生成授权码,然后将授权码配置到自己的本地文件中,之后点击页面中的保存设置,搞定。
引入相关配置
1、引入mail服务的依赖
<!--email-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、引入邮件的相关配置
##发送邮件的配置信息
spring.mail.host=smtp.qq.com
spring.mail.port=587 //相关端口,这个
spring.mail.username=********* //这里配置自己的邮件用户名
spring.mail.password=********* //这里就是配置的授权码
spring.mail.protocol=smtp
spring.mail.needAuth=true
spring.mail.sslClass=javax.net.ssl.SSLSocketFactory //指定加密认证方式
至此完成我们所有的准备工作,可以开始具体实例了
![](/qrcode.jpg)
发送简单文本邮件
配置完成之后,直接在自己定义的服务类中,注入JavaMailSender就可以了,这里直接贴上代码
@Autowired
private JavaMailSender mailSender;
/**
* 发送简单的文本消息邮件
*
* @param subject 邮件主题
* @param content 邮件内容
* @param tos 目的邮箱(可以多个)
*/
public void sendSimpleMail(final String subject, final String content, final String[] tos) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//这里写在配置文件中了,这里应该指定自己的邮件服务器的账户
simpleMailMessage.setFrom(environment.getProperty("mail.send.from")); //指定那个人发的
simpleMailMessage.setTo(tos); //指定邮件发往何处
simpleMailMessage.setSubject(subject); //指定发送邮件的主题
simpleMailMessage.setText(content);
mailSender.send(simpleMailMessage);
log.info("简单文本邮件发送成功:{}", simpleMailMessage);
}
controller测试的代码
@RequestMapping(value = prefix + "/send/simple", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse sendSimpleMail(@RequestBody @Validated MailRequest mailRequest, BindingResult bindingResult) {
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
String checkResult = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(checkResult)) {
return new BaseResponse(StatusCode.Invalid_Params);
}
log.info("发送简单文本邮件参数为:{}", mailRequest);
String[] mailTos = StringUtils.split(mailRequest.getMailTos(), ",");
//只需要关注这个就可以,这个就是调用service的发送邮件
mailService.sendSimpleMail(mailRequest.getSubject(), mailRequest.getContent(), mailTos);
} catch (Exception e) {
response = new BaseResponse(StatusCode.Fail);
log.error("发送邮件异常:{}", e);
}
return response;
}
发送带有附件的邮件
发送带有附件文件的邮件,需要配置附件文件的地址
#附件文件的文件夹地址
mail.send.attachment.location.root.url=D:\\MailAttachment
##第一个附件文件的文件名和文件地址
mail.send.attachment.one.location=${mail.send.attachment.location.root.url}\\image1.jpg
mail.send.attachment.one.name=图片1.jpg
##第二个附件文件的文件名和文件地址
mail.send.attachment.two.location=${mail.send.attachment.location.root.url}\\image2.jpg
mail.send.attachment.two.name=图片2.jpg
##第三个附件文件的文件名和文件地址,这里故意将文件名弄的有点长
mail.send.attachment.three.location=${mail.send.attachment.location.root.url}\\SpringBoot邮件测试发送附件文件.docx
mail.send.attachment.three.name=SpringBoot邮件测试发送附件文件测试长文件名称的文件附件这个文件的文件名字就是怎么长不要怀疑.docx
配置完成之后,在实例中可以利用 MimeMessageHelper
来完成正式待发送邮件的构建,具体代码如下所示:
/**
* 发送带有附件的邮件
*
* @param subject
* @param content
* @param tos
*/
public void sendAttachmentMail(final String subject, final String content, final String[] tos) throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
//这里如果要发送附件,需要将第二个参数置为true,将邮件信息对象切换到多模块模式。
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHelper.setFrom(environment.getProperty("mail.send.from"));
messageHelper.setTo(tos);
messageHelper.setSubject(subject);
//加入简单文本消息
messageHelper.setText(content);
//加入附件文件
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.one.name"), new File(environment.getProperty("mail.send.attachment.one.location")));
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.two.name"), new File(environment.getProperty("mail.send.attachment.two.location")));
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.three.name"), new File(environment.getProperty("mail.send.attachment.three.location")));
mailSender.send(mimeMessage);
log.info("发送带附件的邮件成功:{}", mimeMessage);
}
controller的测试文件
/**
* 发送带附件的邮件
*
* @param mailRequest
* @param bindingResult
* @return
*/
@RequestMapping(value = prefix + "/send/attachment", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse sendAttachmentMail(@RequestBody @Validated MailRequest mailRequest, BindingResult bindingResult) {
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
String checkResult = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(checkResult)) {
return new BaseResponse(StatusCode.Invalid_Params);
}
log.info("开始发送带有附件的邮件:{}", mailRequest);
String[] mailTos = StringUtils.split(mailRequest.getMailTos(), ",");
//只需要关注这里就好
mailService.sendAttachmentMail(mailRequest.getSubject(), mailRequest.getContent(), mailTos);
} catch (Exception e) {
response = new BaseResponse(StatusCode.Fail);
log.error("发送带附件的邮件异常,异常信息为:{}", e);
}
return response;
}
最终的结果,会发现收到的结果会有个问题
第三个文件名过长的文件,直接乱码了,这就尴尬了,最后通过找源码(我也忘记我咋找的了)发现,其实有个一属性是默认开了的,导致文件名长度超过60,就会自动切分,因此需要在启动的时候将这个属性关掉即可,具体如下所示:
/**
* 如果附件中指示的文件名过长,则会出现文件乱码的问题,是因为默认的属性
* mail.mime.splitlongparameters=true所致,这里需要将其置为false
*/
@PostConstruct
public void init() {
System.setProperty("mail.mime.splitlongparameters", "false");
}
之后测试结果正常
发送带有HTML文本的邮件
这个在之前的基础上只需要修改一个参数就可以了
/**
* 发送HTML类型的邮件
*
* @param subject
* @param content
* @param tos
*/
public void sendHTMLMail(final String subject, final String content, final String[] tos) throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHelper.setFrom(environment.getProperty("mail.send.from"));
messageHelper.setTo(tos);
messageHelper.setSubject(subject);
log.info(content);
messageHelper.setText(content, true);//第二个参数设置为true,表示为发送HTML文本
messageHelper.addAttachment(environment.getProperty("mail.send.attachment.one.name"), new File(environment.getProperty("mail.send.attachment.one.location")));
mailSender.send(mimeMessage);
log.info("发送带有HTML文本的邮件成功");
}
在测试的时候,可以直接弄一个HTML的字符串,发送过来,就会正常显示HTML的内容。
发送thymeleaf渲染的邮件
有些企业级别的邮件发送出来的时候,是渲染了相关指定模板的,这里也将这个总结一下。以thymeleaf为例。
1、引入thymeleaf的依赖
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、配置thymeleaf的相关参数
#指定模板文件的名称
mail.template.file.name=mailTempOne
##thymeleaf的配置
spring.thymeleaf.enabled=true
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
#指定模板文件的文件夹地址
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.check-template-location=true
spring.thymeleaf.check-template=false
spring.thymeleaf.cache=false
3、一个简单的模板
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<p style="font-size: larger; color: burlywood">这是我发送出来的模板邮件,以下是邮件内容:</p><br/>
内容:<span th:text="${content}"></span><br/>
收件人:<span th:text="${mailTos}"></span><br/>
</body>
</html>
4、渲染模板的代码
/**
* 渲染HTML模板
* @param templateFile 具体的模板文件
* @param paramMap 需要填充的参数
*/
public String renderTemplate(final String templateFile,Map<String,Object> paramMap){
Context context=new Context(LocaleContextHolder.getLocale());
context.setVariables(paramMap);
return templateEngine.process(templateFile,context);
}
5、controller中直接获得填充后的文件,然后交给发送邮件的服务
@RequestMapping(value=prefix+"/send/template",method=RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public BaseResponse sendTemplateMail(@RequestBody @Validated MailRequest mailRequest, BindingResult bindingResult){
BaseResponse response = new BaseResponse(StatusCode.Success);
try {
String checkResult = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(checkResult)) {
return new BaseResponse(StatusCode.Invalid_Params);
}
log.info("渲染HTML模板并发送带模板的邮件:{}",mailRequest);
Map<String,Object> paramMap= Maps.newHashMap();
paramMap.put("content",mailRequest.getContent());
paramMap.put("mailTos",mailRequest.getMailTos());
//获取渲染之后的HTML
String html = mailService.renderTemplate(templateFileLocation,paramMap);
String[] tos = StringUtils.split(mailRequest.getMailTos());
//通过发送HTML的方式发送邮件
mailService.sendHTMLMail(mailRequest.getSubject(),html,tos);
} catch (Exception e) {
response = new BaseResponse(StatusCode.Fail);
log.error("发送HTML邮件异常,异常信息为:{}", e);
}
return response;
}
总结
四种发送邮件的操作,几乎涵盖了大部分应用场景
1、发送简单文本邮件。2、发送带有附件的邮件。3、发送带有HTML链接的邮件。4、发送模板渲染的邮件。