爲何會用到多郵箱發送? 在實際應用中,無論是騰訊郵箱,網易郵箱都有上限閾值,即便開通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
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
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); }
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