Java mail无法使用tls或ssl连接到smtp
0 我正在尝试从Java连接到邮件服务器。我已经能够使用相同的代码成功地从Java连接到许多邮件服务器,包括Gmail、Rackspace、GoDaddy和其他,但是无论我尝试什么设置,这个都不起作用Java mail无法使用tls或ssl连接到smtp,java,email,smtp,jakarta-mail,Java,Email,Smtp,Jakarta Mail,0 我正在尝试从Java连接到邮件服务器。我已经能够使用相同的代码成功地从Java连接到许多邮件服务器,包括Gmail、Rackspace、GoDaddy和其他,但是无论我尝试什么设置,这个都不起作用 props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", this.outgoingHost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", this.outgoingHost);
props.put("mail.smtp.port", 587);
props.put("mail.smtp.ssl.trust", this.outgoingHost);
session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
此操作失败,javax.mail.MessaginException:无法将套接字转换为TLS;嵌套异常为:javax.net.ssl.SSLException:无法识别的ssl消息,纯文本连接
我也试过,
props.put("mail.smtp.host", this.outgoingHost);
props.put("mail.smtp.port", 587);
props.put("mail.smtp.socketFactory.port", 587);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.trust", this.outgoingHost);
session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
此操作失败,javax.mail.SendFailedException:无效地址;嵌套异常为:com.sun.mail.smtp.SMTPAddressFailedException:在端口587上提交邮件需要550 smtp身份验证
我还尝试了端口465,但它超时了
我能够从Thunderbird电子邮件客户端使用相同的smtp设置发送邮件(相同的主机/端口/用户/pw,但它一定在做其他事情)
使用JavaMail 1.51
有什么想法吗?检查此链接以启用权限(如果发件人有谷歌电子邮件): 未经许可,您不能从非谷歌开发的应用程序登录 要登录,请仅使用邮件的域。例如:text@gmail.com->text当您使用SSL(
smtps
)时,您不使用STARTTLS(msa
),反之亦然。SSL默认为端口465
,TLS默认为端口587
。您可能还必须使用mail.smtp.SSL.protocols
或mail.smtps.SSL.protocols
设置SSL协议,以指定将为SSL/TLS连接启用的SSL协议。您最好避免覆盖PasswordAuthentication
以发送凭据,并使用SMTPTransport
connect
方法。另外,对于SSL,您必须为mail.transport.protocol
使用smtps
,并使用mail.smtps
道具,而不是mail.smtp
。我将提供SSL和TLS的示例
您可以使用session.setDebug(true)
或props.put(“mail.debug”,“true”)
在控制台中调试并查看整个通信;这将非常有帮助,因为您将看到与服务器的整个telnet通信
使用TLS(STARTTLS)587
:
//设置debug以便查看与服务器的整个通信
props.put(“mail.debug”,“true”);
props.put(“mail.transport.protocol”、“smtp”);
道具放置(“mail.host”,outgoingHost);
props.put(“mail.smtp.auth”,“true”);
props.put(“mail.smtp.port”,“587”);
//启用STARTTLS
props.put(“mail.smtp.starttls.enable”、“true”);
//仅接受TLS 1.1和1.2
props.setProperty(“mail.smtp.ssl.protocols”、“TLSv1.1 TLSv1.2”);
Session Session=Session.getInstance(props,null);
session.setDebug(true);
//从会话创建SMTP传输
SMTPTransport=(SMTPTransport)session.getTransport(“smtp”);
//使用凭据连接到服务器
t、 连接(外出主机、用户名、密码);
//发送消息
t、 sendMessage(msg,msg.getAllRecipients());
使用STARTTLS的调试输出示例:
请注意,传输协议是smtp
调试:JavaMail版本1.5.1
...
调试:setDebug:JavaMail版本1.5.1
调试:getProvider()返回javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
调试SMTP:useEhlo true,useAuth true
调试SMTP:尝试连接到主机“mail.example.com”,端口587,isSSL false
220-srv.example.com ESMTP Exim 4.92#2 Wed,2020年3月18日15:55:56+0200
220我们不授权使用该系统来运输未经请求的货物,
220和/或批量电子邮件。
调试SMTP:已连接到主机“mail.example.com”,端口:587
EHLO host.docker.internal
250-srv.example.com你好ppp.home.provider.com[x.x.x.x]
250-8比特
250-流水线
250-AUTH普通登录
250-STARTTLS
250帮助
调试SMTP:找到扩展名“SIZE”,arg“52428800”
调试SMTP:找到扩展名“8BITMIME”,参数“”
调试SMTP:找到扩展名“管道”,arg“”
调试SMTP:找到扩展名“AUTH”,参数“普通登录”
调试SMTP:找到扩展名“STARTTLS”,arg“”
调试SMTP:找到扩展名“帮助”,参数“”
STARTTLS
220 TLS继续
EHLO host.docker.internal
250-srv.example.com你好ppp.home.provider.com[x.x.x.x]
250号52428800
250-8比特
250-流水线
250-AUTH普通登录
250帮助
调试SMTP:找到扩展名“SIZE”,arg“52428800”
调试SMTP:找到扩展名“8BITMIME”,参数“”
调试SMTP:找到扩展名“管道”,arg“”
调试SMTP:找到扩展名“AUTH”,参数“普通登录”
调试SMTP:找到扩展名“帮助”,参数“”
调试SMTP:尝试使用以下机制进行身份验证:登录普通摘要-MD5 NTLM
调试SMTP:身份验证登录命令跟踪被抑制
调试SMTP:验证登录成功
调试SMTP:use8bit false
邮寄地址:
250行
RCPT至:
250接受
调试SMTP:已验证的地址
调试SMTP:otheruser@mail.com
资料
354输入消息,在一行上以“.”结尾
日期:2020年3月18日星期三15:55:57+0200(EET)
发件人:user@example.com
致:otheruser@mail.com
消息ID:
主题:来自JAVA的测试!
MIME版本:1.0
内容类型:文本/纯文本;字符集=美国ascii码
内容传输编码:7bit
X-Mailer:smtpsend
来自JAVA应用程序STARTTLS的消息!
.
250正常id=1jEZAt-009Y7x-5Z
响应:250正常id=1jEZAt-009Y7x-5Z
退出
221 srv.example.com关闭连接
使用SSL465
:
//设置debug以便查看与服务器的整个通信
props.put(“mail.debug”,“true”);
//协议的所有邮件道具都将是mail.smtps
//我们为SSL设置了smtps传输协议
props.put(“邮件、传输、协议”、“smtps”);
道具放置(“mail.host”,outgoingHost);
props.put(“mail.smtps.auth”、“true”);
props.put(“mail.smtps.port”,“465”);
props.put(“mail.smtps.ssl.trust”,outgoingHost);
props.put(“mail.smtps.ssl.enable”、“true”);
//仅接受TLS 1.1和1.2
props.setProperty(“mail.smtps.ssl.protocols”、“TLSv1.1 TLSv1.2”);
Session Session=Session.getInstance(props,null);
session.setDebug(true);
//从会话创建SMTP传输
SMTP