我在 Linux 上有一个 SMTP + IMAP 服务器,并使用筛选过滤来提供一些有用的功能。
其中一个功能是外出回复,由以下脚本提供:
require ["fileinto", "vacation", "variables"];
# ignore spam
if header :contains "X-Spam-Flag" "YES" {
fileinto "Junk E-mail";
stop;
}
vacation
:days 1
:subject "Out of office"
:addresses ["..."]
"contact x, y, or z instead.";
但是,我不喜欢自动回复对用户透明这一事实;用户无法明确回答“X 是否收到回复?”这个问题。原则上,我也希望用户能够看到从他们的地址发送的每封电子邮件。
因此,我希望将所有外出回复存储在用户sent
文件夹中。这样,用户就可以轻松查看已发送的自动回复。
有谁知道如何实现这一点?
答案1
没有直接的方法来实现您的目标,因为 Sieve 脚本仅在传入邮件上运行。传出邮件由 Postfix/Exim/Sendmail 或您正在使用的任何邮件传输代理处理,因此 Sieve 不会参与其中。对于传入邮件,RFC 5230 明确禁止将 vacation 与 Sieve 的“fileinto”操作一起使用:请参阅RFC 5230 第 4.7 节。
因此,为了让 Sieve 参与进来 (1) 您必须将发出的休假消息的副本发送给自己,并且 (2) 您必须为 Sieve 提供一种方法来识别您的休假自动回复,以便它可以将传入的自动回复消息移动到您的Sent
文件夹中。
实现此目的的一种可能方法是使用 Postfix 中的“加号别名”机制。这样,您可以从“加号别名”地址发送休假自动回复,从而让 Postfix 和 Dovecot/Sieve 都能识别它们。
在您的 Sieve 脚本中,确保休假自动回复是从您的“加号别名”地址发送的:
vacation
:from "Your Name <[email protected]>"
添加以下内容/etc/postfix/main.cf
:
recipient_delimiter = +
header_checks = pcre:/etc/postfix/header_checks.pcre
在 中/etc/postfix/header_checks.pcre
,识别您发出的休假消息并添加规则以将此类消息复制给您自己:
/^From: [^<]*<your.name\[email protected]>/ BCC [email protected]
也许可以使用反向引用来编写类似的一般规则,但我还没有尝试过,也不能说这是否有效。From: [^<]*<([^\+]+)\[email protected]>/ BCC [email protected]
确保您已recipient_delimiter = +
位于 /etc/dovecot/conf.d/90-sieve.conf(或您用于配置 Sieve 的任何其他文件)。
最后,将以下规则添加到 Sieve 休假脚本的顶部:
require ["vacation", "variables", "date", "relational", "fileinto", "envelope"];
if allof ( address :is :all "from" "[email protected]",
envelope :is :all "to" "[email protected]" ) {
fileinto "Sent";
}
此 Sieve 规则将移动发给您的邮件以及来自[电子邮件保护]到您的Sent
文件夹。