SpringBoot發送郵件附件(超詳細講解)

現在發送郵件是一個網站必備的功能,比如註冊激活,或者忘記密碼等等都需要發送郵件。正常我們會用JavaMail相關api來寫發送郵件的相關代碼,但現在springboot提供了一套更簡易使用的封裝。也就是我們使用SpringBoot來發送郵件的話,代碼就簡單許多,畢竟SpringBoot是開箱即用的 ,它提供了什麼,我們瞭解之後覺得可行,就使用它,自己沒必要再寫原生的。

發送郵件流程圖

在這裏插入圖片描述
現在的Java項目大多都是按照MVC架構模型來開發的,但是這裏不使用Controller層,是直接在測試中發送郵件,假如測試中發送郵件成功,那麼改爲用戶發送請求來發送郵件也會成功。發送郵件,也就是要有發送方和接收方,我們需要在系統中配置發送方的信息,而接受方的信息我們需要根據從客戶端發來的請求決定。作爲發送方的我們,需要被授權,被誰授權?

  1. 假如我使用QQ郵箱發送郵件,那麼我就需要開啓QQ郵箱授權碼。
  2. 假如我使用網易郵箱發送郵件,那我就需要開啓網易郵箱授權碼。

我們接下來就一 一開啓這兩個郵箱的授權碼

  1. 開啓QQ郵箱授權碼
    在這裏插入圖片描述
  2. 開啓網易郵箱授權碼
    在這裏插入圖片描述

上圖的步驟都會生成授權碼,我們需要記住它,可以選擇保存在本地電腦上,因爲我們接下來配置發送方信息需要授權碼。
接下來我們就開始編寫代碼發送郵件,我們使用IDEA創建SpringBoot項目,下篇博客可以快速瞭解如何在IDEA中創建SpringBoot項目。
SpringBoot快速入門

導入依賴

spring-boot-starter-mail:這個啓動器內部封裝了發送郵件的代碼,必須引入的。
spring-boot-starter-web:這個啓動器整合了JavaWeb常用的功能,如果只是簡單在測試中發送郵件,那麼就不需要引入它。
spring-boot-starter-thymeleaf:模板引擎依賴,如果需要將數據渲染到頁面上,就需要引入它。

<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>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置發送方信息

我們需要在SpringBoot配置文件(application.yml)中配置發送方的信息,包括以下信息:

  1. 用戶名:也就是我們的郵箱賬號
  2. 密碼:我們剛剛生成的授權碼
  3. 郵箱主機:配置使用哪個郵箱服務器發送郵件
    還有等等其他可選配置,在下面配置代碼中,大家需要填寫自己的用戶名、密碼、from(和用戶名一樣)。

QQ郵箱配置

spring:
  mail:
    host: smtp.qq.com #發送郵件服務器
    username:  #發送郵件的郵箱地址
    password:   #客戶端授權碼,不是郵箱密碼,這個在qq郵箱設置裏面自動生成的
    properties.mail.smtp.port: 465 #端口號465或587
    from:  # 發送郵件的地址,和上面username一致
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    default-encoding: utf-8

網易郵箱配置

spring:
  mail:
    host: smtp.163.com #發送郵件服務器
    username:  #發送郵件的郵箱地址
    password: #客戶端授權碼,不是郵箱密碼,網易的是自己設置的
    properties.mail.smtp.port: 994 #465或者994
    from:  # 發送郵件的地址,和上面username一致
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    default-encoding: utf-8

EmailService

我們需要自己封裝郵件服務,這個服務只是便於Controller層調用,也就是根據客戶端發送的請求來調用,封裝三種郵件服務

  1. 發送普通文本郵件
  2. 發送HTML郵件:一般在註冊激活時使用
  3. 發送帶附件的郵件:可以發送圖片等等附件
public interface EmailService {

/**
 * 發送文本郵件
 * @param to 收件人
 * @param subject 主題
 * @param content 內容
 */
void sendSimpleMail(String to, String subject, String content);

/**
 * 發送HTML郵件
 * @param to 收件人
 * @param subject 主題
 * @param content 內容
 */
void sendHtmlMail(String to, String subject, String content);

/**
 * 發送帶附件的郵件
 * @param to 收件人
 * @param subject 主題
 * @param content 內容
 * @param filePath 附件
 */
public void sendAttachmentsMail(String to, String subject, String content, String filePath);
}

EmailServiceImpl

我們需要實現上面的郵件服務,在具體的實現裏面,則是調用了SpringBoot提供的JavaMailSender(封裝了發送郵件的代碼)。

@Service
public class EmailServiceImpl implements EmailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender javaMailSender;
	
	//注入配置文件中配置的信息——>from
    @Value("${spring.mail.from}")
    private String from;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        //發件人
        message.setFrom(from);
        //收件人
        message.setTo(to);
        //郵件主題
        message.setSubject(subject);
        //郵件內容
        message.setText(content);
        //發送郵件
        javaMailSender.send(message);
    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            message.setSubject(subject);
            messageHelper.setText(content,true);
            javaMailSender.send(message);
            logger.info("郵件已經發送!");
        } catch (MessagingException e) {
            logger.error("發送郵件時發生異常:"+e);
        }
    }

    @Override
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,true);
            //攜帶附件
            FileSystemResource file = new FileSystemResource(filePath);
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            messageHelper.addAttachment(fileName,file);

            javaMailSender.send(message);
            logger.info("郵件加附件發送成功!");
        } catch (MessagingException e) {
            logger.error("發送失敗:"+e);
        }
    }

}

EmailServiceTest

我們直接在測試中發送郵件,如果測試中發送郵件沒問題,那麼轉爲用戶請求發送郵件也沒有問題的。

@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailServiceTest{

    @Autowired
    private EmailService emailService;

    @Test
    public void sendSimpleEmail(){
        String content = "你好,恭喜你...";
        emailService.sendSimpleMail("[email protected]","祝福郵件",content);
    }

    @Test
    public void sendMimeEmail(){
        String content = "<a href='https://blog.csdn.net/'>你好,歡迎註冊網站,請點擊鏈接激活</a>";
        emailService.sendHtmlMail("[email protected]","激活郵件",content);
    }

    @Test
    public void sendAttachment(){
        emailService.sendAttachmentsMail("[email protected]","發送附件","這是Java體系圖","F:/圖片/愛旅行.jpg");
    }
}

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
這樣我們就實現了提供Java代碼來發送郵件。發送附件功能其實就是讀取我們本地電腦的文件,然後添加到發送流中即可。
發送郵件附件的源代碼

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