发送邮件的代码出下:
import java.util.Map; import java.util.Properties; import javax.mail.internet.MimeMessage; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import org.springframework.ui.velocity.VelocityEngineUtils; import org.springframework.util.StringUtils; import mblog.base.context.AppContext; import mblog.base.email.EmailEngine; import mblog.base.email.EmailSender; import mblog.base.lang.SiteConfig; import mblog.modules.exception.MtonsException; @Service @Lazy(false) public class EmailSenderImpl implements EmailSender { private Logger logger = Logger.getLogger(this.getClass()); @Autowired private EmailEngine emailEngine; @Autowired private AppContext appContext; // 发送器 private JavaMailSenderImpl sender; private String domain; private boolean inited = false; @Override public void sendTemplete(String address, String subject, String template, Map<String, Object> data) { data.put("domain", getDomain()); final String html = VelocityEngineUtils.mergeTemplateIntoString(emailEngine.getEngine(), template, "UTF-8", data); sendText(address, subject, html, true); } @Override public void sendText(String address, String subject, String content, boolean html) { init(); MimeMessage msg = sender.createMimeMessage(); try { MimeMessageHelper message = new MimeMessageHelper(msg, true, "UTF-8"); message.setFrom(sender.getUsername()); message.setSubject(subject); message.setTo(address); message.setText(content, html); new Thread(() -> { sender.send(msg); }).start(); } catch (Exception e) { logger.warn(e.getMessage()); } } public void init() { // 如果加载完毕直接返回 if (inited) { return; } String host = appContext.getConfig().get(SiteConfig.SITE_MAIL_HS); String username = appContext.getConfig().get(SiteConfig.SITE_MAIL_UN); String password = appContext.getConfig().get(SiteConfig.SITE_MAIL_PW); if (StringUtils.isEmpty(host) || StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { throw new MtonsException(" 系统配置中的 mail.* 相关配置不完整, 不能正常使用邮件服务!"); } sender = new JavaMailSenderImpl(); sender.setHost(host); sender.setPort(25); sender.setDefaultEncoding("UTF-8"); sender.setUsername(username); sender.setPassword(password); Properties props = new Properties(); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.timeout", "25000"); props.setProperty("mail.transport.protocol", "smtp"); //props.setProperty("mail.smtp.auth.mechanisms", "NTLM"); sender.setJavaMailProperties(props); // 标记加载完毕 inited = true; } private String getDomain() { if (domain == null) { domain = appContext.getConfig().get(SiteConfig.SITE_DOMAIN); if (domain.endsWith("/")) { domain = domain.substring(0, domain.lastIndexOf("/")); } } return domain; } }
在windows下发送正常,当部署到linux下时,发送收件时报如下的异常:
at com.base.email.impl.EmailSenderImpl$$Lambda$18/31070183.run(Unknow$ at java.lang.Thread.run(Thread.java:744) Caused by: javax.mail.AuthenticationFailedException: 535 Error: authentication $ at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTrans$ at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:761) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:6$ at javax.mail.Service.connect(Service.java:295) at org.springframework.mail.javamail.JavaMailSenderImpl.connectTranspor$ at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMail$ ... 5 more
最终的解决方法如下:
找到
props.setProperty("mail.transport.protocol", "smtp");
在其下放加入:
props.setProperty("mail.smtp.starttls.enable", "true");
再一次部署到linux服务器下,连续测试了几次,都发送成功
注意:本文归作者所有,未经作者允许,不得转载