
我想使用*@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
操作。