【问题标题】:How do I set or change the SMTP Message-ID with javax.mail?如何使用 javax.mail 设置或更改 SMTP 消息 ID?
【发布时间】:2012-01-12 02:28:27
【问题描述】:

如何在使用javax.mail 发送邮件时设置 SMTP 邮件 ID。我的邮件服务器报告如下内容:

1 <= me@domain.com H=mail (host) [192.168.1.4] P=esmtp S=142014
     id=2043289758.9.1322829290422.JavaMail.thor@developer.local
2 => sombodey@else R=dnslookup T=remote_smtp H=mx00.t-online.de [194.25.134.8]
3 Completed

我想在发送之前设置id=2043289758.9.1322829290422.JavaMail.thor@developer.local。这可能吗?它创建的电子邮件是这样的:

Properties props = System.getProperties();
props.put("mail.smtp.host", "192.168.1.4");
Session session = Session.getDefaultInstance(props, null);
session.setDebug(false);
Message msg = createMsg();
Transport.send(msg);

【问题讨论】:

    标签: java smtp jakarta-mail


    【解决方案1】:

    我相信JavaMail FAQ 的这一部分回答了你的问题:

    问:我为我的新消息的 Message-ID 标头设置了一个特定值,但是当我发送此消息时,标头被重写。

    答: 在调用 saveChanges 方法时会为 Message-ID 字段设置一个新值(通常在消息被 发送),覆盖您自己设置的任何值。如果您需要设置您的 拥有 Message-ID 并保留它,您必须创建自己的 MimeMessage 子类,覆盖 updateMessageID 方法并使用 这个子类的实例。

    class MyMessage extends MimeMessage {
        ...
    
        protected void updateMessageID() throws MessagingException {
      setHeader("Message-ID", "my-message-id");
        }
        ...
    }
    

    【讨论】:

      【解决方案2】:

      根据Oracle's FAQ,当您发送消息或调用 saveChanges 时,updateMessageID() 方法设置的 Message-Id 标头会覆盖您可能已经设置的任何值。

      要设置您自己的值,您需要创建一个 MimeMessage 的子类并实现您自己的 updateMessageID() 函数:

      class MyMimeMessage extends MimeMessage {
          ...
          protected void updateMessageID() throws MessagingException {
              setHeader("Message-ID", "my-message-id");
          }
          ...
      }
      

      我能够使用这种技术来抑制或消除 Message-Id 标头,如下所示:

      @Override
      protected void updateMessageID() throws MessagingException {
          removeHeader("Message-Id");
      }
      

      这对 Mailgun 很有用,如果您不设置 Message-Id,它会自行设置。

      【讨论】:

        【解决方案3】:

        您还可以在发送前保存消息更改并设置自定义消息 ID。 步骤:

        1. 创建MimeMessage message 并设置其数据。
        2. message.saveChanges();
        3. message.setHeader("Message-ID", yourCustomMessageId);
        4. 发送消息。

        这对于 Spring 的 JavaMailSender 或其他难以覆盖 MimeMessage 的情况很有用。

        【讨论】:

        • 这是正确答案。不需要新类...刚刚在调用.send() 方法之前创建。
        【解决方案4】:
        MimeMessage msg = new MimeMessage(s) {
            @Override
            protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID
        };
        msg.setHeader("Message-ID", "MyOwnMessageID");
        

        【讨论】:

          【解决方案5】:

          这是实现消息中自定义id的完整代码

          public class SendMessage{
          
               private String idMessage;
          
               private void sendEmail() {
                   //...
                   // Create de session
                   //...
          
                   Message message = new MyMessage(session);
          
                   //...
                   // Prepare the body of the message, attachments, etc.
                   //...
          
                   // assign custom message id
                   this.idMessage = “My own ID”;
          
                   //send
                   Transport.send(message);
              }
          
              class MyMessage extends MimeMessage {
          
                  public MyMessage(Session session) {
                     super(session);
                  }
          
                  protected void updateMessageID() throws MessagingException {
                      setHeader("Message-ID", this.idMessage);
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-10-18
            • 1970-01-01
            • 2021-11-07
            • 1970-01-01
            • 2014-08-18
            • 2011-03-23
            • 1970-01-01
            • 2010-10-10
            相关资源
            最近更新 更多