SpringBoot系列之邮件发送姿式介绍html
邮件发送,在实际的项目开发中,可能用的不是特别多,若是没有特定的需求,相信也没有多少小伙伴会特地的去关注,那么若是如今咱们但愿针对项目作一个异常的报警系统,当出现异常的时候,能够向指定的小伙伴发送邮件提醒,那么让咱们来实现这个功能,能够怎么办呢?java
这里介绍一下如何使用SpringBoot封装好的MailSender来实现邮件发送git
本项目借助SpringBoot 2.2.1.RELEASE
+ maven 3.5.3
+ IDEA
进行开发github
开一个web服务用于测试web
<dependencies> <!-- 邮件发送的核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!-- 适用于html模板形式的邮件发送,借助freemarker来实现html模板渲染 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> </dependencies>
在开始以前,咱们须要先准备一个用于发送邮件的帐号,好比我这里使用163的邮箱来发送邮件,须要先到邮箱提供商哪里获取受权码,具体如何获取这个东西,不一样的邮箱姿式有些不一样,各位小伙伴根据本身的实际状况,搜索一下,相信很快就能get到spring
这里简单介绍下网易邮箱的获取方式网络
接下来设置发送邮件相关的配置信息,配置文件application.yml
app
spring: #邮箱配置 mail: host: smtp.163.com from: xhhuiblog@163.com # 使用本身的发送方用户名 + 受权码填充 username: password: default-encoding: UTF-8 properties: mail: smtp: auth: true starttls: enable: true required: true
接下来进入正题,咱们将从简单基础的文本邮件发送开始,逐渐介绍如何添加附件,使用漂亮的html模板等jsp
咱们这里直接使用JavaMailSender
来发送一个基础的文本邮件maven
@Service public class MailDemo { @Autowired private JavaMailSender javaMailSender; @Value("${spring.mail.from:xhhuiblog@163.com}") private String from; private void basicSend() { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); //邮件发送人 simpleMailMessage.setFrom(from); //邮件接收人,能够是多个,参数为可变参数 simpleMailMessage.setTo("bangzewu@126.com"); //邮件主题,也就是标题 simpleMailMessage.setSubject("SpringBoot测试邮件发送"); //邮件内容 simpleMailMessage.setText("简单的邮件正文"); javaMailSender.send(simpleMailMessage); } }
对于简单的文本邮件发送,用上面的基本就够了,若是咱们但愿邮件的内容更美观一点的话,能够借助HTML来实现排版
区别于上面的SimpleMailMessage, 这里使用的是MimeMessage,来实现html内容发送
使用姿式与上面相比差很少,无非就是正文变成了html文本罢了
/** * 发送html */ public void sendHtml() throws MessagingException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo("bangzewu@126.com"); mimeMessageHelper.setSubject("SpringBoot测试邮件发送"); //邮件内容 mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " + "<div> 欢迎点击 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" + " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" + "</div>", true); javaMailSender.send(mimeMailMessage); }
重点注意
setText
方法的第二个参数,必须有,且为true,不然会当成文本内容发送邮件中添加附件,咱们本身写邮件的时候能够直接选择附件上传,那么代码的实现方式又有什么区别呢?
/** * 发送附件 */ public void sendWithFile() throws MessagingException, IOException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo("bangzewu@126.com"); mimeMessageHelper.setSubject("SpringBoot测试邮件发送"); mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " + "<div> 欢迎点击 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" + " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" + "</div>"); String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg"; URL imgUrl = new URL(url); mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream); javaMailSender.send(mimeMailMessage); }
注意上面的实现,与前面差异不大,关键点在于attachment
附件,上面的实现是在附件中添加一个图片,为了简单起见,图片是直接从网络下载的,而后将Stream做为传参
上面的html发送,会发现须要咱们本身来组装html正文,这个操做可能就不是很美好了,借助页面渲染引擎来实现邮件模板支持,能够说是一个比较常见的方案了,这里简单介绍下Freemaker的实现姿式,至于themlaf, beef或者jsp啥的,都没有太大的区别
首先写一个邮件模板 resources/template/mail.ftl
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="SpringBoot thymeleaf"/> <meta name="author" content="YiHui"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>邮件模板</title> </head> <style> .title { color: #c00; font-weight: normal; font-size: 2em; } .content { color: darkblue; font-size: 1.2em; } .sign { color: lightgray; font-size: 0.8em; font-style: italic; } </style> <body> <div> <div class="title">${title}</div> <div class="content">${content}</div> </div> </body> </html>
上面的模板中,定义了两个变量,一个title
,一个content
,这个就是咱们须要替换的值
接下来是邮件发送实例
import freemarker.template.Configuration; @Autowired private Configuration configuration; /** * freemarker 模板 */ public void freeMakerTemplate() throws MessagingException, IOException, TemplateException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo("bangzewu@126.com"); mimeMessageHelper.setSubject("SpringBoot测试邮件发送"); Map<String, Object> map = new HashMap<>(); map.put("title", "邮件标题"); map.put("content", "邮件正文"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), map); mimeMessageHelper.setText(text, true); String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg"; URL imgUrl = new URL(url); mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream); javaMailSender.send(mimeMailMessage); }
注意上面的实现,关键点就利用FreeMarkerTemplateUtils
来实现模板的渲染,输出html正文,所以若是想使用其余的模板渲染引擎,就是改这里便可
最后简单的调用一下上面的实现,看下邮件是否能够发送成功
本篇博文介绍了一下如何发送邮件,并针对简单的文本邮件,html正文,附件等不一样的给出了实例;总体看下来使用姿式不难,不过邮件的几个术语能够了解一下
接下来一篇博文,将介绍一下如何将log日志与邮件发送关联起来,当出现异常的时候,邮件发送给开发者
尽信书则不如,以上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的我的博客,记录全部学习和工做中的博文,欢迎你们前去逛逛