2011-12-03 10 views
13

Làm cách nào để đặt id tin nhắn SMTP trong khi gửi thư với javax.mail. Máy chủ thư của tôi đang báo cáo nội dung như sau:Làm cách nào để đặt hoặc thay đổi ID thư SMTP với javax.mail?

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 

Tôi muốn đặt [email protected] trước khi gửi. Điều này có thể không? Email nó tạo ra như thế này:

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

Trả lời

21

tôi tin rằng phần này của JavaMail FAQ trả lời câu hỏi của bạn:

Q: tôi đặt một giá trị đặc biệt đối với các tiêu đề Message-ID của thông điệp mới của tôi , nhưng khi tôi gửi thông báo này, tiêu đề được viết lại.

A: Một giá trị mới cho lĩnh vực Message-ID được thiết lập khi các phương pháp được gọi SaveChanges (thường là mặc nhiên khi một tin nhắn là gửi), ghi đè lên bất kỳ giá trị mà bạn đặt ra cho mình. Nếu bạn cần đặt ID thư riêng của mình và giữ lại nó, bạn sẽ phải tạo lớp con MimeMessage của riêng mình, ghi đè phương thức updateMessageID và sử dụng trường hợp của lớp con này.

class MyMessage extends MimeMessage { 
    ... 

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

Theo Oracle's FAQ, khi bạn gửi tin nhắn hoặc gọi SaveChanges, tiêu đề Message-Id thiết lập theo phương pháp updateMessageID(), trong đó ghi đè bất kỳ giá trị mà bạn có thể đã thiết lập.

Để thiết lập giá trị của riêng bạn, bạn sẽ cần phải tạo ra một sub-class của MimeMessage và thực hiện updateMessageID() chức năng của riêng bạn:

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

tôi đã có thể sử dụng kỹ thuật này để ngăn chặn hoặc loại bỏ các tin nhắn tiêu đề -ID như thế này:

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

Đây là hữu ích cho Mailgun, thiết lập Message-Id bản thân nếu bạn không đặt một.

1

Bạn cũng có thể lưu thông báo Thay đổi và đặt tin nhắn tùy chỉnhId trước khi gửi. Các bước:

  1. tạo thông điệp MimeMessage và Đặt dữ liệu của nó.
  2. message.saveChanges();
  3. message.setHeader ("ID thư", yourCustomMessageId);
  4. gửi tin nhắn.
0
MimeMessage msg = new MimeMessage(s) { 
    @Override 
    protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID 
}; 
msg.setHeader("Message-ID", "MyOwnMessageID"); 
0

đây là mã hoàn chỉnh để thực hiện các id tùy chỉnh trong tin nhắn

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