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編碼後的)。

遇到此問題,排查了一天多,一直糾結在編碼格式不對,轉碼問題上,也一直在嘗試修改發郵件的方法,但是都不起效。後來想了下,爲什麼本地可以,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端口進行發郵件。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章