当邮件处理不再耗电:OpenSMTPD与Maildrop的完美协作
在OpenBSD系统中,处理邮件过滤的方式多种多样,但有时候,针对特定需求,使用专门的工具会更加得心应手。过去,procmail曾是这一领域的霸主,但自2001年9月10日最后一次更新后,我们更倾向于选择那些仍在积极维护的工具。
Maildrop:邮件过滤的新选择
Courier邮件服务器提供了众多工具,即便你已经有了依赖的邮件传输代理(MTA),你仍然可以轻松使用其中的一些高级功能。我们选择了maildrop(1),它在OpenBSD上安装后,提供了丰富的过滤选项、邮件投递代理(MDA)以及一些MIME构建程序等。安装命令如下:
# pkg_add maildrop # 注意:选择非postfix的包即可
我们倾向于在“投递”模式下使用maildrop(5),即MDA监听一个套接字,你可以像其他服务一样启动、停止或重启它。你也可以在手动模式下尝试maildrop(5),或者选择第三种模式:嵌入式模式。
我们非常喜欢这个项目的明确性、文档的精细程度以及邮件列表中多年积累的实用解决方案。然而,关于如何快速上手的简明指南却不多见,这似乎成了现代技术文档的常态。此外,AI聊天机器人在此方面也显得力不从心,常常给出不准确的建议。
轻量级配置
由于maildrop(5)对配置要求非常严格,以下配置不仅是建议,更是规则(大部分情况下)。如果某些权限设置不当,maildrop(5)将无法运行。这是出于安全考虑,我们对此表示理解和支持。
在“投递”模式下,普通用户需要在其主目录下创建一个权限为‘0600’的‘~/.mailfilter’文件。文件名不可更改,至少默认情况下如此。此外,该文件必须由该用户拥有。
这是邮件的“过滤器”,它可以非常复杂,从简单的“自动回复”到邮件内容的深度处理,比如我们在Whenhen.com所做的那样。maildropfilter(7)是一种图灵完备的语言,因此你可以放心,它能够满足你的所有需求。
以下是一个简单的‘.mailfilter’配置示例,它根据发件人邮箱地址将邮件归档到主目录下名为‘.vip’的Maildir目录中:
if (/^From:.*vip@foo.com/)
{
to .vip
}
如果‘.vip’不是一个真正的Maildrop目录,maildrop(5)会发出警告。因此,请按照以下方式设置:
cd ~
mkdir -p .vip/{cur,new,tmp}
同时,你也可以在主目录下创建一个名为‘.maildir’的常规Maildir目录,用于存放其他邮件:
mkdir -p .maildir/{cur,new,tmp}
当maildir(5)在“投递”模式下运行时,调试选项需要通过系统配置文件‘/etc/courier/authdaemonrc’来设置。虽然其他模式下可以使用‘-V K’标志,但在“投递”模式下无效。因此,必须通过‘rc’文件进行配置。该文件同样需要设置为‘0600’权限,并由‘root:wheel’拥有。
你可以通过这个‘rc’文件让调试信息尽可能详细,或者像我们一样,在“手动”模式下测试,直到一切运行顺畅。在“投递”模式下开启调试后,你可以通过tail -f /var/log/messages来跟踪日志信息。
准备守护进程
maildrop(5)的守护进程名为‘authdaemond’,位于‘/usr/local/sbin’目录下。是的,它被称为“守护进程的守护进程”。这是第一次见到这样的命名!
它以root身份运行,并将‘pid’文件写入‘/var/run/courier-auth’目录。因此,最好在忘记之前创建这个目录,以免maildrop(5)报错:
# mkdir /var/run/courier-auth
你可以在‘/etc/courier/authdaemonrc’文件中调整这一设置,但默认配置并无不妥。
最后,一个简单的启动守护进程的方法是在root的crontab(1)中添加一行,如下所示:
@reboot /bin/sh /usr/local/sbin/authdaemond start
...
更多有趣的信息可以从安装‘README’中获取,点击这里。
SMTPD配置
幸运的是,OpenBSD团队使得与自定义MDA的协作变得轻松。以下是一个示例配置:
...
action "vip" mda "/usr/local/bin/maildrop -d %{dest.user:lowercase}"
match from any mail-from "vip@foo.com" for any action "vip"
...
这条规则表示来自特定发件人的邮件将由maildrop(5)处理。虽然这有点冗余,即在过滤器之前再加一个过滤器,但你可以自行决定哪些邮件发送到‘.maildir’,哪些发送到maildrop(5)等。
以下是一个完整的配置示例,它将本地邮件发送到‘/var/mail/user’,所有互联网邮件发送到‘/.maildir’,而‘vip’邮件则发送到‘/.vip’:
pki mail_cert cert "/etc/ssl/mail.bar.com.fullchain.pem"
pki mail_cert key "/etc/ssl/private/mail.bar.com.key"
# 注意:newaliases(8)
table aliases db:/etc/mail/aliases.db
# 注意:过滤器
filter "dkimsign_rsa" proc-exec "filter-dkimsign -d bar.com -s selector1 \
-k /etc/mail/dkim/private.rsa.key" user _dkimsign group _dkimsign
# 注意:本地入站
listen on lo0 filter "dkimsign_rsa"
# 注意:互联网入站
listen on socket filter "dkimsign_rsa"
# 注意:处理出站互联网邮件
# 无需认证,因为我们不提供SMTP服务
listen on egress tls pki mail_cert
action "local_mail_with_aliases" mbox alias
# 注意:处理vip邮件
action "vip_internet_mail_without_aliases" mda \
"/usr/local/bin/maildrop -d %{dest.user:lowercase}"
action "internet_mail_without_aliases" maildir \
"/home/%{dest.user:lowercase}/.maildir"
action "outbound" relay
# 注意:处理互联网邮件(针对vip和域名)
match from any mail-from "vip@foo.com" for any action \
"vip_internet_mail_without_aliases"
# 注意:处理互联网邮件(针对域名)
match from any for domain "bar.com" action "internet_mail_without_aliases"
# 注意:处理本地邮件
match from local for local action "local_mail_with_aliases"
match from local for any action "outbound"
通过参考众多“在OpenBSD中设置邮件服务器”的示例,你可以理解这些配置。这个‘smtpd.conf’文件非常典型。
测试maildrop(5)
如果一切配置得当,我们可以启动maildrop(5)服务,检查并重启smtpd(8),然后进行一些测试。
# sh /usr/local/sbin/authdaemond start
# smtpd -n
# rcctl restart smtpd
