Spring Boot 郵件發(fā)送

Spring Boot 郵件發(fā)送

依賴配置

build.gradle


// 添加郵件依賴
compile('org.springframework.boot:spring-boot-starter-mail')

// 用于處理郵件模版

compile("org.springframework.boot:spring-boot-starter-thymeleaf")

郵件服務(wù)器配置

以下是郵件相關(guān)配置項說明


# Email (MailProperties)
spring.mail.default-encoding=UTF-8 # Default MimeMessage encoding.
spring.mail.host= # SMTP server host. For instance, `smtp.example.com`.
spring.mail.jndi-name= # Session JNDI name. When set, takes precedence over other mail settings.
spring.mail.password= # Login password of the SMTP server.
spring.mail.port= # SMTP server port.
spring.mail.properties.*= # Additional JavaMail session properties.
spring.mail.protocol=smtp # Protocol used by the SMTP server.
spring.mail.test-connection=false # Whether to test that the mail server is available on startup.
spring.mail.username= # Login user of the SMTP server.

以下是實際配置(注意:當(dāng)服務(wù)器使用SSL加密時砌们,最后一行是必須的)


spring:

  mail:
    host: smtp.exmail.qq.com
    port: 465
    protocol: smtp
    username: <username>
    password: <password>
    properties:
      mail:
        smtp:
          auth: true
          socketFactory.class: javax.net.ssl.SSLSocketFactory

Thymeleaf配置

以下是Thymeleaf的配置項說明


spring.thymeleaf.cache – enable/disable template caching.
spring.thymeleaf.check-template – check that the template exists before rendering it.
spring.thymeleaf.check-template-location – check that the templates location exists.
spring.thymeleaf.content-type – specifies content-type value.
spring.thymeleaf.enabled – enable mvc thymeleaf view resolution.
spring.thymeleaf.encoding – specifies template encoding.
spring.thymeleaf.excluded-view-names – comma-separated list of view names that should be excluded from resolution.
spring.thymeleaf.mode – template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.prefix – specifies the prefix that gets prepended to view names when building a URL.
spring.thymeleaf.suffix – specifies the suffix that gets appended to view names when building a URL.
spring.thymeleaf.template-resolver-order – specifies the order of the template resolver in the chain.
spring.thymeleaf.view-names – comma-separated list of view names that can be resolved.

也可以使用java代碼進(jìn)行配置


@Configuration
public class ThymeleafConfig {
    @Bean
    public SpringTemplateEngine springTemplateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(htmlTemplateResolver());
        return templateEngine;
    }
    @Bean
    public SpringResourceTemplateResolver htmlTemplateResolver(){
        SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();
        emailTemplateResolver.setPrefix("classpath:/templates/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode(StandardTemplateModeHandlers.HTML5.getTemplateModeName());
        emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
        return emailTemplateResolver;
    }
}

發(fā)送郵件


@Component
public class MailHelper {
    @Value("${mail.from}")
    private String from;

    @Value("${mail.nickname}")
    private String nickname;

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private SpringTemplateEngine templateEngine;

    /**
     * 發(fā)送純文本內(nèi)容
     * @param to
     * @param title
     * @param text
     * @throws MessagingException
     */
    public void sendTextMail(String to, String title, String text) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false,"UTF-8");
        try {
            helper.setFrom(new InternetAddress(from, nickname, "UTF-8"));
        } catch (UnsupportedEncodingException e){
            helper.setFrom(from);
        }
        helper.setTo(to);
        helper.setSubject(title);
        helper.setText(text);
        mailSender.send(mimeMessage);
    }

    /**
     * 發(fā)送模版郵件
     * @param to
     * @param title
     * @param templateName
     * @param data
     * @param files
     * @throws MessagingException
     */
    public void sendTemplateMail(String to, String title, String templateName, Map data, Map<String, String> files) throws MessagingException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        Context context = new Context();
        context.setVariables(data);
        String html = templateEngine.process(templateName, context);
        try {
            helper.setFrom(new InternetAddress(from, nickname, "UTF-8"));
        } catch (UnsupportedEncodingException e){
            helper.setFrom(from);
        }
        helper.setTo(to);
        helper.setSubject(title);
        helper.setText(html, true);
        if (null != files){
            for(String name: files.keySet()){
                ClassPathResource file = new ClassPathResource(files.get(name));
                helper.addInline(name, file);  // 內(nèi)聯(lián)圖片

                // helper.addAttachment(name, file); // 添加附件
            }
        }
        mailSender.send(mimeMessage);
    }
}

Thymeleaf 模版

Thymeleaf模版的使用網(wǎng)上教程很多,這里放一個示例。


<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <link rel="stylesheet" type="text/css" href="webjars/bootstrap/3.3.7/css/bootstrap.min.css"/>
    <link rel="stylesheet" th:href="@{/css/main.css}"/>
    <title>Getting Started: Serving Web Content</title>
</head>
<body>
<nav class="navbar navbar-inverse navbar-static-top">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">
                <img th:src="@{/img/logo.png}" alt="memorynotfound logo"/>
            </a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">Home</a></li>
                <li><a href="#about">About</a></li>
                <li><a href="#contact">Contact</a></li>
            </ul>
        </div>
    </div>
</nav>
<div class="container">
    <div class="starter-template">
        <h1>Spring Boot Thymeleaf Configuration Example</h1>
        <h2 th:text="${message}"></h2>
    </div>
</div>
<!-- include javascript -->
<script type="text/javascript" src="webjars/jquery/3.2.1/jquery.min.js/"></script>
<script type="text/javascript" src="webjars/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

如果在郵件中使用內(nèi)聯(lián)圖片浪感,圖片的src屬性需要按如下代碼設(shè)置


<img src="cid:facebook" height="28" alt="facebook" />

其中cid的值是MimeMessageHelper.addInline()方法第一個參數(shù)的值昔头。

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市影兽,隨后出現(xiàn)的幾起案子揭斧,更是在濱河造成了極大的恐慌,老刑警劉巖峻堰,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讹开,死亡現(xiàn)場離奇詭異,居然都是意外死亡捐名,警方通過查閱死者的電腦和手機(jī)旦万,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镶蹋,“玉大人成艘,你說我怎么就攤上這事『毓椋” “怎么了淆两?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拂酣。 經(jīng)常有香客問我秋冰,道長,這世上最難降的妖魔是什么踱葛? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任丹莲,我火速辦了婚禮,結(jié)果婚禮上尸诽,老公的妹妹穿的比我還像新娘甥材。我一直安慰自己,他們只是感情好性含,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布洲赵。 她就那樣靜靜地躺著,像睡著了一般商蕴。 火紅的嫁衣襯著肌膚如雪叠萍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天绪商,我揣著相機(jī)與錄音苛谷,去河邊找鬼。 笑死格郁,一個胖子當(dāng)著我的面吹牛腹殿,可吹牛的內(nèi)容都是我干的独悴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼锣尉,長吁一口氣:“原來是場噩夢啊……” “哼刻炒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起自沧,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤坟奥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拇厢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爱谁,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年旺嬉,在試婚紗的時候發(fā)現(xiàn)自己被綠了管行。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡邪媳,死狀恐怖捐顷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雨效,我是刑警寧澤迅涮,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站徽龟,受9級特大地震影響叮姑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜据悔,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一传透、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧极颓,春花似錦朱盐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骇径,卻和暖如春躯肌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背破衔。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工清女, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晰筛。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妹懒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容