SpringBoot-Email多郵箱發送實例

一, 簡介

    爲何會用到多郵箱發送? 在實際應用中,無論是騰訊郵箱,網易郵箱都有上限閾值,即便開通VIP也同樣會遇到該問題;java

    各大郵箱天天發送數量限制: https://blog.csdn.net/qq_31617637/article/details/73230942?tdsourcetag=s_pctim_aiomsgspring

    在項目中, 常常會遇到 550鏈接頻率受限 的錯誤:數據庫

com.sun.mail.smtp.SMTPSendFailedException: 550 Connection frequency limited

二, 解決方法

    既然遇到該問題,哪咱們總不能無論吧,哪怎麼解決該問題呢?app

    固然最簡單的辦法就是: 增長髮送郵箱數量,輪流執行發送;socket

    想一想看,既然一個郵箱遭到限制, 那有10個郵箱輪流發送呢?發件數量將會是以前的10倍; 100個發送郵箱呢....ide

三, 具體實例

    1, 引入Maven Jar包

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

    2, 郵件發送接口

package com.richfun.wxappi.utils.email;

/**
 * 多郵箱發送郵件
 * */
public interface EmailMoreService {

    /**
     * 發送文本郵件
     * */
    boolean sendSimpleMail(String to, String subject, String content);

    /**
     * 發送HTML郵件
     * */
    boolean sendHtmlMail(String to, String subject, String content);

}

    3, 郵件發送實現

package com.richfun.wxappi.utils.email;

import com.richfun.wxappi.mapper.CommonDao;
import com.richfun.wxappi.utils.Namespace;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.mail.internet.MimeMessage;
import java.util.List;
import java.util.Map;
import java.util.Properties;

@Service
public class EmailMoreServiceImpl implements EmailMoreService {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private CommonDao<Map<String, Object>> commonDao;

    private int emailId = 0;

    private List<Map<String, Object>> listEmail;

    @PostConstruct
    private void setListEmail() {
        // 設置郵箱發送列表, 從數據庫中獲取可發送郵箱列表
        logger.info("=== 初始化可發送郵箱列表 ===");
        this.listEmail = commonDao.findByMapList(Namespace.EMAIL + "listEmail", null);
        if (listEmail == null || listEmail.isEmpty()) {
            logger.error("=== 可發送郵箱列表爲NULL, 請檢測代碼 ===");
        } else {
            for (Map<String, Object> email : listEmail) {
                logger.info("=== 可發送郵箱: " + email.get("email"));
            }
        }
    }

    private synchronized void setEmailId() {
        // 設置下次可發送郵箱
        boolean isMax = emailId == (listEmail.size()-1);
        emailId = isMax ? 0 : emailId+1;
    }

    private synchronized Map<String, Object> getEmail() {
        // 獲取當前可發送郵箱
        Map<String, Object> email = listEmail.get(emailId);
        setEmailId();
        return email;
    }

    private synchronized JavaMailSenderImpl getJavaMailSender() {
        // 獲取郵箱發送實例
        Map<String, Object> email = getEmail();
        String host = email.get("host_addr").toString();
        String username = email.get("email").toString();
        String password = email.get("pwd").toString();
        String sslPort = email.get("ssl_port").toString();
        JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl();
        javaMailSenderImpl.setHost(host);
        javaMailSenderImpl.setUsername(username);
        javaMailSenderImpl.setPassword(password);
        javaMailSenderImpl.setDefaultEncoding("UTF-8");
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.auth", "true");
        properties.setProperty("mail.smtp.socketFactory.port", sslPort);
        properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        javaMailSenderImpl.setJavaMailProperties(properties);
        return javaMailSenderImpl;
    }

    @Override
    public boolean sendSimpleMail(String to, String subject, String content) {
        logger.info("簡單郵件開始發送");
        try {
            JavaMailSenderImpl javaMailSender = getJavaMailSender();
            String username = javaMailSender.getUsername();
            logger.info("當前發送郵箱: " + username);
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(username);
            message.setTo(to);
            message.setSubject(subject);
            message.setText(content);
            javaMailSender.send(message);
            logger.info("簡單郵件發送成功");
            return true;
        } catch (Exception e) {
            logger.error("簡單郵件發送異常", e);
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean sendHtmlMail(String to, String subject, String content) {
        logger.info("HTML郵件開始發送");
        try {
            JavaMailSenderImpl javaMailSender = getJavaMailSender();
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
            String username = javaMailSender.getUsername();
            logger.info("當前發送郵箱: " + username);
            messageHelper.setFrom(username);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content, true);
            javaMailSender.send(message);
            logger.info("HTML郵件發送成功");
            return true;
        } catch (Exception e) {
            logger.error("HTML郵件發送異常", e);
            e.printStackTrace();
        }
        return false;
    }

}

四, 總結

    1, 郵件發送的配置參數都已經放到數據庫,須要注意;spring-boot

    2, 若是你不知道有哪些配置參數,請閱讀: http://www.javashuo.com/article/p-czpimbsg-r.htmlthis

相關文章
相關標籤/搜索