如何使用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。 脚步:
- 创建MimeMessage消息并设置其数据。
- message.saveChanges();
- message.setHeader(“Message-ID”,yourCustomMessageId);
- 发信息。
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); } } }