【问题标题】:javamail returning smtp as transport, instead of smtpsjavamail 返回 smtp 作为传输,而不是 smtps
【发布时间】:2012-05-06 13:57:44
【问题描述】:

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

【问题讨论】:

标签: java jakarta-mail smtps


【解决方案1】:

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

您所有的收件人都是InternetAddresses,其中have the type rfc822

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

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

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

    • 如果不将属性实例传递给任何其他方法,为什么还要使用它?
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2011-09-27
    • 2015-08-02
    • 2011-10-14
    • 2019-05-26
    • 2014-08-05
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多