2011-12-03 63 views
13

如何在使用javax.mail發送郵件時設置SMTP消息標識。我的郵件服務器的報告是這樣的:如何使用javax.mail設置或更改SMTP消息ID?

1 <= [email protected] H=mail (host) [192.168.1.4] P=esmtp S=142014 
    [email protected] 
2 => [email protected] R=dnslookup T=remote_smtp H=mx00.t-online.de [194.25.134.8] 
3 Completed 

我想在發送前設置[email protected]。這可能嗎?電子郵件像這樣創建:

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

回答

21

相信JavaMail FAQ的這一部分回答您的問題:

問:我爲自己的新郵件的Message-ID頭一個特定的值,但是當我發送該消息時,該頭部被重寫。

答:當SaveChanges方法被稱爲用於Message-ID字段的新值被設定(通常隱含當消息是 發送),覆蓋你自己設置的任何值。如果您需要設置自己的消息ID並保留它,您將不得不創建自己的 MimeMessage子類,覆蓋updateMessageID方法並使用此子類的實例 。

class MyMessage extends MimeMessage { 
    ... 

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

根據Oracle's FAQ,當在發送郵件或呼叫的SaveChanges時,Message-ID頭由updateMessageID()方法,它覆蓋你可能已經設置的任何值設置。

要設置自己的價值,你需要創建一個子類的MimeMessage,並實現自己的updateMessageID()函數:

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

我能夠使用這種技術來抑制或消除消息 - 像這樣的標頭:

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

這對Mailgun很有用,Mailgun會設置Message-Id本身,如果你沒有設置。

1

您還可以在發送之前保存消息更改並設置自定義messageId。 步驟:

  1. 創建MimeMessage消息並設置其數據。
  2. message.saveChanges();
  3. message.setHeader(「Message-ID」,yourCustomMessageId);
  4. 發送消息。
0
MimeMessage msg = new MimeMessage(s) { 
    @Override 
    protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID 
}; 
msg.setHeader("Message-ID", "MyOwnMessageID"); 
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); 
     } 
    } 
}