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

时间:2009-11-23 11:48:11

标签: java email javamail

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

3 个答案:

答案 0 :(得分:23)

下面的代码可以满足您的需求,并以正确的方式完成。重读您自己在评论中发布的内容

  

来自:RFC2821: 4.4 Trace Information

     

发送SMTP服务器时   它的“最终交付”消息   在...处插入一条返回路径   邮件数据的开头。这个用途   返回路径是必需的;邮件   系统必须支持它。该   返回路径保留了   信息在   来自MAIL命令。在这里,最后   发送意味着消息已经离开   SMTP环境。通常,这个   意味着它已被送到   目标用户或关联的   邮件丢弃,但在某些情况下可能是   进一步处理和传输   另一个邮件系统。

以后几行。

  

源自消息的SMTP系统   不应该发送已经发送过的消息   包含一个返回路径标题。

如果仔细阅读本文,您将了解只有最终的smtp-server / delivery代理才能添加Return-Path标题。这不是你作为客户端(试图发送邮件)应该做的事情。最终的smtp-server将Return-Path标题基于信封的发件人地址(SMTP MAIL FROM部分)。

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

如果您在理解不同from的内容时遇到麻烦,请查看telnet smtp-session。 replyto@example.com应与smtp.mail.fromfrom@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"));

答案 1 :(得分:8)

我遇到了同样的问题,并找到了唯一的解决方案,讨论了将属性“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());

答案 2 :(得分:0)

我发现,如果将'mail.protocol'属性设置为'smtp'以外的其他内容(例如'smtps'),那么只有以下内容可以工作:

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

这使我避免使用GiorgosDev的答案中所述的SMTPMessage类('com.sun'程序包中的类并非旨在用作公共API)。