为何会用到多邮箱发送? 在实际应用中,无论是腾讯邮箱,网易邮箱都有上限阈值,即便开通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