我想在我的邮件服务器(在 Debian 上运行,带有 Postfix/Dovecot)上收到新邮件时执行备份脚本 (.sh)。我找到了很多关于这个主题的帖子,但没有人给我一个可行的解决方案。这是我测试过的最后一个解决方案:https://stackoverflow.com/questions/27230324/run-script-when-postfix-dovecot-get-new-mail。有人有建议吗?
编辑:当我收到新邮件时,我想运行一个 bash 脚本并让 postfix/dovecot 将这封新邮件放入 ~/Maildir 文件夹中。我正在寻找一种不会阻止标准进程的“中间件”
答案1
如果你的实际问题是如何保留邮件服务器接收(和发送)的每封邮件的备份,答案是设置选项always_bcc
并指定邮箱。
根据您的设置,您可以将该邮箱(或别名)收到的消息转发到脚本以进行进一步处理。
例如/etc/别名:
mailbox: "| /usr/local/bin/script.pl"
根据评论进行编辑:
相当老派,但当你的电子邮件用户是系统用户并有主目录时,.forward
仍然有旧的 sendmail 样式文件由 postfix 支持语法有点晦涩,但~mailuser/.forward
使用以下内容会将消息发送到用户邮件存储区并将其转发到脚本:
\mailbox, "| /usr/local/bin/script.pl"
答案2
也许你需要后缀筛选器?
您可以使用 smtpd_milters 参数指定仅支持 SMTP 的 Milter 应用程序(可以有多个)。每个 Milter 应用程序都由其侦听套接字的名称标识;其他 Milter 配置选项将在后面的部分中讨论。Milter 应用程序按指定的顺序应用,第一个拒绝命令的 Milter 应用程序将覆盖其他 Milter 应用程序的响应。
/etc/postfix/main.cf:
# Milters for mail that arrives via the smtpd(8) server.
# See below for socket address syntax.
smtpd_milters = inet:localhost:portnumber ...other filters...
监听套接字的一般语法如下:
unix:pathname
Connect to the local UNIX-domain server that is bound to the specified pathname. If the smtpd(8) or cleanup(8) process runs chrooted, an absolute pathname is interpreted relative to the Postfix queue directory.
inet:host:port
Connect to the specified TCP port on the specified local or remote host. The host and port can be specified in numeric or symbolic form.
NOTE: Postfix syntax differs from Milter syntax which has the form inet:port@host.
使用unix:pathname