除了连接到 smtps 服务器的基本信息外,我将 mail.transport 属性设置为 smtps:
Properties p = new Properties();
p.put("mail.transport.protocol", "smtps");
p.put("mail.smtps.host", "smtp.gmail.com");
p.put("mail.smtps.auth", true);
Session s = Session.getDefaultInstance(p,new Authenticator(){/*authenticator impl.*/});
MimeMessage mm = new MimeMessage(s); /*then i set the subject, then the body... */
mm.setRecipients(RecipientType.TO, "myfakeaddress@gmail.com");
现在,我尝试发送消息。我想试试静态方法;使用实例方法 sendMessage
它工作正常。在这里:
Transport.send(mm);
它尝试连接到 smtp 服务器,而不是 smtps 服务器。深入了解 javamail 的实现(顺便说一句,我的版本是 1.4.5)我发现失败的方法是:
transport = s.getTransport(addresses[0]);
因为它返回一个 SMTPTransport
而不是 SMTPSSLTransport
;即使我已将 mail.transport.protocol
属性设置为 smtps,如您在第二行代码中所见,也是如此。
我的程序是否有问题或无法通过 Transport.send
静态方法发送 smtps 邮件?
最佳答案
Transport.send(msg)
正在查找与您电子邮件的收件人 关联的协议(protocol),对于每个 type收件人。
您的所有收件人都是 InternetAddress
,即 have the type rfc822
以下是设置 JavaMail 对 rfc822 地址使用 smtps 协议(protocol)的三种方法:
- 在属性文件
javamail.address.map
或javamail.default.address.map
中添加行rfc822=smtps
(如所述在 theSession
javadoc ) - 调用
s.setProtocolForAddress("rfc822", "smtps")
` 在您的实例化 session 上(需要 JavaMail 1.4 或更高版本) - 在实例化 session 时将属性
mail.transport.protocol.rfc822
设置为smtps
(需要 JavaMail 1.4.3 或更高版本)
关于javamail 返回 smtp 作为传输,而不是 smtps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471073/