由于项目要求需要使用不同的企业邮箱账号发送邮件功能,具体的申请企业邮箱步骤就不详细说明了,这里我用的是网易的企业邮箱.
1.邮箱的配置yml文件如下
spring:
#这里需要配置默认的邮件发送信息,不然启动会报错
mail:
host: smtphz.qiye.163.com
username: 账号名称
password: ******** #这里是账号的客户端授权密码
senderName: 发送人名称(可不配置)
sender-email:
configs:
mail-0:
host: smtphz.qiye.163.com
username: 账号名称1
password: ********#这里是账号的客户端授权密码
senderName: 发送人名称(可不配置)
mail-1:
host: smtphz.qiye.163.com
username: 账号名称2
password: ********#这里是账号的客户端授权密码
senderName: 发送人名称(可不配置)
2.mail配置如下
@Data
@Component
@ConfigurationProperties(prefix = "sender-email", ignoreUnknownFields = false)
public class EmailConfig {
private Map<String,MailProperties> configs;
public Map<String, MailProperties> getConfigs() {
return configs;
}
public void setConfigs(Map<String, MailProperties> configs) {
this.configs = configs;
}
@Data
public static class MailProperties {
private String host;
private String username;
private String password;
private String senderName;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSenderName() {
return senderName;
}
public void setSenderName(String senderName) {
this.senderName = senderName;
}
@Override
public String toString() {
return "MailProperties{" +
"host='" + host + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", senderName='" + senderName + '\'' +
'}';
}
}
}
3.发送邮件方法
@Autowired
private EmailConfig emailConfig;
private final List<JavaMailSenderImpl> senderList;
/**
* 获取MailSender
*
* @return CustomMailSender
*/
public JavaMailSenderImpl getJavaMailSender(String username) {
Map<String, EmailConfig.MailProperties> mailConfigs=emailConfig.getConfigs();
log.info("初始化mailSender,mailConfigs={}",mailConfigs);
for (EmailConfig.MailProperties mailProperties : mailConfigs.values()) {
log.info("mailConfigs.values(),mailProperties={}",mailProperties);
// 邮件发送者
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(mailProperties.getHost());
//5、SMTP服务器: 默认端口 换成腾讯云服务器后,需要将端口换成465
javaMailSender.setPort(25);
//6、//发送邮件协议名称
javaMailSender.setProtocol("smtp");
//7、编码格式
javaMailSender.setDefaultEncoding("UTF-8");
javaMailSender.setUsername(mailProperties.getUsername());
javaMailSender.setPassword(mailProperties.getPassword());
//8、创建连接对象,连接到邮箱服务器
Properties properties = new Properties();
//发送服务器需要身份验证,要采用指定用户名密码的方式去认证
properties.put("mail.smtp.auth", true);
properties.put("mail.smtp.starttls.enable", true);
//9、添加连接对象到邮件对象中
javaMailSender.setJavaMailProperties(properties);
// 添加数据
senderList.add(javaMailSender);
}
if (StringUtil.isNull(username)) {
throw new MyException(ExceptionEnum.EMAIL_ERROR_TYPE);
}
if (senderList.isEmpty()) {
throw new MyException(ExceptionEnum.EMAIL_ERROR_TYPE);
}
for (JavaMailSenderImpl javaMailSender : senderList) {
if (username.equals(javaMailSender.getUsername())) {
return javaMailSender;
}
}
// 随机返回一个JavaMailSender
return senderList.get(new Random().nextInt(senderList.size()));
}
/**
* 发送邮件的方法
*
* @Param to :给谁发邮件
* @Param code : 邮件的激活码
* @Param subject : 主题
* @Param text : 内容
*/
public void sendMail(String username, String toEmail, String code, final String subject, final String text) {
try {
JavaMailSenderImpl javaMailSender = getJavaMailSender(username);
int count = 1;
//10、创建
//可以发送几封邮件:可以这里 for循环多次
MimeMessage mimeMessage = getMimeMessage(username, toEmail, subject, text, javaMailSender);
//11、发送邮件
javaMailSender.send(mimeMessage);
log.info("发送 第" + count + "封邮件");
count++;
log.info("发往 " + toEmail + " 邮件发送成功");
} catch (MessagingException e) {
log.error("发往 " + toEmail + " 邮件发送异常", e);
}
}
//声明一个Message对象(代表一封邮件),从session中创建
private MimeMessage getMimeMessage(String username, String toEmail, String subject, String text, JavaMailSenderImpl javaMailSender) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
//发件人
mimeMessageHelper.setFrom(username);
//收件人 : 可以发送给多个收件人,该方法有一个重载的 数组形参
mimeMessageHelper.setTo(toEmail);
//邮件主题
mimeMessageHelper.setSubject(subject);
//邮件内容
mimeMessageHelper.setText(text, true);
return mimeMessage;
}