boot集成的邮箱 spring_SpringBoot开发案例之整合mail发送服务-阿里云开发者社区

本文介绍了如何在SpringBoot中利用spring-boot-starter-mail模块简化邮件发送服务的配置,并对比了使用Freemarker和Thymeleaf模板引擎发送邮件的实现方式及性能。通过测试,发现Freemarker在效率上优于Thymeleaf,建议使用Freemarker进行邮件模板渲染。
摘要由CSDN通过智能技术生成

当时用的是开源的第三方插件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

项目结构

引入依赖

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

org.springframework.boot

spring-boot-starter-mail

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-freemarker

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 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;//发送者

@Override

public void send(Email mail) throws Exception {

MailUtil mailUtil = new MailUtil();

SimpleMailMessage message = new SimpleMailMessage();

message.setFrom(USER_NAME);

message.setTo(mail.getEmail());

message.setSubject(mail.getSubject());

message.setText(mail.getContent());

mailUtil.start(mailSender, message);

}

@Override

public void sendHtml(Email mail) throws Exception {

MailUtil mailUtil = new MailUtil();

MimeMessage message = mailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(message, true);

helper.setFrom(USER_NAME);

helper.setTo(mail.getEmail());

helper.setSubject(mail.getSubject());

helper.setText(

"

",

true);

// 发送图片

File file = ResourceUtils.getFile("classpath:static"

+ Constants.SF_FILE_SEPARATOR + "image"

+ Constants.SF_FILE_SEPARATOR + "springcloud.png");

helper.addInline("springcloud", file);

// 发送附件

file = ResourceUtils.getFile("classpath:static"

+ Constants.SF_FILE_SEPARATOR + "file"

+ Constants.SF_FILE_SEPARATOR + "关注科帮网获取更多源码.zip");

helper.addAttachment("科帮网", file);

mailUtil.startHtml(mailSender, message);

}

@Override

public void sendFreemarker(Email mail) throws Exception {

MimeMessage message = mailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(message, true);

helper.setFrom(USER_NAME);

helper.setTo(mail.getEmail());

helper.setSubject(mail.getSubject());

Map model = new HashMap();

model.put("content", mail.getContent());

Template template = configuration.getTemplate(mail.getTemplate()+".flt");

String text = FreeMarkerTemplateUtils.processTemplateIntoString(

template, model);

helper.setText(text, true);

mailSender.send(message);

}

@Override

public void sendThymeleaf(Email mail) throws Exception {

MimeMessage message = mailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(message, true);

helper.setFrom(USER_NAME);

helper.setTo(mail.getEmail());

helper.setSubject(mail.getSubject());

Context context = new Context();

context.setVariable("email", mail);

String text = templateEngine.process(mail.getTemplate(), context);

helper.setText(text, true);

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);

}

@Override

public void run(String... args) throws Exception {

Email mail = new Email();

mail.setEmail("345849402@qq.com");

mail.setSubject("你个小逗比");

mail.setContent("科帮网欢迎您");

mail.setTemplate("welcome");

mailService.sendFreemarker(mail);

}

}

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

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

Thymeleaf用时:2686ms

Freemarker用时:498ms

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

作者: 小柒

本文版权归作者和云栖社区所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(345849402@qq.com)咨询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值