设置电子邮件标题,以便退回的电子邮件转到特定地址
Posted
技术标签:
【中文标题】设置电子邮件标题,以便退回的电子邮件转到特定地址【英文标题】:Set email headers so bounced emails go to a specific address 【发布时间】:2011-07-15 06:47:47 【问题描述】:从我们的 Rails 应用程序中,我们发送一些系统生成的电子邮件,其中“发件人”地址设置为 noreply@ourdomain.com。如果这些被退回,我们的邮件服务器会将它们发送回该地址。但是,我想做的是不要将退回的电子邮件发送回 noreply@ourdomain.com,而是发送到不同的地址,例如bounced@ourdomain.com。
是否有我可以在电子邮件中设置的标题或其他内容来实现这一点,而无需我去调查我们的电子邮件服务器的变幻莫测?如果相关,我们会使用 exim 发送邮件。
干杯,最大
【问题讨论】:
(+1) 好问题。进展如何? en.wikipedia.org/wiki/Variable_envelope_return_path 通常用于 From 和不同的信封地址... 【参考方案1】:在阅读了很多关于 exim 配置的信息后,我自己在 exim4 中发现了这一点。
首先,您希望您的应用添加以下标头:
Return-Path: <bounced@yourdomain.com>
可以带或不带括号。无论哪种方式,Exim 都会在最后添加括号。
其次,这是最困难的部分。 Exim 一直想用发送它的 unix 用户覆盖我的 Return-Path: 地址。您可以在 Ubuntu 中使用 /etc/email-addresses 为您的 Web 应用程序的用户设置静态电子邮件,但这仍然会忽略 Return-Path 标头。以下是我如何修改我的 exim 配置以尊重 Web 应用程序的 Return-Path:
在主配置区添加:
return_path_remove = false
在适当的路由器配置中(例如 dnslookup):
dnslookup:
# ...
errors_to = $if def:h_return-path: $address:$h_return-path: fail
headers_remove = return-path
no_more
现在 exim 应该在信封级别复制 Return-Path 标头地址并删除原始 Return-Path 标头。
我尝试了很多其他配置指令,这是唯一对我有用的方法。
【讨论】:
这应该行不通。不是因为您还没有弄清楚如何在 Exim 中设置 Return-Path,而是因为它会被传递 SMTP 服务器覆盖。来自 RFC 5321 第 4.4 节:“当传递 SMTP 服务器完成消息的最终传递时,它会在邮件数据的开头插入一个返回路径行。需要使用返回路径;邮件系统必须支持它. return-path 行保留了来自 MAIL 命令的3 年太晚了,但以防万一其他人也这样过来。 Return-Path
是正确的标题,但正如 James Garriss 在上面指出的那样,它必须由执行最终交付的站点放置在那里。你不能只把它粘在自己身上。
如果您通过直接连接到 SMTP 服务器来编写电子邮件,那么这很容易 - MAIL
命令包含返回路径。如果你发送
MAIL FROM:<me@foo.com>
到 SMTP 服务器,然后退回邮件将返回到me@foo.com
。
如果您不是在构建 SMTP,而是在运行 MTA(即 exim/etc),那么您必须为您的 MTA 找到一个命令行开关。对于 sendmail,-f me@foo.com
“设置发件人的地址”,这最终会在最终发送的邮件中以 Return-Path
结束,me@foo.com
将收到退回邮件(我对自动生成的电子邮件执行此操作)。我没有在 exim 上尝试过这个,但它有完全相同的选项,它应该可以工作。
【讨论】:
感谢本 EML。我可以使用这种方法将failed
返回地址设置为与from
地址不同吗?
@MW:是的,没问题——它们是不同的东西。只需在您希望收件人看到它的标题中设置From:
,并根据需要设置-f
地址(即“信封”/等地址)以进行退回。一个警告:MTA 可能会怀疑存在安全违规行为,并在收到的电子邮件 (X-Authentication-Warning
) 中插入一个额外的标头以警告收件人。这取决于您的确切 MTA 设置。 sendmail 书中有一整页内容是关于避免这种情况的。如果您的收件人看到此标题,并且您想删除它,您可能应该问另一个问题。
返回路径仅供参考。当收到消息时,它会告诉收件人退回邮件的去向。它实际上并没有做任何事情。正如你所说的-f
在/usr/lib/sendmail
发送给发件人之后是正确的答案。 /usr/lib/sendmail
的某些实现可能会将“return-path”标头解释为等效的。【参考方案3】:
Return-Path
标头由接收服务器写入,而不是由发送服务器写入。根据RFC 5321,它与MAIL FROM
命令中提供的地址相同。
即使您自己设置了Return-Path
标头,接收服务器也会覆盖它。
现在,事情是这样的,MAIL FROM
命令中的地址和From
标头中的地址可以不同。接收用户看不到MAIL FROM
地址。他们只看到From
标头地址。
因此,如果您想忽略退回邮件或希望它们转到特定地址,您应该在 MAIL FROM
命令中使用该地址。
但是在From
标头中,您可以只使用noreply@yourdomain.com
- 用户会看到这个地址。
为了简化一点,您从handle_bounce@yourdomain.com
地址发送电子邮件。接收服务器会将退回邮件发送到此地址。
要向您的用户显示noreply@yourdomain.com
地址而不是handle_bounce...
地址,请将原始电子邮件MIME 消息中的From
标头设置为noreply...
地址。
我最近收到了一封来自 Bitbucket 的不回复电子邮件。这是原始消息:
Return-Path: <bounce-1231860_html-1209402755-103116181-132689-225@bounce.mailer.atlassian.com>
From: "Atlassian Bitbucket" <noreply@mailer.bitbucket.org>
To: <me@hostname.com>
Subject: Continuous delivery, without the headache.
Date: Wed, 28 Feb 2018 12:40:53 -0600
MIME-Version: 1.0
Reply-To: "Atlassian Bitbucket" <reply-fe3915707665057b741c71-1231860_HTML-1209402755-132689-225@mailer.atlassian.com>
... message body ...
如您所见,Return-Path
是专门用于处理退回邮件的地址。但是From
地址是noreply@...
邮件。这意味着这封电子邮件实际上是由这个退回处理地址发送的,而不是由 noreply 地址发送的。
您还可以看到Reply-To
标头,如果用户回复无回复电子邮件,则该标头专用于处理回复。这些回复可能会立即被丢弃。
【讨论】:
在org.apache.commons.mail.Email包中,有setBounceAddress()函数。我已经测试了该功能,但它不起作用;证明你的主张是正确的。那么如果我们不能在发送服务器上设置该功能应该做什么呢? @Coisox 抱歉,我没有使用 Apache Commons Mail 的经验。 您绝对可以将Return-Path
标头设置为发件人。但是,是的,一些接收者可能会重写它(但并非总是如此),或者根据您发送的对象,它可能会被他们重写。例如,当使用 MailGun 发送批量电子邮件时,您必须正确地设置一个 Return-Path
以保留它。我知道这与您引用的 RFC 相矛盾,但在实践中确实如此。
@steev 接收服务器 将 覆盖返回路径(那些不是 RFC 实施不完整的结果,如果应该改变我不会感到惊讶将来恕不另行通知)。如果它适用于 mailgun,我猜他们在后台使用我在答案中提到的 mail-from 命令的返回路径值。抱歉,实际上这不是真的。它是什么,是不可靠的。
@xyres 它在实践中是正确的,而且,是的,不可靠。 YMMV。 :) 归根结底,最好的做法是设置 Mail-from
和 Return-path
和 Reply-to
并希望其中一个能够正常工作。事情就是这样,那里有不合规的 ESP。您可以抱怨并成为 RFC 的纯粹主义者,也可以适应现实。【参考方案4】:
Errors-To 已弃用,因此邮件服务器通常会忽略此标头 - 大多数服务器将退回到“信封发件人”。
这是您的邮件客户端作为the connection to the SMTP 服务器的一部分发送的电子邮件地址(不一定是发件人地址 - 尽管通常是相同的)。
我不太了解 Rails,但我找到了 this - 不过,据我所知,返回路径已由 MTA 重置以匹配来自客户端的 MAIL FROM 信息,所以看起来你可以实际上并没有设置它。
我认为你唯一能做的就是在你的服务器中设置退回地址。
【讨论】:
感谢 Horuskol - 邮件提供商真的会尊重该退回地址吗?我认为他们倾向于忽略所有内容并总是将退回邮件发送到发件人地址。 @MaxWilliams - 是的,你现在可能想得更多【参考方案5】:解决办法如下:
在邮件头中可以设置:
From: "From Name" <from_name@ourdomain.com>
Reply-To: noreply@ourdomain.com
Errors-To: <bounced@ourdomain.com>
Return-Path: <bounced@ourdomain.com>
【讨论】:
啊,我以前没见过 Errors-To 标头。我已经尝试过回复和返回路径无济于事。我试试看…… 这也不起作用 Dmitriy(抱歉响应缓慢) - 我可以在原始邮件中看到 Errors-To 标头,但它仍会退回到发件人地址。 xe 做错了什么是按照您的错误建议设置Errors-To:
标头。这是一个非标准的标头,用于 UUCP 邮件,已弃用,并且没有 UUCP 之外的功能。在世界上使用的众多互联网 MTS 软件中,只有三个曾经识别过它。首先,它的功能自 1990 年代中期发布的 V8.8 以来已作为标准禁用。其次,该功能在七年前被彻底删除。第三,MTS的退信部分从未使用过。
致 JdeBP:我不确定你是否知道你在说什么。只是复制粘贴一些文章。我的回答是基于实践经验。我的雇主在过去 2 年使用这种路由退回邮件的方式。不该投的反对票。
Errors-To
是非标准的,不鼓励系统使用它。也就是说,还有一些人仍然这样做。但是因为很少有系统支持它,所以在你自己的组织之外不应该被认为是可靠的。这不是一个好的选择。以上是关于设置电子邮件标题,以便退回的电子邮件转到特定地址的主要内容,如果未能解决你的问题,请参考以下文章