如何使用JavaMail将返回路径设置为发件人地址以外的电子邮件地址?

2022-09-02 20:24:44

如何使用JavaMail将返回路径设置为发件人地址以外的电子邮件地址?


答案 1

下面的代码执行所需的操作,并以正确的方式执行。重读您自己在评论中发布的内容

来自: RFC2821: 4.4 跟踪信息

当传递 SMTP 服务器对邮件进行“最终传递”时,它会在邮件数据的开头插入一个返回路径行。这种返回路径的使用是必需的;邮件系统必须支持它。返回路径行保留“从 MAIL”命令中的信息。此处,最终传递意味着邮件已离开 SMTP 环境。通常,这意味着它已被传递给目标用户或相关的邮件投递,但在某些情况下,它可能被另一个邮件系统进一步处理和传输。

以及几行之后。

邮件源 SMTP 系统不应发送已包含返回路径标头的邮件。

如果您仔细阅读本文,您将了解只有最终的smtp服务器/传递代理应该添加标头。这不是您作为客户(尝试发送邮件)应该做的事情。最终的smtp服务器将基于信封的发件人地址(部分)的标头。Return-PathReturn-PathSMTP MAIL FROM

因此,设置是告诉java信封发件人地址应与部分不同的正确方法。mail.smtp.fromfrom

如果您无法理解不同的是什么,只需查看 telnet smtp 会话即可。应对应于 和fromreplyto@example.comsmtp.mail.fromfrom@example.comm.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"));

答案 2

我遇到了同样的问题,并找到了唯一的解决方案,讨论了将属性“mail.smtp.from”props.put(“mail.smtp.from”,“replyto@example.com”);

这个解决方案仍然不适合我,因为我从不同的用户发送了很多电子邮件,所以为每封电子邮件重新创建会话对于欺骗性来说是可怕的。

因此,在阅读JavaMail源代码后,我找到了另一种解决方案:

1)使用SMTPMessage(扩展MimeMessage)而不是MimeMessage。

2) 使用 setEnvelopeFrom(String) 方法。

3)使用SMTPTransport发送电子邮件(我没有尝试与他人合作)。

下面是一个代码示例:

SMTPMessage message = new SMTPMessage(session);
message.setEnvelopeFrom("returnpath@hotmail.com");
...
transport.sendMessage(message, message.getAllRecipients());

推荐