博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaMail关于使用qq企业邮箱发邮件踩过的坑
阅读量:2065 次
发布时间:2019-04-29

本文共 4705 字,大约阅读时间需要 15 分钟。

关于在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时给你的授权码,否则也发不了。

 

 

转载地址:http://ecwmf.baihongyu.com/

你可能感兴趣的文章
Sublime text3快捷键演示
查看>>
sublime text3 快捷键修改
查看>>
计算机底层是什么东西?
查看>>
关于PHP几点建议
查看>>
硬盘的接口、协议
查看>>
安装系统之一 U盘启动盘制作
查看>>
安装系统之二 U盘启动盘制作---UEFI版
查看>>
安装系统之四 U盘装GHOST XP教程
查看>>
安装系统之五 U盘装原版XP教程
查看>>
安装系统之六 U盘装GHOST WIN7教程
查看>>
安装系统之八 U盘装GHOST WIN8教程
查看>>
安装系统之九 U盘装原版WIN8教程
查看>>
安装系统之三 U盘启动盘建立磁盘分区教程
查看>>
系统安装之十 U盘安装原版win10
查看>>
安装系统之十一 UEFI和Legacy及UEFI+Legacy启动的区别
查看>>
树莓派屏幕---------Android手机作为树莓派的屏幕
查看>>
嵌入式 知识点 积累 (一)
查看>>
嵌入式 知识积累 (二) 之 三个学习阶段
查看>>
嵌入式 知识积累(三) 之 基本技能
查看>>
嵌入式 知识积累(四) 之 硬件开发的基本过程
查看>>