web-dev-qa-db-ja.com

javax.mailでSMTPメッセージIDを設定または変更するにはどうすればよいですか?

javax.mailでメールを送信するときにSMTPメッセージIDを設定するにはどうすればよいですか。私のメールサーバーは次のようなことを報告しています:

1 <= [email protected] H=mail (Host) [192.168.1.4] P=esmtp S=142014
     [email protected]
2 => sombodey@else 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);
17
Thor

JavaMail FAQ のこのセクションがあなたの質問に答えると思います:

Q:新しいメッセージの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");
    }
    ...
}
24
DejanLekic

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

これは、メッセージIDを設定しない場合にメッセージID自体を設定するMailgunに役立ちました。

11
JBCP

送信する前に、メッセージの変更を保存し、カスタムメッセージIDを設定することもできます。手順:

  1. _MimeMessage message_を作成し、そのデータを設定します。
  2. message.saveChanges();
  3. message.setHeader("Message-ID", yourCustomMessageId);
  4. メッセージを送信します。

これは、SpringのJavaMailSenderや、MimeMessageをオーバーライドするのが難しいその他の状況で役立ちます。

3
Gioacchino

これは、メッセージにカスタム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);
        }
    }
}
MimeMessage msg = new MimeMessage(s) {
    @Override
    protected void updateMessageID() { } // Prevent MimeMessage from overwriting our Message-ID
};
msg.setHeader("Message-ID", "MyOwnMessageID");
0
Catalin Ciurea