我想使用*@example.com
在我的服务器上运行的 Python 脚本来管理所有传入的电子邮件,该脚本将执行各种工作。
我已经为 完成了 DNS MX 记录
example.com
,将其定向到我的服务器:mx.example.com MX mailforwarder.example.com mailforwarder.example.com A 1.2.3.4
我已经对 postfix 和 exim 进行了很多试验和错误,但没有任何效果,所以我删除了所有它们:
apt-get remove postfix
和apt-get remove exim4
,所以我准备开始全新安装其中一个(哪个将允许此特定任务的最短解决方案?)
*@example.com
将所有传入电子邮件定向到 Python 脚本的主要步骤是什么 ?(包括:告诉 MTA 接受来自服务器外部、整个互联网等的电子邮件)
答案1
procmail
被认为是有问题的作者:Philip Guenther(在这种情况下很可能没有用,因为.forward
文件或等效文件可以将邮件直接发送到您的程序,从而跳过不必要的复杂性procmail
)。
执行摘要:删除procmail端口;该代码不安全,不应用作任何进一步工作的基础。
人们可能知道,早在 1990 年代末到 2001 年,我就是 procmail 的上游维护者。
所以其他一些解决方案可能是可取的;这取决于邮件传输代理 (MTA)。另一种选择是使用 MTA 传送到本地文件或 IMAP,然后让您的程序解析该文件或 IMAP。这样做的好处是可以继续接受电子邮件并将其保存在某个地方;当您的程序有错误或无法运行时会发生什么?比实时邮件投递时的问题要少......
进出口银行
可能要么复制 Sendmail.forward
方法,要么找出如何在 Eximese 中正确执行此操作。 (我中止了,因为需要花很多时间来挖掘 Exim 文档。)elspy
如果您想以 MILTER 方式进行 SMTP 时扫描...
后缀
天啊,这看起来又长又复杂。
发送邮件
在此处设置一个mailertable
条目,将域(以及.domain
子域,如果需要)的所有邮件转发给本地用户jdoe
example.com local:jdoe
.example.com local:jdoe
然后.forward
为该用户设置一个文件来运行必要的代码
$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$
这可能很简单
$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$
因为电子邮件是通过标准输入输入的(如果process
同时运行多个实例,这可能会很糟糕;大概您的实际代码可以处理此类竞争条件,或者是幂等的......对吗?)。此方法也适用于复制 Sendmail 转发语法的任何其他 MTA,假设您可以让 MTA 将所有邮件重定向到特定用户。
这假设mailertable
支持已启用,confFORWARD_PATH
已设置,允许 Sendmail 运行代码(smrsh(8)
但请注意,某些供应商可能会更改目录而不更新文档(运行strings /the/path/to/smrsh | fgrep /
可能会有所帮助)),并且像 selinux 这样的东西也不会破坏东西。
Sendmail 的另一个选项是使用 MILTER,例如MIME德芳并在那里执行任何必要的业务逻辑。 (其他各种 MTA 支持 MILTER,或者有类似的东西。)
简单邮件传输协议守护进程 (OpenBSD)
从一看smtpd.conf(5)
(针对 OpenBSD 6.4 更改进行了更新)
action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"
答案2
这似乎是一个很常见的问题......我发现这已经得到了回答,这就是我的建议。 Procmail 是一个本地递送代理..我认为意味着某些东西已经从网络接收到邮件并将其交给 procmail 进行本地传递或其他过滤。在这种情况下,postfix 就是那个东西。在生产中运行 postfix 后,它是一个可靠的工具,并且对于自定义邮件处理非常灵活。
答案3
我喜欢使用 Postfix 和 Dovecot 的邮箱堆栈。安装这些软件后,您可以执行以下操作,在收到发送到特定地址的邮件时执行脚本:
在目录中创建脚本(即
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
操作。