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

标签 java jakarta-mail smtps

除了连接到 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)的三种方法:

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

关于javamail 返回 smtp 作为传输,而不是 smtps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471073/

相关文章:

java - 在 .jj 文件中检测到左递归

java - Maven 依赖项失败并出现 501 错误

java - 使用javamail检查附件而不获取邮件内容

delphi - 中继邮件时可以将服务器 SSL 证书附加到 TIdSMTPRelay 组件吗

java - java中 "true"boolean 值的数组索引超出范围

java - Android 从隐式 Intent 中获取 .txt 文件

java - 如何使用 JavaMail API 读取电子邮件附件(当 contentType 为 text/plain 时)

java - 无法在 Android 应用程序中使用 javax 发送电子邮件

Centos 7 无法连接到 smtps 服务器 "No route to host"