17

JavaMailを使用してReturn-Pathを送信者アドレス以外の電子メールアドレスに設定するにはどうすればよいですか?

4

3 に答える 3

26

以下のコードはあなたが望むことを行い、正しい方法でそれを行います。コメントに投稿した内容を読み直してください

差出人:RFC2821:4.4トレース情報

配信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"));
于 2009-11-23T12:02:45.223 に答える
8

私は同じ問題を経験し、プロパティ "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());
于 2013-09-26T14:17:10.467 に答える
0

'mail.protocol'プロパティが'smtp'以外('smtps'など)に設定されている場合、次の場合にのみ機能することがわかりました。

props.put("mail.smtps.from", "replyto@example.com");

これにより、GiorgosDevの回答で説明されているSMTPMessageクラスの使用を回避できました(「com.sun」パッケージのクラスはパブリックAPIを意図したものではありません)。

于 2019-06-17T19:29:11.527 に答える