java发邮件本次测试没问题,部署到tomcat上收到的是乱码问题排查

最近项目上有个需求是要求对业务错误信息进行发邮件,故而开发了个发邮件的功能。这个功能很简单,网上也有很多代码。我这里贴一下我的发邮件方法:
 

public static void sendMailByAliyunNew(String subject, String content){
    try {
        String receivers = "收件人邮箱";// 收件人,多个用逗号隔开
        //设置SSL连接、邮件环境
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        Properties props = System.getProperties();
        props.setProperty("mail.transport.protocol", "SMTP");
        props.setProperty("mail.smtp.host", "smtp.mxhichina.com");//阿里云邮箱固定的host
        props.setProperty("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.enable", "true");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.socketFactory", sf);
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");//阿里云邮箱25服务端口默认禁用,所以使用ssl的465端口
        props.setProperty("mail.smtp.socketFactory.port", "465");

        //建立邮件会话
        Session session = Session.getDefaultInstance(props, new Authenticator() {
            //身份认证
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发件人邮箱", "密码");//需要是阿里云邮箱
            }
        });
        session.setDebug(true);
        //建立邮件对象
        MimeMessage message = new MimeMessage(session);
        //设置邮件的发件人、收件人、主题
        //附带发件人名字
        message.setFrom(new InternetAddress("发件人邮箱"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(receivers));
        message.setSubject(subject,"UTF-8");
        message.setContent(content, "text/html;charset=UTF-8");
        message.setSentDate(new Date());
        Transport.send(message);
        System.out.println("邮件发送成功");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

先说一下我遇到的问题,我用的阿里云企业邮箱服务进行发邮件的,以上方法,在本地用main方法执行完全没问题,收到的邮件也没有乱码,但是部署到tomcat之后,收到的邮件是这样的,如图所示,没有主题,内容是看似乱码的东西(实际是base64编码后的)。

java发邮件本次测试没问题,部署到tomcat上收到的是乱码问题排查

遇到此问题,排查了一天多,一直纠结在编码格式不对,转码问题上,也一直在尝试修改发邮件的方法,但是都不起效。后来想了下,为什么本地可以,tomcat不可以,一定是环境问题,跟环境有关的也就是jar包和字符集了,后来修改了tomcat字符集依旧不管事,最后排查lib的时候,发现工程的lib里面有geronimo相关的包,其中有个geronimo-javamail_1.4_spec-1.2.jar,这个包跟

javax.mail的jar包冲突,而且这个是geronimo发邮件的一个包,没有啥用,故而删掉这个jar包,然后重启tomcat,邮件发送正常。这也就解释了为啥本地可以但是tomcat不行了,本地执行的时候直接调用javax.mail包的内容,没有任何问题; 但是部署到tomcat后,jvm执行的时候,因为jar包冲突,使用了geronimo-javamail_1.4_spec-1.2.jar的内容,导致转码有问题,导致邮件发送内容有问题。

在此希望对大家有所帮助,在此需要注意,阿里云邮箱服务器禁用25端口,所以不能使用25端口进行发邮件,只能使用加密的465端口进行发邮件。