【问题标题】:How to get an SMTP response using Javamail如何使用 Javamail 获得 SMTP 响应
【发布时间】:2018-03-17 06:13:01
【问题描述】:

我正在使用 Javamail 连接到 AWS 电子邮件服务;我已经测试过我可以使用此代码接收电子邮件,但我还希望获得包含已发送电子邮件数据的响应,例如 AWS 用来唯一标识消息的消息 ID。

我正在使用 MimeMessage 创建一封电子邮件,并在 try catch 块中使用此代码发送它:

transport.sendMessage(message, message.getAllRecipients)

此代码只是向 AWS 服务器发送一封电子邮件,我无法取回任何元数据。有没有办法监听响应以查看消息是否成功,以便我可以检索消息 ID?

【问题讨论】:

  • 这不是 SMTP 规范的一部分,所以不 - 服务器不会将该信息发送到发送器。
  • 确实如此。您是否检查过此消息元数据是否已返回给发件人?普通的 SMTP 不是很冗长,但据我所知,亚马逊可能有一些扩展。如果是这样,那么 SMTP 协议非常简单,使用 Java 套接字发送消息并不困难。 JavaMail 定义了一个TransportListener,但我怀疑它会捕获不是 SMTP 中通用内容的数据。
  • 是的,发送的电子邮件包含我需要的元数据。谢谢大家,我会考虑使用 AWS 提供的 API 电子邮件替代方案。
  • 通常 SMTP 协议对话会包含有关消息 ID 的线索。显然javaee.github.io/javamail/docs/api/com/sun/mail/smtp/… 将允许配置一个记录器,也许可以通过查询来获取消息ID?不知道这些ID有什么用!我(很多年前在 perl 中)编写了一个电子邮件处理系统,试图跟踪所有尝试通过 id 发送的电子邮件。它必须解析日志和各种东西才能使其工作。怀疑你可以在 AWS 上做到这一点

标签: java amazon-web-services email smtp jakarta-mail


【解决方案1】:

将属性mail.smtp.reportsuccessmail.smtp.sendpartial 添加到您的java Mail Properties,如果发送电子邮件成功,您将获得SMTPAddressSucceededException,如果发送失败,您将获得SMTPAddressFailedException

javamail doc

【讨论】:

    【解决方案2】:

    如果 sendMessage 方法返回,则服务器接受了该消息。但是请注意that doesn't necessarily mean it will be delivered to the recipient。但是此时您可以使用getMessageID 方法来检索消息ID。

    如果send方法抛出异常,服务器由于某种原因拒绝接受消息,不会发送出去。

    【讨论】:

    • 这确实有效,但我查看了 AWS 生成的消息 ID,它有所不同。所以我需要找到一种方法来获取这个 ID。还是谢谢。
    • 您说的是收件人收到的邮件中的 Message-ID 标头吗?如果 AWS 在发送它确实不应该做的消息时重写 Message-ID 标头),我不确定如何获取该信息。如果它确实在 SMTP 响应代码中包含该信息,则可以使用 JavaMail 监视 SMTP 响应。您可以发布 JavaMail debug output 显示带有 Message-ID 的 SMTP 响应吗?
    猜你喜欢
    • 2013-06-25
    • 2013-05-15
    • 2018-01-02
    • 1970-01-01
    • 2020-11-04
    • 2021-09-09
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多