SpringBoot 开发案例之整合 mail 发送服务

12 篇文章 3 订阅
8 篇文章 0 订阅

SpringBoot 开发案例之整合 mail 发送服务

spring-boot-mail.jpg

spring-boot-mail.jpg

记得上个月做过这样一篇笔记,微服务架构实践之邮件通知系统改造。

当时用的是开源的第三方插件 mail 和 Thymeleaf 做发送服务,显然这样子你需要配置一些东西,麻烦!!!接触了 Spring Boot 以后,显然有更好的解决方案,我们只需要引入 spring-boot-starter-mail 模块就实现了自动化配置。

好,废话不扯,言归正题 (文中大部分是部分代码,详细代码见 Git)。

开发环境

JDK1.7、Maven、Eclipse、SpringBoot1.5.2、spring-boot-starter-mail、spring-boot-starter-thymeleaf,spring-boot-starter-freemarker

项目结构

springboot-mail.png

springboot-mail.png

引入依赖

在工程中的 pom.xml 中引入以下依赖:

       <!-- email -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!-- thymeleaf 模版 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!-- freemarker 模版 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

application.properties 中配置以下内容:

spring.mail.host=smtp.qq.com
spring.mail.username=345849402@qq.com
#授权码g,在QQ邮箱客户端生成 修改成自己的  设置-账户-开启服务-获取授权码
spring.mail.password=XXXXXXX
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

#freemarker
spring.freemarker.template-loader-path=classpath:/static/template/
spring.freemarker.enabled=true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.allow-request-override=false
spring.freemarker.check-template-location=true
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false

#thymeleaf
spring.thymeleaf.prefix=classpath:/static/template/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false

封装实体

首先我们,封装一个 Email 实体 Email.java:

