MacOS 上的 Mail 程序存在问题。它没有请求发送通知的选项(例如,通知收件人的电子邮件服务器已接受电子邮件),并且 DSN 消息永远不会作为 Mail 电子邮件的回复(在 MacOS 上)。非常无用!
当邮件客户端要求时,我的 postfix 会发送 DSN。例如,使用 Thunderbird 时,它可以正常工作。
现在选项已关闭:
smtpd_discard_ehlo_keywords = etrn, silent-discard
是否可以始终向发件人(通过此后缀发送电子邮件的人)发送 DSN?
答案1
这与配送通知(DSN)定义在RFC 3464。仅当客户端明确请求时,才会发送成功时的 DSN。
由于 DSN 需要在协议级别MAIL FROM
或RCPT TO
命令上进行修改,因此服务器必须报告支持 DSN。首先宣布服务器支持扩展 SMTP,然后作为对EHLO
命令的回复,列出支持的功能250 DSN
,例如最后一行:
<-- 220 mail.example.com ESMTP Postfix (Debian/GNU)
--> EHLO client-198.51.100.123.example.com
<-- 250-mail.example.com
<-- 250-PIPELINING
<-- 250-SIZE 10240000
<-- 250-VRFY
<-- 250-ETRN
<-- 250-STARTTLS
<-- 250-ENHANCEDSTATUSCODES
<-- 250-8BITMIME
<-- 250-DSN
Postfix 有支持DSN
以及选项限制谁可以请求它。来自简介:
具体来说,DSN 支持使电子邮件发件人能够指定:
发送哪些通知:成功、失败、延迟或无。通常,Postfix 仅在邮件传递延迟或传递失败时通知发件人。
失败时返回什么内容:仅消息头,或者完整消息。
作为传递状态通知的一部分返回的信封 ID。它标识消息提交事务,并且不得与标识消息内容的消息 ID 混淆。
DSN 支持的实现涉及 SMTP MAIL FROM 和 RCPT TO 命令的额外参数,以及两个 Postfix sendmail 命令行选项,它们提供额外 SMTP 命令参数功能的子集。
让我们稍微解释一下。正常的简单 SMTP 连接将继续:
--> MAIL FROM: [email protected]
<-- 250 2.1.0 Ok
--> RCPT TO: [email protected]
<-- 250 2.1.5 Ok
但如果支持并请求 DSN,则可能是(取决于请求的内容)例如
--> MAIL FROM: [email protected] RET=HDRS
<-- 250 2.1.0 Ok
--> RCPT TO: [email protected] NOTIFY=FAILURE,DELAY ORCPT=rfc822;[email protected]
<-- 250 2.1.5 Ok
此处,RET=HDRS
表示只应将标题添加到自动回复中, 并NOTIFY=
指定只应报告失败和延迟。如果还有NOTIFY=SUCCESS
,则将发送任何结果的报告,即这会改变 Postfix 的正常行为。(ORCPT
只是添加原始收件人。)
因此,如果没有明确请求,服务器根本就不应该擅自发送成功传送通知。
遗憾的是 Mac OS X Mail 不支持此功能。这并不奇怪,因为此客户端甚至没有 GUI 支持已读回执。幸运的是,已读回执是一种不同的标准,不涉及对 SMTP 命令的修改:它通过Disposition-Notification-To
在电子邮件内容中添加标题来实现。这可以通过 Mac OS X 终端(添加、删除和检查)来实现:
defaults write com.apple.mail UserHeaders '{"Disposition-Notification-To" = "u@example"; }'
defaults delete com.apple.mail UserHeaders
defaults read com.apple.mail UserHeaders