我运行一个 Postfix/Dovecot 邮件服务器供个人使用。只有少数实际的邮箱,基本上只有[email protected]
和[email protected]
。
我经常使用该virtual
文件创建转发到的虚拟邮箱[email protected]
。我有很多一次性帐户,例如从在线商店一次性购买、我想尝试的在线游戏而不用担心持续的垃圾邮件等。为此,我通过 SSH 并运行以下命令:
sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected] [email protected]
sudo postmap virtual
sudo service postfix restart
我这样做的频率足够高,我希望在某种程度上自动化这个过程。我考虑简单地编写一个 shell 脚本,将虚拟邮箱和真实邮箱作为参数并自行进行更改,但我希望有更多的东西。
我希望能够将电子邮件从[email protected]
服务器上的其他邮箱发送到邮件正文,并将虚拟邮箱名称作为邮件正文。问题在于呼叫,sudo
但我可以创建一个新用户,该用户的唯一职责是处理此问题,而该用户应该处理该问题。
主要的问题是:我如何创建一个由电子邮件触发的事件?有没有某处的服务可以做到这一点?我可以配置 Postfix 或 Dovecot 来侦听该电子邮件并针对该事件运行命令吗?
答案1
收到邮件消息后执行脚本(我使用 shell 脚本)的正确过程如下。它涉及修改后缀的配置文件,主配置文件(在我的 Debian 中,它位于/etc/后缀)通过添加以下行:
my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}
这指示后缀当某些事件发生时运行脚本(您需要使其可执行)。
要指定何时执行脚本,请执行以下操作:假设您希望它在以下时间执行[电子邮件受保护]收到一条消息。放置以下行
[email protected] FILTER my_shell_script:dummy
文件里面/etc/postfix/地址.txt;您将需要创建一个适当的数据库后缀使用此文件,您可以通过以下方式完成
postmap /etc/postfix/address.txt
它生成一个名为的文件作为输出/etc/postfix/address.db。现在回到/etc/postfix/main.cf文件并添加以下行:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination
现在重新启动后缀,
postfix reload
你应该可以走了。
答案2
我可以看到两个明显的解决方案。
如果您正在使用procmail 作为 MDA在您的服务器上,或者愿意转换为使用它,那么您可以通过 procmail 的|
(管道)配方操作在任何任意电子邮件上运行任何任意脚本。希望它不会以 root 身份启动,但应该很容易制作一个执行所需魔法的脚本,并且相关用户可以以 root 身份无密码调用该脚本。脚本的输出甚至可以反馈到相同电子邮件以及稍后通过将配方设为过滤器操作来发送的电子邮件。
另一种选择(需要较少的手动维护)是创建单个邮箱并配置 Postfix$recipient_delimiter
成为通常不用于该目的的东西;例如,.
或-
。请注意,recipient_delimeter 是服务器范围的设置。假设您设置了邮箱[email protected]
并设置了$recipient_delimeter = .
.这将允许dummy.<anything>@example.com
将其发送到对应于 的本地邮箱[email protected]
。要禁用其中一项,请dummy.<whatever>@example.com
使用拒绝操作添加到适当的收件人表。缺点是它将成为前缀的包罗万象的邮箱,因此您希望使前缀难以因意外或字典攻击而偶然发现。好处是,在正常情况下(发件人尊重您的意愿,不会转售您的电子邮件地址),这种方法需要零维护,并且您可以随时更改您的前缀,并明确列出您希望继续接收邮件的那些组合。
答案3
万一如果关联下来了,总结如下。
master.cf
首先,通过添加以下行来注册您的脚本“myhook”:
myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}
另外,编辑 smtp 行以告诉 Postfix 对通过 SMTP 传递到达的任何邮件运行过滤器:
smtp inet n - - - - smtpd -o content_filter=myhook:dummy
请注意,如果您使用“sendmail”命令发送邮件,则不会触发过滤器。在这种情况下,请在“取货”送货方式后添加选项:
pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy
重新启动后缀:postfix reload
使您的脚本可供任何人读取和执行:chmod +rx script.sh
请注意,任何到达的邮件都会触发脚本。要指定确切的地址,请参阅@MariusMatutiae 答案。
答案4
我发现配置 Dovecot 是一个更优雅的解决方案(相对于配置 Postfix)。步骤如下:
在目录中创建脚本(即
mail_processor.py
)/usr/lib/dovecot/sieve-execute/
:#!/usr/bin/python3 from sys import stdin with open('/var/log/mail_processor.log', 'a') as logfile: for line in stdin: print(line.rstrip(), file=logfile)
确保您的脚本和目标文件具有正确的权限:
$ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py $ chmod 0777 /var/log/mail_processor.log
启用
sieve_extprograms
插件:使用以下内容修改 的
\etc\dovecot\conf.d\90-sieve.conf
插件部分:sieve_extensions = +vnd.dovecot.execute sieve_plugins = sieve_extprograms sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
重新加载鸽舍:
$ service dovecot restart
创建筛过滤器(即在 Roundcube 中 goto
settings
->filters
->actions
->edit filter set
):require ["vnd.dovecot.execute"]; # rule:[mail processing] if true { execute :pipe "mail_processor.py"; }
现在,使用筛式过滤器传递到此邮箱的所有邮件都将通过管道进行mail_processor.py
操作。