起因:
需要使用 exchange自搭建的邮箱服务器,只能使用邮箱名称以及邮箱服务器ip 来发送邮件。
之前都使用163、qq等邮箱,但是这些邮箱都会强制进行验证,而且还需要使用smtp的授权码,注意是授权码,而不是邮箱密码(关于授权码可自行百度,有很多)。所以之前的逻辑并不通用。
一番查证后,匿名发送邮件可以使用 Java mail的session来进行发送,不能使用 javaMailSender来发送。下面来展示两种区别
pom
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
163等邮箱需要使用授权码
private JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();public void sendHTMLMail(MailSendVo mailSendVo) throws MessagingException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true, "UTF-8"); mimeMessageHelper.setFrom(mailSendVo.getFrom()); mimeMessageHelper.setTo(mailSendVo.getTo()); mimeMessageHelper.setSubject(mailSendVo.getSubject()); mimeMessageHelper.setText(mailSendVo.getContent(), true); javaMailSender.setHost(mailSendVo.getSmtpServer()); javaMailSender.setUsername(mailSendVo.getUserName()); javaMailSender.setPassword(mailSendVo.getPwd()); javaMailSender.setDefaultEncoding("UTF-8"); Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.connectiontimeout", "30000"); props.put("mail.smtp.timeout", "30000"); if (mailSendVo.getPort() != null && mailSendVo.getPort() != 0) { javaMailSender.setPort(mailSendVo.getPort()); if(mailSendVo.getPort() == 465){ props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.ssl.enable", true); props.put("mail.smtp.ssl.protocols", "TLSv1.2"); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.mime.encodefilename", "true"); } } javaMailSender.setJavaMailProperties(props); javaMailSender.send(mimeMailMessage); }
使用exchange,匿名模式发送
public void sendHTMLMailSub(MailSendVo mailSendVo) {
logger.info("server pwd:" + mailSendVo.getPwd());
try {
Properties props = new Properties();
props.put("mail.debug", "true");
props.put("mail.smtp.auth", "false");//不进行验证
props.put("mail.smtp.host", mailSendVo.getSmtpServer());
props.put("mail.transport.protocol", "smtp");
if (mailSendVo.getPort() != null && mailSendVo.getPort() != 0) {
if (mailSendVo.getPort() == 465) {
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.ssl.enable", true);
props.put("mail.smtp.ssl.protocols", "TLSv1.2");props.put("mail.mime.encodefilename", "true");
props.put("mail.smtp.port", "465");
} else {
props.put("mail.smtp.port", "25");
props.put("mail.smtp.starttls.enabled", "false");
props.put("mail.smtp.starttls.required", "false");
}
}logger.info("props: " + props);
Session session = Session.getInstance(props, null); //主要是这个地方,不进行验证用户密码Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(mailSendVo.getFrom()));//发送者
message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailSendVo.getTo()));//接收者
message.setSubject(mailSendVo.getSubject());//主题
message.setText(mailSendVo.getContent());//内容
message.saveChanges();Transport.send(message);
} catch (Exception e) {
logger.error("send mail message failed: ", e);
}
}
主要关注 Properties props 配置,一些实体类可自行创建