spring email 傳送功能

东北大亨發表於2024-07-18
郵件通知是現代應用中常見的一種通訊方式,特別是在需要及時反饋、告警或重要事件通知的場景下。Spring Boot提供了簡單而強大的郵件傳送功能,本文將透過pring Boot中使用JavaMailSender 介面實現郵件傳送。

使用場景說明

註冊驗證:在使用者註冊、商戶註冊時,透過郵件傳送驗證碼進行身份確認和賬戶啟用。

網站營銷:向潛在使用者傳送營銷資訊或者廣告郵件。

資料監控、報警通知: 對業務型別資料及報警進行通知,達到一個監控目的。

身份安全驗證:在使用者修改密碼、解鎖賬戶等關鍵操作時,透過郵件傳送安全驗證碼來增強賬戶安全性。

普通文字郵件、附件返送郵件:滿足不同需求郵件傳送需求。

實現說明

1、郵件依賴包

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

2、配置引數(yml檔案配置資訊)、以下內容以163郵件為例。

spring:
  mail:
    host: smtp.163.com
    #郵箱名字 
    username: 東北大亨@163.com
    # 郵箱密碼或者金鑰、注意此處為授權郵箱授權碼
    password: ZXESDSFGFGGGGSS
    port: 465
    protocol: smtp
    default-encoding: utf-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          ssl:
            enable: true
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory

3、建立郵件傳送服務類

3.1 介面類

/**
 * @author :jack.zhao
 * @description :傳送郵件介面
 * @version: V1.0.0
 * @create :2019/5/16 10:47
 */
public interface IsendMailService {
   
    /**
     * 傳送普通郵件
     * @param to 收件地址
     * @param subject 標題
     * @param text    正文
     */
    void sendSimpleEmail(String to,String subject,String text);

    /**
     * @param to 收件地址
     * @param subject 標題
     * @param text    正文
     * @param attach  附件
     */
    void sendAttachmentMail(String to, String subject, String text, MultipartFile attach) throws MessagingException, IOException;
}

3.2 郵件傳送介面實現類

package com.toll.northeasttycoon.service.Impl;

import com.toll.auth.service.IEmailService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;

/**
 * @author :jack.zhao
 * @description :傳送郵件服務類
 * @version: V1.0.0
 * @create :2019/5/16 10:48
 */
@Service
public class EmailSendServiceImpl implements ISendEmailService {

   /***  傳送郵件郵箱 */
    @Value("${spring.mail.username}")
    private String account;

    @Resource
    private JavaMailSender javaMailSender;
@Override
public void sendSimpleEmail(String to, String subject, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); message.setSubject(subject); message.setText(text); message.setFrom(account); javaMailSender.send(message); } /** * @param to 收件地址 * @param subject 標題 * @param text 正文 * @param attach 附件 */ @Override public void sendAttachmentMail(String to, String subject, String text, MultipartFile attach) throws MessagingException, IOException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(account); mimeMessageHelper.setTo(new String[]{to}); mimeMessageHelper.setSubject(subject); mimeMessageHelper.setText(text); // 獲取附件的檔名和字尾名 String fileName = attach.getOriginalFilename(); String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1); // 讀取附件內容 byte[] bytes = attach.getBytes(); // 新的資源物件來儲存附件內容 ByteArrayResource attachmentResource = new ByteArrayResource(bytes); // 新增附件,使用完整的檔名(包括字尾名) mimeMessageHelper.addAttachment(fileName, attachmentResource); javaMailSender.send(mimeMailMessage); } }

3.3 呼叫傳送郵件

    @Resource
    private ISendEmailService iSendEmailService;

// 接收郵件的郵箱 String rcvEmail
= "receiveEmail@XXX.com"; // 傳送主題 String subject = "郵件主題"; // 傳送內容 String content= “傳送內容”;
// 呼叫介面傳送普通郵件 iSendEmailService.sendSimpleEmail(rcvEmail ,subject,content);

注意:在實現中可能遇到幾個問題

1、550 User has no permission

2、發生 com.sun.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user

3、535 Error:authentication failed

就是在配置檔案yml配置的password應該是授權密碼,而不是郵箱密碼。

最後說下郵箱授權操作:在開啟服務協議的時候需要傳送簡訊,傳送簡訊後在彈出框中選擇已傳送就會提示授權碼。“保留授權碼”

相關文章