收到电子邮件时运行脚本

Ada*_*ith 10 email postfix dovecot

我运行 Postfix/Dovecot 邮件服务器供个人使用。只有少数实际邮箱,基本上只有postmaster@domain.comusername@domain.com

我经常使用该virtual文件来创建转发到username@domain.com. 我有很多这样的一次性账户,比如从在线商店一次性购买,我想尝试在线游戏而不用担心持续的垃圾邮件等。为此,我通过 SSH 运行以下命令:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # username_servicename@domain.com      username@domain.com
sudo postmap virtual
sudo service postfix restart
Run Code Online (Sandbox Code Playgroud)

我以足够的频率执行此操作,因此我希望在某种程度上使该过程自动化。我考虑过简单地编写一个 shell 脚本,将虚拟邮箱和真实邮箱作为参数并自己进行更改,但我希望能有更多的东西可以放手。

我希望能够username@domain.com使用虚拟邮箱名称作为邮件正文向服务器上的某个其他邮箱发送电子邮件。问题是sudo调用,但我可以创建一个新用户,其唯一的责任是处理这个应该处理那个。

主要的问题是:我将如何创建由电子邮件触发的事件?是否有服务可以做到这一点?我可以配置 Postfix 或 Dovecot 来侦听该电子邮件并在该事件上运行命令吗?

Mar*_*iae 8

收到邮件消息后执行脚本(我使用 shell 脚本)的正确过程如下。它涉及通过添加以下行来修改postfix的配置文件master.cf(在我的 Debian 中,它位于/etc/postfix 中):

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}
Run Code Online (Sandbox Code Playgroud)

它指示postfix在发生某些事件时运行脚本(您需要使其可执行)。

要指定何时执行脚本,请执行以下操作:假设您希望在username@domain.com收到消息时执行脚本。放置以下行

 username@domain.com FILTER my_shell_script:dummy
Run Code Online (Sandbox Code Playgroud)

在文件/etc/postfix/address.txt 中;你需要为postfix创建一个合适的数据库来使用这个文件,你可以通过

  postmap /etc/postfix/address.txt
Run Code Online (Sandbox Code Playgroud)

它产生一个名为/etc/postfix/address.db的文件作为输出。现在回到/etc/postfix/main.cf文件并添加以下行:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination
Run Code Online (Sandbox Code Playgroud)

现在重启postfix

  postfix reload
Run Code Online (Sandbox Code Playgroud)

你应该很高兴去。

  • 如果您为各种虚拟域运行 virtual_mailboxes,这是否相同?我一字不差地遵循了这些说明 - 如果我不声明 virtual_alias 我会反弹。如果我这样做,它会将消息传递到邮箱,但不会触发脚本。 (3认同)
  • 你不是说'check_recipient_access hash:/etc/postfix/address'吗?根据您的指示,您在我认为您的意思是“地址”的地方使用了“访问”。 (2认同)

use*_*ser 4

我可以看到两个明显的解决方案。

如果您使用procmail 作为服务器上的 MDA,或者愿意转换为使用它,那么您可以通过 procmail 的|(管道)配方操作在任意电子邮件上运行任意脚本。希望它不会以 root 身份启动,但应该很容易制作一个执行所需魔法的脚本,并且相关用户可以以 root 身份无密码调用该脚本。脚本的输出甚至可以反馈到一封电子邮件中,然后通过将配方设置为过滤器操作来发送电子邮件。

另一种方法(需要较少的实际维护)是创建一个邮箱并将 Postfix 配置$recipient_delimiter为通常不用于此目的的邮箱;例如,.-。请注意,recipient_delimeter 是服务器范围的设置。假设您设置了邮箱dummy@example.com并设置了$recipient_delimeter = .. 这将允许dummy.<anything>@example.com将其发送到对应于 的本地邮箱dummy@example.com。要禁用其中一项,请dummy.<whatever>@example.com使用拒绝操作添加到适当的收件人表。缺点是它将成为前缀的包罗万象的邮箱,因此您希望使前缀难以因意外或字典攻击而偶然发现。好处是,在正常情况下(发件人尊重您的意愿并且不会转售您的电子邮件地址),此方法需要零维护,并且您可以随时更改您的前缀并明确列出您希望继续接收邮件的那些组合。