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

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

 1  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); 

我相信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"); } ... } 

根据Oracle的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很有用,如果你没有设置Messagegun,它会自己设置Message-Id。

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

  1. 创建MimeMessage消息并设置其数据。
  2. message.saveChanges();
  3. message.setHeader(“Message-ID”,yourCustomMessageId);
  4. 发信息。
 MimeMessage msg = new MimeMessage(s) { @Override protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID }; msg.setHeader("Message-ID", "MyOwnMessageID"); 

这是在消息中实现自定义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); } } }