Spring Boot中使用JavaMailSender傳送郵件

lizhiqiang666發表於2020-09-24

一 點睛

使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。

在Spring Boot的Starter模組中也為此提供了自動化配置。

下面通過例項看看如何在Spring Boot中使用JavaMailSender傳送郵件。

二 實戰

1 引入相關依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-velocity</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2 application.properties配置

spring.mail.host=smtp.qq.com
spring.mail.username=798103175@qq.com
spring.mail.password=授權登入密碼
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

3 準備一個郵件模板

<html>
<body>
    <h3>你好, ${username}, 這是一封模板郵件!</h3>
</body>
</html>

4 啟動類

package com.didispace;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

5 測試類


package com.didispace;

import org.apache.commons.collections.map.HashedMap;
import org.apache.velocity.app.VelocityEngine;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.ui.velocity.VelocityEngineUtils;

import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Map;


@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTests {

    @Autowired
    private JavaMailSender mailSender;
    @Autowired
    private VelocityEngine velocityEngine;

    @Test
    public void sendSimpleMail() throws Exception {

        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("798103175@qq.com");
        message.setTo("798103175@qq.com");
        message.setSubject("主題:簡單郵件");
        message.setText("測試郵件內容");
        /*
        由於Spring Boot的starter模組提供了自動化配置,
        所以在引入了spring-boot-starter-mail依賴之後,
        會根據配置檔案中的內容去建立JavaMailSender例項,
        因此我們可以直接在需要使用的地方直接@Autowired來引入郵件傳送物件。
        * */
        mailSender.send(message);
    }

    @Test
    public void sendAttachmentsMail() throws Exception {

        /*
        有些郵件會帶上附件
        這個時候我們就需要使用MimeMessage來設定複雜一些的郵件內容
        * */
        MimeMessage mimeMessage = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom("798103175@qq.com");
        helper.setTo("798103175@qq.com");
        helper.setSubject("主題:有附件");
        helper.setText("有附件的郵件");

        FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));
        helper.addAttachment("附件-1.jpg", file);
        helper.addAttachment("附件-2.jpg", file);

        mailSender.send(mimeMessage);
    }

    @Test
    public void sendInlineMail() throws Exception {
        /*
        有些郵件會帶上靜態資源
        這個時候我們就需要使用MimeMessage來設定複雜一些的郵件內容
        * */
        MimeMessage mimeMessage = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom("798103175@qq.com");
        helper.setTo("798103175@qq.com");
        helper.setSubject("主題:嵌入靜態資源");
        helper.setText("<html><body><img src=\"cid:photo\" ></body></html>", true);

        FileSystemResource file = new FileSystemResource(new File("photo.jpg"));
        //這裡需要注意的是addInline函式中資源名稱photo需要與正文中cid:photo對應起來
        helper.addInline("photo", file);

        mailSender.send(mimeMessage);
    }

    @Test
    public void sendTemplateMail() throws Exception {
        /*
        通常我們使用郵件傳送服務的時候,都會有一些固定的場景,比如重置密碼、註冊確認等,
        給每個使用者傳送的內容可能只有小部分是變化的。所以,很多時候我們會使用模板引擎來
        為各類郵件設定成模板,這樣我們只需要在傳送時去替換變化部分的引數即可。
        這個時候我們就需要使用MimeMessage來設定複雜一些的郵件內容
        * */
        MimeMessage mimeMessage = mailSender.createMimeMessage();

        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom("798103175@qq.com");
        helper.setTo("798103175@qq.com");
        helper.setSubject("主題:模板郵件");

        Map<String, Object> model = new HashedMap();
        model.put("username", "cakin");
        String text = VelocityEngineUtils.mergeTemplateIntoString(
                velocityEngine, "template.vm", "UTF-8", model);
        helper.setText(text, true);

        mailSender.send(mimeMessage);
    }

}

三 測試

1 簡單郵件測試

2 有附件郵件測試

3 嵌入靜態資源郵件

4 模組郵件

四參考

blog.csdn.net/qq_24452475/article/...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章