SpringBoot使用JavaMailSender發送郵件(2)

爲了更容易更規範維護郵件內容,我們推薦使用模板引擎技術。常用的模板引擎有這幾種Thymeleaf、FreeMarker、Velocity等。我們在這裏就使用前面兩種來實現發送郵件。

 

一、使用Thymeleaf模板技術發送郵件

Thymeleaf是SpringBoot推薦的官方模板引擎技術,使用非常的簡單方便。

(1)添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

(2)編寫實現代碼

編寫發送郵件接口。

import com.example.demo.entity.Member;
import com.example.demo.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.util.Arrays;
import java.util.List;

@RestController
public class MailController {

    private final static String FROM_MAIL = "[email protected]";
    private final static String TO_MAIL = "[email protected]";

    @Autowired
    MailService mailService;

    @Autowired
    TemplateEngine templateEngine;

    @GetMapping("/sendTemplate")
    public String sendTemplate(){
        //渲染模版
        Member member1 = new Member().setName("張飛").setSex("男").setEmail("[email protected]");
        Member member2 = new Member().setName("孫尚香").setSex("女").setEmail("[email protected]");
        Member member3 = new Member().setName("曹操").setSex("男").setEmail("[email protected]");
        List<Member> memberList = Arrays.asList(member1, member2, member3);

        //通過Context構造模版中變量需要的值
        Context ctx = new Context();
        ctx.setVariable("memberList", memberList);
        //使用TemplateEngine對模版進行渲染
        String mail = templateEngine.process("mail.html", ctx);
        //發送郵箱
        mailService.sendTemplate(FROM_MAIL, TO_MAIL, "郵件的標題", mail);

        return "發送成功";
    }

}

編寫發送郵件服務 

public interface MailService {

    void sendTemplate(String from, String to, String subject, String content);

}
import com.example.demo.service.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

@Service
@Slf4j
public class MailServiceImpl implements MailService {

    @Autowired
    JavaMailSender javaMailSender;

    /**
     * 發送html模板郵件
     * @param from 郵件發送者
     * @param to 收件人
     * @param subject 郵件主題
     * @param content html格式的郵件內容
     */
    @Override
    public void sendTemplate(String from, String to, String subject, String content) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setFrom(from);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("發送失敗");
        }
    }
}

編寫測試數據實體 

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class Member {

    private String name;

    private String sex;

    private String email;

}

(3)創建郵件模板

Thymeleaf模版默認位置是resources/templates,我們在該目錄下創建一個郵件模版 mail.html。

代碼如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>郵件模板</title>
    <style type="text/css">
        ul li {
            list-style: none;
            height: 35px;
            line-height:35px;
        }
    </style>
</head>
<body>
    <div>
        <h3>會員信息</h3>
        <ul>
            <li th:each="member: ${memberList}">
                姓名:[[${member.name}]]&nbsp;&nbsp;
                性別:[[${member.sex}]]&nbsp;&nbsp;
                郵箱:[[${member.email}]]
            </li>
        </ul>
    </div>
</body>
</html>

(4)驗證結果

訪問接口:http://127.0.0.1:8082/sendTemplate

 

二、使用FreeMarker模板技術發送郵件

(1)添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

(2)編寫實現代碼

編寫發送郵件接口。

import com.example.demo.TestApplication;
import com.example.demo.entity.Member;
import com.example.demo.service.MailService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class MailController {

    private final static String FROM_MAIL = "[email protected]";
    private final static String TO_MAIL = "[email protected]";

    @Autowired
    MailService mailService;
    
    @GetMapping("/sendTemplate")
    public String sendTemplate(){
        try {
            //配置FreeMarker模版位置
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
            ClassLoader loader = TestApplication.class.getClassLoader();
            configuration.setClassLoaderForTemplateLoading(loader,"ftl");
            //配置模版文件
            Template template = configuration.getTemplate("mail.ftl");

            //渲染模版
            StringWriter mail = new StringWriter();
            Member member1 = new Member().setName("張飛").setSex("男").setEmail("[email protected]");
            Member member2 = new Member().setName("孫尚香").setSex("女").setEmail("[email protected]");
            Member member3 = new Member().setName("曹操").setSex("男").setEmail("[email protected]");
            List<Member> memberList = Arrays.asList(member1, member2, member3);
            Map<String, Object> map = new HashMap();
            map.put("memberList", memberList);
            template.process(map, mail);

            //發送郵箱
            mailService.sendTemplate(FROM_MAIL, TO_MAIL, "郵件的標題", mail.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "發送成功";
    }

郵件服務和上面的一樣,我們這邊就不過多描述了。

public interface MailService {

    void sendTemplate(String from, String to, String subject, String content);

}
import com.example.demo.service.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

@Service
@Slf4j
public class MailServiceImpl implements MailService {

    @Autowired
    JavaMailSender javaMailSender;

    /**
     * 發送html模板郵件
     * @param from 郵件發送者
     * @param to 收件人
     * @param subject 郵件主題
     * @param content html格式的郵件內容
     */
    @Override
    public void sendTemplate(String from, String to, String subject, String content) {
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setFrom(from);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("發送失敗");
        }
    }
}
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class Member {

    private String name;

    private String sex;

    private String email;

}

(3)創建郵件模板

這裏我們resources目錄下面創建了一個ftl的文件,在該目錄創建了一個mail.ftl文件。

代碼如下:

<style type="text/css">
    ul li {
        list-style: none;
        height: 35px;
        line-height:35px;
    }
</style>
<div>
    <h3>會員信息</h3>
    <ul>
        <#list memberList as member>
            <li>姓名:${member.name}&nbsp;&nbsp;性別:${member.sex}&nbsp;&nbsp;郵箱:${member.email}</li>
        </#list>
    </ul>
</div>

(4)驗證結果

訪問接口:http://127.0.0.1:8082/sendTemplate

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章