收到电子邮件后运行脚本


8

我运行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

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

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

大多数情况是这样的:我将如何创建一个由电子邮件触发的事件?某处有服务吗?我可以配置Postfix或Dovecot侦听该电子邮件并在该事件上运行命令吗?


您是否检查了此链接
kirill-a

@kirill-不,我没有。看来可以解决这个问题,现在我终于有了一个学习PHP的充分理由
Adam Smith

您不需要学习PHP:只需将您自己的shell脚本替换为PHP脚本,就可以完成。
MariusMatutiae 2015年

@MariusMatutiae,如果您或kirill-a想写一个有关该主题的答案,那么(假设它可行)我会很高兴地授予赏金
Adam Smith

@ kirill-在上面感谢我的评论。
亚当·史密斯

Answers:


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}

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

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

 username@domain.com FILTER my_shell_script:dummy

在文件/etc/postfix/address.txt中;您需要为postfix创建一个正确的数据库以使用此文件,您可以通过以下方式完成此操作

  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

  postfix reload

而且你应该很好走。


2
您不是在这里说'check_recipient_access hash:/ etc / postfix / address'吗?根据您的指示,您使用“访问”来表示“地址”。
Lee Fuller

3
如果您为各种虚拟域运行virtual_mailboxes,是否一样?我已完全按照这些说明进行操作-如果我未声明virtual_alias,我将被退回。如果我这样做,它将邮件传递到邮箱,但不会触发脚本。
Lee Fuller

我没有得到这个工作。这个答案有效:serverfault.com/questions/322657/…–
jlh

据我了解,该解决方案还存在一个问题,即它只会触发通过SMTP接收的邮件。 sendmail直接在服务器上不会触发此操作。
菲利普·库林

@PhilipCouling看到这个答案:unix.stackexchange.com/a/179407。您可以使用该pickup选项。
斯蒂芬,

4

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

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

一种替代方法(应该需要较少的动手维护)是创建单个邮箱并将Postfix配置$recipient_delimiter为通常不用于此目的的邮箱。例如.-。请注意,receiver_delimeter是服务器范围的设置。假设您设置了邮箱dummy@example.com并设置了$recipient_delimeter = .。然后dummy.<anything>@example.com,这将允许将其传递到与相对应的本地邮箱dummy@example.com。要禁用其中之一,请添加dummy.<whatever>@example.com到具有拒绝操作的适当收件人表。缺点是它将成为前缀的通用邮箱,因此您希望使该前缀很难因意外或字典攻击而偶然发现。好处是,在正常情况下(发件人尊重您的意愿,并且不转售您的电子邮件地址),此方法需要零维护,并且您始终可以稍后更改前缀,并明确列出要保留用于接收邮件的那些组合。


除了我目前所拥有的以外,我没有任何其他原因与Postfix绑定。但是,我希望找到一种可以与我当前的MDA / MTA一起使用的解决方案。至于定界符:我几乎不相信发件人会尊重我的意愿,而不转售我的电子邮件地址,否则我将给他们永久地址:)
亚当·斯密

@AdamSmith不同的是,有像我的第二个选择,你可以禁用你给一个特定的实体不会引起问题在其他地方的地址,这些地址看起来明智甚至哑自动核查员。至于保留MDA / MTA,procmail可以用作Postfix MDA的替代品。无需将Postfix替换为您的MTA。
CVn 2015年

不再对procmail进行维护:请参见lwn.net/Articles/416901,其标题为:procmail的死亡报告并没有被夸大。最好安全地使用它,并遵循@ kirill-a的建议。
MariusMatutiae

procmail仍被大量使用,并且(IMHO)仍然是临时过滤的最佳解决方案。@MariusMatutiae关于有效死亡的说明仅适用于其发展。我无法想到我曾经遇到的任何procmail错误,而且我做了一些荒谬的事情,例如在其中实现了完整的邮件列表。也许它还没有得到进一步的发展,因为采取它的唯一方向将超出其范围(例如,反垃圾邮件,SpamAssassin更好的服务或milter-greylist服务)。
亚当·卡兹

你对我说这是因为...
MariusMatutiae

2

如果链接断开,这里是摘要。

首先,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答案。


那让我“未知的邮件传输错误” ...
user1133275'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.