/**
  • Email封装类
  • 创建者 科帮网
  • 创建时间 2017年7月20日

*/
public class Email implements Serializable {
private static final long serialVersionUID = 1L;
//必填参数
private String email;//接收方邮件
private String subject;//主题
private String content;//邮件内容
//选填
private String template;//模板
private HashMap<String, String> kvMap;// 自定义参数
… 省略 get set

业务实现

既然用了 spring,就按照 spring 的方式来,先定义一个接口 IMailService,接着是实现 MailServiceImpl。

以下代码,实现了四种方式:纯文本,富文本 (图片,附件),Freemarker 模版以及 Thymeleaf 模版。

这里需要注意的是,springboot 1.4.0 以后 Velocity 废弃了,官方建议用 freemaker。而 thymeleaf 是博主自己实现的,显然效率没有 freemaker 高 (评测对比见文章底部)。

@Service
public class MailServiceImpl implements IMailService {
@Autowired
private JavaMailSender mailSender;//执行者
@Autowired
public Configuration configuration;//freemarker
@Autowired
private SpringTemplateEngine templateEngine;//thymeleaf
@Value("${spring.mail.username}")
public String USER_NAME;//发送者
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">send</span><span class="hljs-params">(Email mail)</span> <span class="hljs-keyword">throws</span> Exception </span>{
    MailUtil mailUtil = <span class="hljs-keyword">new</span> MailUtil();
    SimpleMailMessage message = <span class="hljs-keyword">new</span> SimpleMailMessage();
    message.setFrom(USER_NAME);
    message.setTo(mail.getEmail());
    message.setSubject(mail.getSubject());
    message.setText(mail.getContent());
    mailUtil.start(mailSender, message);
}

<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendHtml</span><span class="hljs-params">(Email mail)</span> <span class="hljs-keyword">throws</span> Exception </span>{
    MailUtil mailUtil = <span class="hljs-keyword">new</span> MailUtil();
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = <span class="hljs-keyword">new</span> MimeMessageHelper(message, <span class="hljs-keyword">true</span>);
    helper.setFrom(USER_NAME);
    helper.setTo(mail.getEmail());
    helper.setSubject(mail.getSubject());
    helper.setText(
            <span class="hljs-string">"&lt;html&gt;&lt;body&gt;&lt;img src=\"cid:springcloud\" &gt;&lt;/body&gt;&lt;/html&gt;"</span>,
            <span class="hljs-keyword">true</span>);
    <span class="hljs-comment">// 发送图片</span>
    File file = ResourceUtils.getFile(<span class="hljs-string">"classpath:static"</span>
            + Constants.SF_FILE_SEPARATOR + <span class="hljs-string">"image"</span>
            + Constants.SF_FILE_SEPARATOR + <span class="hljs-string">"springcloud.png"</span>);
    helper.addInline(<span class="hljs-string">"springcloud"</span>, file);
    <span class="hljs-comment">// 发送附件</span>
    file = ResourceUtils.getFile(<span class="hljs-string">"classpath:static"</span>
            + Constants.SF_FILE_SEPARATOR + <span class="hljs-string">"file"</span>
            + Constants.SF_FILE_SEPARATOR + <span class="hljs-string">"关注科帮网获取更多源码.zip"</span>);
    helper.addAttachment(<span class="hljs-string">"科帮网"</span>, file);
    mailUtil.startHtml(mailSender, message);
}

<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendFreemarker</span><span class="hljs-params">(Email mail)</span> <span class="hljs-keyword">throws</span> Exception </span>{
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = <span class="hljs-keyword">new</span> MimeMessageHelper(message, <span class="hljs-keyword">true</span>);
    helper.setFrom(USER_NAME);
    helper.setTo(mail.getEmail());
    helper.setSubject(mail.getSubject());
    Map&lt;String, Object&gt; model = <span class="hljs-keyword">new</span> HashMap&lt;String, Object&gt;();
    model.put(<span class="hljs-string">"content"</span>, mail.getContent());
    Template template = configuration.getTemplate(mail.getTemplate()+<span class="hljs-string">".flt"</span>);
    String text = FreeMarkerTemplateUtils.processTemplateIntoString(
            template, model);
    helper.setText(text, <span class="hljs-keyword">true</span>);
    mailSender.send(message);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendThymeleaf</span><span class="hljs-params">(Email mail)</span> <span class="hljs-keyword">throws</span> Exception </span>{
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = <span class="hljs-keyword">new</span> MimeMessageHelper(message, <span class="hljs-keyword">true</span>);
    helper.setFrom(USER_NAME);
    helper.setTo(mail.getEmail());
    helper.setSubject(mail.getSubject());
    Context context = <span class="hljs-keyword">new</span> Context();
    context.setVariable(<span class="hljs-string">"email"</span>, mail);
    String text = templateEngine.process(mail.getTemplate(), context);
    helper.setText(text, <span class="hljs-keyword">true</span>);
    mailSender.send(message);
}

}

测试用例

老司机带你去开车 SpringbootMailApplication.java:

@SpringBootApplication
@ComponentScan(basePackages={“com.itstyle.mail”})
public class SpringbootMailApplication implements CommandLineRunner {
@Autowired
private IMailService mailService;
public static void main(String[] args) {
SpringApplication.run(SpringbootMailApplication.class, args);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span><span class="hljs-params">(String... args)</span> <span class="hljs-keyword">throws</span> Exception </span>{
    Email mail = <span class="hljs-keyword">new</span> Email();
    mail.setEmail(<span class="hljs-string">"345849402@qq.com"</span>);
    mail.setSubject(<span class="hljs-string">"你个小逗比"</span>);
    mail.setContent(<span class="hljs-string">"科帮网欢迎您"</span>);
    mail.setTemplate(<span class="hljs-string">"welcome"</span>);
    mailService.sendFreemarker(mail);
}

}

好了,不出意外,这四种方式应该绝对是没问题的,小伙伴们就等着右下角弹窗窗吧。

最后,做了一个小小的评测,生成模版时间对比 (1000 次循环)

  • Thymeleaf 用时:2686ms
  • Freemarker 用时:498ms

对比测试,建议使用 Freemarker 模版。

项目:http://git.oschina.net/52itstyle/spring-boot-mail

转自:https://blog.52itstyle.vip/archives/1264/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值