1. 程式人生 > >JavaMail關於使用qq企業郵箱發郵件踩過的坑

JavaMail關於使用qq企業郵箱發郵件踩過的坑

關於在java中使用qq企業郵箱發郵件,踩了幾個坑,發出來供大家參考。

問題一:能telnet 通 smtp.exmail.qq.com 465,但是發郵件就報錯,提示連線smtp失敗

Exception in thread "main" javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2106)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:712)
    at javax.mail.Service.connect(Service.java:388)
    at javax.mail.Service.connect(Service.java:246)
    at javax.mail.Service.connect(Service.java:195)
    at javax.mail.Transport.send0(Transport.java:254)
    at javax.mail.Transport.send(Transport.java:124)
    at com.jiuhou.common.util.mail.SimpleMailSender.sendTextMail(SimpleMailSender.java:55)
    at com.jiuhou.common.util.mail.SimpleMailSender.main(SimpleMailSender.java:189)

問題分析和解決方案:

由於出於安全性考慮,qq企業郵箱伺服器要求必須要使用 SSL 安全連線(qq郵箱不需要),所以發件時要配置如下引數才可以:

 pro.put("mail.smtp.ssl.enable", "true");

說明一個發郵件問題排查技巧,要把mail的debug開啟,才能看到整個除錯資訊:

pro.put("mail.debug", "true");

如下:

DEBUG: JavaMail version 1.5.6
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: need username and password for authentication
DEBUG SMTP: protocolConnect returning false, host=smtp.exmail.qq.com, user=Administrator, password=<null>
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.exmail.qq.com", port 465, isSSL false


DEBUG SMTP: EOF: [EOF]
DEBUG SMTP: could not connect to host "smtp.exmail.qq.com", port: 465, response: -1

問題二:配置了ssl引數,仍然報錯535 Error: authentication failed, system busy

EHLO 20160314-172951
250-smtp.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.exmail.qq.com, user=*****@*****.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 


DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN failed
Exception in thread "main" javax.mail.AuthenticationFailedException: 535 Error: authentication failed, system busy

    at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:932)
    at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:843)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:748)
    at javax.mail.Service.connect(Service.java:388)
    at javax.mail.Service.connect(Service.java:246)
    at javax.mail.Service.connect(Service.java:195)
    at javax.mail.Transport.send0(Transport.java:254)
    at javax.mail.Transport.send(Transport.java:124)
    at com.jiuhou.common.util.mail.SimpleMailSender.sendTextMail(SimpleMailSender.java:55)
    at com.jiuhou.common.util.mail.SimpleMailSender.main(SimpleMailSender.java:189)

問題分析和解決方案:

看日誌,發現了一個關鍵點 LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 

有一個oauth2,這是常用於三方登入驗證的一個標準,也就是說你的企業郵箱開啟了譬如微信掃碼登入驗證的功能,如果開啟了,很抱歉,只有通過三方認證才能成功登入企業郵箱,這就是authentication failed認證失敗的原因。目前沒有深入研究,還未找出通過三方認證的辦法,但是有個解決辦法可以用,就是關閉三方認證,這樣就可以發郵件了。

 

備註:

另外說一個使用qq郵箱發郵件的問題,就是密碼設定不是你的qq密碼,而是開啟smtp時給你的授權碼,否則也發不了。