閱讀678 返回首頁    go 阿裏雲 go 技術社區[雲棲]


SpringBoot開發案例之整合mail發送

spring_boot_mail

記得上個月做過這樣一篇筆記,微服務架構實踐之郵件通知係統改造。

當時用的是開源的第三方插件mail和Thymeleaf做發送服務,顯然這樣子你需要配置一些東西,麻煩!!!接觸了Spring Boot以後,顯然有更好的解決方案,我們隻需要引入spring-boot-starter-mail模塊就實現了自動化配置。

好,廢話不扯,言歸正題(文中大部分是部分代碼,詳細代碼見Git)。

項目結構

springboot_mail

引入依賴

在工程中的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;//發送者

    @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(
                "<html><body><img src=\"cid:springcloud\" ></body></html>",
                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<String, Object> model = new HashMap<String, Object>();
        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模版。

項目:https://git.oschina.net/52itstyle/spring-boot-mail

作者: 小柒

出處: https://blog.52itstyle.com

本文版權歸作者和雲棲社區所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出, 如有問題, 可郵件(345849402@qq.com)谘詢。

最後更新:2017-07-20 23:04:15

  上一篇:go  【雲周刊】第131期:如何送貨最省錢?菜鳥自研核心引擎架構首次曝光!
  下一篇:go  MaxCompute最佳實踐