javamail将smtp作为传输返回,而不是smtps

时间:2012-05-06 13:57:45

标签: java javamail smtps

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

2 个答案:

答案 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协议:

  1. 在属性文件rfc822=smtpsjavamail.address.map中添加第javamail.default.address.map行(如the Session javadoc中所述)
  2. 在实例化会话中调用s.setProtocolForAddress("rfc822", "smtps")`(需要JavaMail 1.4或更高版本)
  3. 在实例化会话时将属性mail.transport.protocol.rfc822设置为smtps(需要JavaMail 1.4.3或更高版本)