SpringBoot進階教學(七十八)郵件服務

2023-12-01 06:01:25

Sun公司提供了JavaMail用來實現郵件傳送,但是設定煩瑣,Spring中提供了JavaMailSender用來簡化郵件設定,Spring Boot則提供了MailSenderAutoConfiguration對郵件的傳送做了進一步簡化。

v準備工作

開通POP3/SMTP服務或者IMAP/SMTP服務

使用郵箱傳送郵件,首先要申請開通POP3/SMTP服務或者IMAP/SMTP服務。SMTP全稱為Simple Mail Transfer Protocol,譯作簡單郵件傳輸協定,它定義了郵件使用者端軟體與SMTP伺服器之間,以及SMTP伺服器與SMTP伺服器之間的通訊規則。

我使用的是QQ郵箱,若你也使用QQ郵箱,可以參考下面截圖。當然我也試了其它郵箱,開通方法大同小異。

v架構搭建

maven依賴
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
郵箱設定
server.port=8300
#郵箱設定
#平臺地址,這裡用的是qq郵箱,使用其他郵箱請更換
spring.mail.host=smtp.qq.com
#埠號
spring.mail.port=587
#傳送郵件的郵箱地址:改成自己的郵箱
[email protected]
#注意這裡不是郵件的登入密碼,是傳送簡訊後它給你的授權碼 填寫到這裡
spring.mail.password=xxxxxxxxx
#與發件郵箱一致
[email protected]
呼叫JavaMailSender介面傳送郵件

由於Spring Boot的starter模組提供了自動化設定,所以在引入了spring-boot-starter-mail依賴之後,會根據組態檔中的內容去建立JavaMailSender範例,因此我們可以直接在需要使用的地方直接@Autowired來引入郵件傳送物件。

EmailService

package com.test.service;

/**
 * @Author chen bo
 * @Date 2023/10
 * @Des
 */
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 附件
     */
    void sendAttachmentsMail(String to, String subject, String content, String filePath);
}

EmailServiceImpl

/**
 * @Author chen bo
 * @Date 2023/10
 * @Des
 */
@Slf4j
@Service
public class EmailServiceImpl implements EmailService {
    /**
     * Spring Boot 提供了一個傳送郵件的簡單抽象,使用的是下面這個介面,這裡直接注入即可使用
     */
    @Autowired
    private JavaMailSender mailSender;

    /**
     * 組態檔中我的qq郵箱
     */
    @Value("${spring.mail.from}")
    private String from;

    /**
     * 簡單文字郵件
     * @param to 收件人
     * @param subject 主題
     * @param content 內容
     */
    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        //建立SimpleMailMessage物件
        SimpleMailMessage message = new SimpleMailMessage();
        //郵件傳送人
        message.setFrom(from);
        //郵件接收人
        message.setTo(to);
        //郵件主題
        message.setSubject(subject);
        //郵件內容
        message.setText(content);
        //傳送郵件
        mailSender.send(message);
    }

    /**
     * html郵件
     * @param to 收件人,多個時引數形式 :"[email protected],[email protected],[email protected]"
     * @param subject 主題
     * @param content 內容
     */
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        //獲取MimeMessage物件
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message, true);
            //郵件傳送人
            messageHelper.setFrom(from);
            //郵件接收人,設定多個收件人地址
            InternetAddress[] internetAddressTo = InternetAddress.parse(to);
            messageHelper.setTo(internetAddressTo);
            //messageHelper.setTo(to);
            //郵件主題
            message.setSubject(subject);
            //郵件內容,html格式
            messageHelper.setText(content, true);
            //傳送
            mailSender.send(message);
            //紀錄檔資訊
            log.info("郵件已經傳送。");
        } catch (Exception e) {
            log.error("傳送郵件時發生異常!", e);
        }
    }

    /**
     * 帶附件的郵件
     * @param to 收件人
     * @param subject 主題
     * @param content 內容
     * @param filePath 附件
     */
    @Override
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);
            mailSender.send(message);
            //紀錄檔資訊
            log.info("郵件已經傳送。");
        } catch (Exception e) {
            log.error("傳送郵件時發生異常!", e);
        }
    }
}

EmailController

/**
 * @Author chen bo
 * @Date 2023/10
 * @Des
 */
@RestController
public class EmailController {
    @Autowired
    private EmailService emailService;
    @PostMapping("sendSimpleMail")
    public String sendSimpleMail(String to, String subject, String content) {
        emailService.sendSimpleMail(to, subject, content);
        return "Hi";
    }
}

postman請求

收到郵件

v原始碼地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!