如何使用JavaMail将Return-Path设置为与发件人地址不同的电子邮件地址?

18

如何使用JavaMail将Return-Path设置为与发件人地址不同的电子邮件地址?

3个回答

27
下面的代码以正确的方式执行您想要的操作。请重新阅读您在评论中发布的内容。

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

几行之后说:

源自消息的SMTP系统不应发送已包含Return-path标题的消息。

如果您仔细阅读此文,您将了解只有最终的SMTP服务器/交付代理应添加Return-Path标头。这不是您作为客户端(尝试发送邮件)应该执行的操作。最终的SMTP服务器将基于信封发件人地址(SMTP MAIL FROM部分)设置Return-Path标头。

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

如果您不理解不同的from是什么,请查看telnet smtp会话。其中replyto@example.com应该对应于mail.smtp.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"));

我相信这可能是解决方案。但从我所读的内容来看,邮件服务器必须支持它。 当交付SMTP服务器进行消息的“最终交付”时,它会在邮件数据开头插入一个返回路径行。这种使用返回路径是必需的;邮件系统必须支持它。返回路径行保留了MAIL命令中<reverse-path>中的信息。"在http://www.ietf.org/rfc/rfc2821.txt中。 - Ricardo
我一直在尝试在代码的许多其他层面上实现这个,但这是唯一有效的解决方案。 - kommradHomer
但是根据我所读的,邮件服务器必须支持它。是哪个支持它?最初的SMTP服务器还是进行最终交付的那个? - Diego Ramos

7

我曾经遇到过相同的问题,并发现唯一讨论的解决方案是将属性"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());

这对我很有用,当"mail.smtp.from"方法无效时。谢谢!太棒了。 - Nick

1
我发现如果将'mail.protocol'属性设置为除'smtp'(如'smtps')以外的其他值,则只有以下内容才能正常工作:
props.put("mail.smtps.from", "replyto@example.com");

这使我避免了使用SMTPMessage类,如GiorgosDev的回答中所述('com.sun'包中的类不打算作为公共API)。

你有什么具体问题? - David Leal
第一个答案对我来说不起作用;第二个方法有点取巧;这个方法对我有用(我使用smtps而不是smtp作为“mail.protocol”)...只是想分享一下... - davepletcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接