我将mail.transport属性设置为smtps,旁边是连接到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邮件?
答案 0 :(得分:2)
Bill Shannon(Javamail的当前维护者)在this question
中建议摆脱所有套接字工厂属性;如果你正在使用 合理的JavaMail版本,你不需要它们。见 JavaMail有关如何配置JavaMail以访问Gmail的常见问题。你会 如果它仍然不起作用,也会在那里找到调试技巧。
另外,将Session.getDefaultInstance更改为Session.getInstance。
以下是Javamail FAQ
的相关代码String host = "smtp.gmail.com";
String username = "user";
String password = "passwd";
Properties props = new Properties();
props.put("mail.smtps.auth", "true");
props.put("mail.debug", "true");
MimeMessage msg = new MimeMessage(session);
// set the message content here
Transport t = session.getTransport("smtps");
try {
t.connect(host, username, password);
t.sendMessage(msg, msg.getAllRecipients());
} finally {
t.close();
}
答案 1 :(得分:2)
Transport.send(msg)
正在为每位type收件人查找与您的电子邮件的收件人相关联的协议。
所有收件人均为InternetAddress
个,have the type rfc822
以下三种方法可以将JavaMail设置为对rfc822地址使用smtps协议:
rfc822=smtps
或javamail.address.map
中添加第javamail.default.address.map
行(如the Session
javadoc中所述)s.setProtocolForAddress("rfc822", "smtps")
`(需要JavaMail 1.4或更高版本)mail.transport.protocol.rfc822
设置为smtps
(需要JavaMail 1.4.3或更高版本)