发送邮件的代码出下:

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服务器下,连续测试了几次,都发送成功


注意:本文归作者所有,未经作者允许,不得转载