SpringBoot 發送郵件功能實現

背景

有個小夥伴問我你之前發郵件功能怎麼弄的。而後我就給他找了個demo,正好在此也寫一下,分享給你們。html

理清痛點

發送郵件,你們能夠想一下,坑的地方在哪?
我以爲是三個吧。
第一:郵件白名單問題。
第二:郵件超時問題。
第三:郵件帶附件問題。
我下面的demo都會介紹這些問題及解決。java

實現方案

準備工做

咱們先要準備一個能夠發送的郵箱,我這裏以個人163郵箱爲例,如今發送郵件的規則,要求你輸入一種叫作受權碼的東西,注意這個東西不是密碼。
獲取受權碼的步驟:



當選擇開啓,經過驗證以後就能夠獲取到驗證碼。選擇重置驗證碼也能夠獲取。之前17年的時候就寫過一個demo,如今19年又開了一個,由於之前的忘了。spring

SpringBoot項目引入郵件包

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

yml配置郵件相關

spring:
  mail:
    # 郵件服務地址
    host: smtp.163.com
    # 端口,可不寫默認
    port: 25
    # 編碼格式
    default-encoding: utf-8
    # 用戶名
    username: xxx@163.com
    # 受權碼,就是咱們剛纔準備工做獲取的代碼
    password: xxx
    # 其它參數
    properties:
      mail:
        smtp:
          # 若是是用 SSL 方式,須要配置以下屬性,使用qq郵箱的話須要開啓
          ssl:
            enable: true
            required: true
          # 郵件接收時間的限制,單位毫秒
          timeout: 10000
          # 鏈接時間的限制,單位毫秒
          connectiontimeout: 10000
          # 郵件發送時間的限制,單位毫秒
          writetimeout: 10000

針對於上面提的超時問題,捕獲超時異常就可解決。springboot

郵件發送工具類

主要經過如下工具類就能夠知足發送java郵件的須要。當咱們進行好 yml 配置後,SpringBoot會幫助咱們自動配置 JavaMailSender 咱們經過這個java類就能夠實現操做java來發送郵件。如下列舉了幾種經常使用的郵件。ide

@Service
public class MailService {
    private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);

    @Autowired
    private JavaMailSender mailSender;

    private static final String SENDER = "xxx@163.com";

    /**
     * 發送普通郵件
     *
     * @param to      收件人
     * @param subject 主題
     * @param content 內容
     */
    @Override
    public void sendSimpleMailMessge(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(SENDER);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        try {
            mailSender.send(message);
        } catch (Exception e) {
            logger.error("發送簡單郵件時發生異常!", e);
        }
    }

    /**
     * 發送 HTML 郵件
     *
     * @param to      收件人
     * @param subject 主題
     * @param content 內容
     */
    @Override
    public void sendMimeMessge(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //true表示須要建立一個multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            mailSender.send(message);
        } catch (MessagingException e) {
            logger.error("發送MimeMessge時發生異常!", e);
        }
    }

    /**
     * 發送帶附件的郵件
     *
     * @param to       收件人
     * @param subject  主題
     * @param content  內容
     * @param filePath 附件路徑
     */
    @Override
    public void sendMimeMessge(String to, String subject, String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //true表示須要建立一個multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = file.getFilename();
            helper.addAttachment(fileName, file);

            mailSender.send(message);
        } catch (MessagingException e) {
            logger.error("發送帶附件的MimeMessge時發生異常!", e);
        }
    }

    /**
     * 發送帶靜態文件的郵件
     *
     * @param to       收件人
     * @param subject  主題
     * @param content  內容
     * @param rscIdMap 須要替換的靜態文件
     */
    @Override
    public void sendMimeMessge(String to, String subject, String content, Map<String, String> rscIdMap) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            //true表示須要建立一個multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(SENDER);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);

            for (Map.Entry<String, String> entry : rscIdMap.entrySet()) {
                FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
                helper.addInline(entry.getKey(), file);
            }
            mailSender.send(message);
        } catch (MessagingException e) {
            logger.error("發送帶靜態文件的MimeMessge時發生異常!", e);
        }
    }
}

發送郵件的demo

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

    @Autowired
    private MailService mailService;

    private static final String TO = "xxx@qq.com";
    private static final String SUBJECT = "測試郵件";
    private static final String CONTENT = "test content";

    /**
     * 測試發送普通郵件
     */
    @Test
    public void sendSimpleMailMessage() {
        mailService.sendSimpleMailMessge(TO, SUBJECT, CONTENT);
    }

    /**
     * 測試發送html郵件
     */
    @Test
    public void sendHtmlMessage() {
        String htmlStr = "<h1>Test</h1>";
        mailService.sendMimeMessge(TO, SUBJECT, htmlStr);
    }

    /**
     * 測試發送帶附件的郵件
     * @throws FileNotFoundException
     */
    @Test
    public void sendAttachmentMessage() throws FileNotFoundException {
        File file = ResourceUtils.getFile("classpath:test.txt");
        String filePath = file.getAbsolutePath();
        mailService.sendMimeMessge(TO, SUBJECT, CONTENT, filePath);
    }

    /**
     * 測試發送帶附件的郵件
     * @throws FileNotFoundException
     */
    @Test
    public void sendPicMessage() throws FileNotFoundException {
        String htmlStr = "<html><body>測試:圖片1 <br> <img src=\'cid:pic1\'/> <br>圖片2 <br> <img src=\'cid:pic2\'/></body></html>";
        Map<String, String> rscIdMap = new HashMap<>(2);
        rscIdMap.put("pic1", ResourceUtils.getFile("classpath:pic01.jpg").getAbsolutePath());
        rscIdMap.put("pic2", ResourceUtils.getFile("classpath:pic02.jpg").getAbsolutePath());
        mailService.sendMimeMessge(TO, SUBJECT, htmlStr, rscIdMap);
    }
}

白名單問題

若是是發送給固定郵箱,能夠直接在固定郵箱裏面設置白名單,若是頻繁的發送給多個郵箱,最好設置如下發送時間間隔,不要不斷的給某一個郵箱發送。spring-boot

總結

至此SpringBoot發送郵件介紹完畢,你們能夠直接使用代碼來進行發送。工具

相關文章
相關標籤/搜索