Sieve vacation 答案很好,但使用 from: 字段而不是 reply-to: 字段,这对我来说更有意义。
使用带有 roundcube 的筛子,筛子脚本是
require ["vacation"];
# rule:[rep]
if header :contains "subject" "Software"
{
vacation :subject "reply!!" "abc";
}
我如何提示筛选回答回复?
Sieve vacation 答案很好,但使用 from: 字段而不是 reply-to: 字段,这对我来说更有意义。
使用带有 roundcube 的筛子,筛子脚本是
require ["vacation"];
# rule:[rep]
if header :contains "subject" "Software"
{
vacation :subject "reply!!" "abc";
}
我如何提示筛选回答回复?
always_bcc
postfix 通过,将所有邮件转发给 archive@domain 用户
后缀将所有 RCPT TO 保存在X-Envelope-To
标头中以保留密件抄送收件人,
X-Envelope-To
出于隐私原因,用于 smtp 传输的postfix 删除,
postfix 通过lmtp
.
dovecot 使用一个筛子脚本来刷新X-Envelope-To
除archive@domain 之外的所有用户。
最初X-Envelope-To
每个都有一个。RCPT TO
所以我希望筛子脚本添加一个连接多个值的Bcc
标题。X-Envelope-To
require "fileinto";
require "imap4flags";
require ["editheader", "envelope"];
require "regex";
require ["variables","mime","foreverypart"];
if envelope :is "to" "archive@domain" {
concat = """"";
foreverypart {
if header :regex "X-Envelope-To" "(.*)" {
concat = ${concat} "${1}";
}
}
addheader "Bcc" "${1}";
} else {
deleteheader "X-Envelope-To";
}
哪个不起作用...
有什么简单的方法可以在筛子中做到这一点?或者除了外部脚本之外别无他法?或者也许后缀可以连接所有这些,但这意味着 milter ?
提前致谢
我在我的服务器上使用 Postfix 和 Dovecot LMTP。我的问题是如何创建一个静默丢弃收件人地址并响应自动回复?我还想学习 Postfix 和 Dovecot 执行控制流程。这是我的后缀的一部分main.cf
:
alias_maps = hash:/etc/aliases
# Virtual domains
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 115
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/aliases.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
在我的/etc/aliases
:
devnull: /dev/null
在我的拙见中,Postfix 处理收件人地址是否存在?如果存在收件人地址,则传输到 Dovecot LMTP 以处理本地交付。是否可以在 Postfix 中进行有条件传输?例如,我想创建一个测试邮件地址,例如[email protected]
. 哪个帐户别名为devnull
。我的目标是收件人[email protected]
默默地丢弃传入的邮件并自动回复 PONG 消息给发件人以进行测试。如果收件人地址不是[email protected]
然后传输到 Dovecot-lmtp。我尝试使用带有假期扩展的 Dovecot Sieve 过滤器插件来处理自动回复。但是在我系统的mail.log中:
# replaced actual domain name with DOMAIN
postfix/lmtp[13532]: 62EBD333697: to=<devnull@DOMAIN>, orig_to=<ping@DOMAIN>, relay=DOMAIN[private/dovecot-lmtp], delay=538, delays=538/0.02/0.01/0.44, dsn=5.1.1, status=bounced (host DOMAIN[private/dovecot-lmtp] said:
550 5.1.1 <devnull@DOMAIN> User doesn't exist: devnull@DOMAIN (in reply to RCPT TO command))
所以,我猜 Dovecot Sieve 过滤器插件不适用于不存在的帐户。是否可以在检查用户邮箱之前执行 Sieve 脚本?如果是这样,我什至不需要使用devnull
黑洞别名。我可以在我的筛子脚本中这样做:
if address :matches "To" "ping@*" {
vacation
:seconds 1
"PONG";
discard;
}
更新:
我在我的数据库中创建了一个名为的用户ping
,并在我的 GMail 帐户中收到了一封回复邮件。但这并不是真正的回复邮件。这是我收件箱里的新邮件。然后我尝试使用 Apple 邮件 GUI 软件手动回复。它按预期工作。然后我去 gmail 并按菜单show original
。
Apple Mail 的message-id
域部分是正确的发件人虚拟域。
但是来自 Dovecot/Sieve 的message-id
域部分是我服务器的hostname
.
我不知道为什么会这样。但我的猜测是可能是因为域名被更改了?在 Apple Mail 软件的工作示例中,它是正确的发件人虚拟域。但是从筛子自动回复中,它改变了我服务器的真实主机名。
另一个 Postfix 日志来自/var/log/mail.log
postfix/cleanup[1329]: EE83F333699: message-id=<dovecot-sieve-1623257247-953496-0@HOSTNAME>
PS:我只有几天的 Postfix、Dovecot 经验和几个小时的筛子脚本经验。我是新手。我希望我的问题和目标足够明确。如果您需要更多信息,请问我。
这实际上是这篇文章的后续问题:Postfix aliases and duplicate e-mails, how to fix?
(我没有足够的声誉来评论那篇文章。)
正如第一个答案所暗示的那样,我已经设置了我的 Postfix + Dovecot - 通过使用丢弃重复项的筛子脚本。它在大多数情况下运行良好。当收件人超过配额时,它会奇怪地工作。
这是第一次交付尝试的日志。正如预期的那样,它因 tempfail Quota 超出而失败:
AF4481700032: to=<?@?>, relay=?[private/dovecot-lmtp], delay=0.05, delays=0.05/0/0/0, dsn=4.2.2, status=deferred (host ?[private/dovecot-lmtp] said: 452 4.2.2 <?@?> Quota exceeded (mailbox for user is full) (in reply to end of DATA command))
大约 10 分钟后,再次尝试:
dovecot: lmtp(?)<1742912><+EYHBXjidmBAmBoAcAY70w>: sieve: msgid=<489132c2-7b77-cd2f-ce60-439f6558ddcf@?>: marked message to be discarded if not explicitly delivered (discard action)
postfix/lmtp[1742691]: AF4481700032: to=<?@?>, relay=?[private/dovecot-lmtp], delay=431, delays=431/0/0/0, dsn=2.0.0, status=sent (250 2.0.0 <?@?> +EYHBXjidmBAmBoAcAY70w Saved)
postfix/qmgr[421343]: AF4481700032: removed
在我看来,Dovecot 的筛子在第一次尝试传递时记录了消息 ID,尽管传递被拒绝了。
在第二次投递尝试中,Dovecot 的筛子显然认为它看到了重复邮件,并丢弃了邮件。
这种情况有什么解决方法吗?
我目前有一个筛滤器,如下所示:
require ["variables", "envelope", "fileinto", "vnd.dovecot.filter", "subaddress"];
if envelope :matches "to" "*" {
set :lower "my_recipient" "${1}";
filter ".." "${my_recipient}";
fileinto "INBOX";
}
这很好用。但是我的过滤器当前无法正确处理子地址,例如:[email protected]
所以我想将my_recipient
变量设置为 [email protected] 以使过滤器正常工作,即使信封设置为 [email protected]
我已经阅读了子地址文档,我可以看到如何获取user
部分或domain
部分,但不知道如何获取完整地址,包括没有detail
部分的域。我怎么能做到这一点?
我在 StackOverflow 上的成员已经有一段时间了,但这是我在 ServerFault 上的第一篇文章,所以如果我在这篇文章中做错了什么,请随时打电话给我。
TL;DR:使用 Cyrus 和 sendmail。我们有类似firstname.lastname@ourdomain
但sieveInstall -i <user> <compiled_sieve>
只允许使用字母数字的电子邮件。我不知道如何解决这个问题。
我的公司在 AWS EC2 Linux 服务器上使用 Cyrus (v2.3.16-Fedora-RPM-2.3.16-6.9.amzn1) 和 sendmail。
从历史上看,我们使用firstname@ourdomain
电子邮件地址是因为我们很小。然而,我们正在成长并开始firstname.lastname@ourdomain
为所有新员工使用。
要进行服务器端邮件过滤,我们使用筛子。我们获取用户定义的过滤规则列表,从这些规则中创建一个筛选器,使用 编译它sievec
,然后使用 安装它sieveInstall -i <user> <compiled_sieve>
。这一切都由 Perl 脚本自动完成。
我遇到的问题是它sieveInstall
不适用于其中包含非字母数字字符(例如点)的电子邮件,因此新员工无法使用我们的服务器端过滤。这对于我们较旧的 firstname@ourdomain 电子邮件非常有效。
文档sieveInstall
似乎不存在,也没有手册页。
有谁知道我如何做到这一点?
我也简要调查过,sieveshell
但由于某种原因它无法连接到本地主机,可能是因为端口未打开。
我有一个正在寻找邮箱路径的 shell 脚本
result=`find /var/mailboxes -type d -name [email protected]`
perl -pi -e 's/Folder-to-Remove//g' $result/subscriptions
但是通过 Dovecot Sieve 执行它我收到一条错误消息:
lmtp:错误:查找:`/var/mailboxes/63':权限被拒绝
甚至/var/mailboxes/63
不属于[email protected]
Shell 脚本有权被其他人执行。
规则文件中有一个名为 的命令stop
,它会停止处理。我不确定为什么需要这样做。如果它是规则中指令列表中的最后一个命令,那么该规则不是已经完成处理了吗?或者这是否意味着不要跳到列表中的下一条规则?换句话说,假设我的筛子文件有一个规则列表:
Rule A
Rule B
Rule C
Rule D
stop
如果规则 B末尾有命令,规则 C 和 D 会被跳过吗?我假设规则按照它们出现在筛子文件中的顺序执行?