JavaMailを使用してReturn-Pathを送信者アドレス以外の電子メールアドレスに設定するにはどうすればよいですか?
3 に答える
以下のコードはあなたが望むことを行い、正しい方法でそれを行います。コメントに投稿した内容を読み直してください
配信SMTPサーバーがメッセージの「最終配信」を行うとき、メールデータの先頭にリターンパス行を挿入します。このreturn-pathの使用は必須です。メールシステムはそれをサポートしなければなりません。return-path行は、MAILコマンドからの情報を保持します。ここで、最終配信とは、メッセージがSMTP環境を離れたことを意味します。通常、これは宛先ユーザーまたは関連するメールドロップに配信されたことを意味しますが、場合によっては、別のメールシステムによってさらに処理および送信されることもあります。
そして数行後。
メッセージ発信SMTPシステムは、Return-pathヘッダーがすでに含まれているメッセージを送信すべきではありません(SHOULDNOT)。
これを注意深く読むと、最後のsmtp-server/deliveryエージェントのみがReturn-Path
ヘッダーを追加することになっていることがわかります。クライアント(メールを送信しようとしている)としてあなたがすべきことではありません。最終的なsmtp-serverは、エンベロープ(一部)Return-Path
の送信者アドレスに基づいてヘッダーを作成します。SMTP MAIL FROM
したがって、設定mail.smtp.from
は、エンベロープ送信者アドレスがパーツとは異なる必要があることをJavaに伝える正しい方法from
です。
異なるものが何であるかを理解するのに問題がある場合はfrom
、telnetsmtp-sessionを見てください。どこreplyto@example.com
に対応する必要がsmtp.mail.from
ありfrom@example.com
ますm.addFrom(...);
telnet smtp.example.com 25
220 smtp.example.com ESMTP .....
helo computername
250 smtp.example.com Hello computername [123.123.123.123]
mail from:<replyto@example.com>
250 <replyto@example.com> is syntactically correct
rcpt to:<rcpt@foo.com>
250 <rcpt@foo.com> verified
data
354 Enter message, ending with "." on a line by itself
To: Joey <to@joey.com>
From: Joey <from@example.com>
Subject: Joey
Hey Joey!
.
250 OK id=....
Quit
props.put("mail.smtp.from", "replyto@example.com");
Session session = Session.getDefaultInstance(props, null);
MimeMessage m = new MimeMessage(session);
m.addFrom(InternetAddress.parse("from@example.com"));
私は同じ問題を経験し、プロパティ "mail.smtp.from" props.put( "mail.smtp.from"、 "replyto@example.com");を置くことについて議論された唯一の解決策を見つけました。
それでも、私はさまざまなユーザーから大量の電子メールを送信しているため、このソリューションは私には適していませんでした。そのため、電子メールごとにセッションを再作成することは、生産性にとって恐ろしいことです。
そこで、JavaMailのソースを読んだ後、別の解決策を見つけました。
1)MimeMessageの代わりにSMTPMessage(extends MimeMessage)を使用します。
2)setEnvelopeFrom(String)メソッドを使用します。
3)SMTPTransportを使用して電子メールを送信します(他の人とは試しませんでした)。
コード例は次のとおりです。
SMTPMessage message = new SMTPMessage(session);
message.setEnvelopeFrom("returnpath@hotmail.com");
...
transport.sendMessage(message, message.getAllRecipients());
'mail.protocol'プロパティが'smtp'以外('smtps'など)に設定されている場合、次の場合にのみ機能することがわかりました。
props.put("mail.smtps.from", "replyto@example.com");
これにより、GiorgosDevの回答で説明されているSMTPMessageクラスの使用を回避できました(「com.sun」パッケージのクラスはパブリックAPIを意図したものではありません)。