如何使用javax.mail设置或更改SMTP消息ID?

时间:2011-12-03 09:42:47

标签: java smtp javamail

如何在发送带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);

5 个答案:

答案 0 :(得分:23)

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

  

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

     

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

class MyMessage extends MimeMessage {
    ...

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

答案 1 :(得分:11)

根据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,它会自行设置Message-Id。

答案 2 :(得分:3)

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

  1. 创建MimeMessage message并设置其数据。
  2. message.saveChanges();
  3. message.setHeader("Message-ID", yourCustomMessageId);
  4. 发送消息。
  5. 这对于Spring JavaMailSender或其他难以覆盖MimeMessage的情况非常有用。

答案 3 :(得分:0)

MimeMessage msg = new MimeMessage(s) {
    @Override
    protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID
};
msg.setHeader("Message-ID", "MyOwnMessageID");

答案 4 :(得分:0)

这是在消息

中实现自定义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);
        }
    }
}