将所有传入电子邮件重定向到 Python 脚本

将所有传入电子邮件重定向到 Python 脚本

我想使用*@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 postfixapt-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 时扫描...

后缀

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

天啊,这看起来又长又复杂。

发送邮件

在此处设置一个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 后,它是一个可靠的工具,并且对于自定义邮件处理非常灵活。

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

答案3

我喜欢使用 Postfix 和 Dovecot 的邮箱堆栈。安装这些软件后,您可以执行以下操作,在收到发送到特定地址的邮件时执行脚本:

  1. 在目录中创建脚本(即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
      
  2. 启用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
      
  3. 创建筛过滤器(即在 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操作。

Pigeonhole Sieve:Extprograms 插件以供参考

相关内容