2

我将 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 邮件?

4

2 回答 2

3

Transport.send(msg)正在为每种类型的收件人查找与您的电子邮件收件人关联的协议。

你所有的收件人都是InternetAddresses,类型为rfc822

以下是设置 JavaMail 以对 rfc822 地址使用 smtps 协议的三种方法:

  1. rfc822=smtps在属性文件中添加该行javamail.address.mapjavamail.default.address.map(如javadoc中所述Session
  2. 在您的实例化会话上调用s.setProtocolForAddress("rfc822", "smtps")`(需要 JavaMail 1.4 或更高版本)
  3. 在实例化会话时将属性设置为mail.transport.protocol.rfc822(需要 JavaMail 1.4.3 或更高版本)smtps
于 2014-11-14T18:01:10.443 回答
2

Bill Shannon(Javamail 的当前维护者)在这个问题中建议

摆脱所有套接字工厂属性;如果您使用的是相当新的 JavaMail 版本,则不需要它们。有关如何配置 JavaMail 以访问 Gmail 的信息,请参阅 JavaMail 常见问题解答。如果它仍然不起作用,您还可以在那里找到调试提示。

此外,将 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();
}
于 2012-05-06T15:48:58.333 回答