我一直在 NodeJS 上使用 Postfix 建立一個佇列前過濾器,以檢索外發郵件中的資料、刪除附件、將它們上傳到 CDN 並將 URL 注入外發郵件中。
到目前為止,我想沒有什麼太複雜的,因為 Postfix 支援通過隊列前內容過濾器。
實施過濾器並遵循 Postfix 文件後,我能夠檢索外發郵件並將其發送回 Postfix。
但是,Postfix 不會將透過「代理」特定配置的傳入郵件識別為透過佇列前內容過濾器注入回來。它仍然會將其新增至佇列並正確傳送,但不會關閉 SMTP 用戶端首先開啟的會話。
我已經研究這個錯誤幾個星期了,並瀏覽了整個網路尋找答案,但這個主題似乎沒有太多記錄。我看到 Milters 可能是該問題的另一種解決方案,但它似乎比僅使用 SMTP 與 Postfix 通訊更複雜。
以下是設定檔:
master.cf:
submission inet n - - - smtpd
-o syslog_name=postfix/submissions
-o smtpd_proxy_filter=127.0.0.1:9830
-o smtpd_proxy_ehlo=mail.clebard.cloud
-o smtpd_proxy_options=speed_adjust
-o smtpd_tls_auth_only=no
-o smtpd_tls_dh1024_param_file=${config_directory}/dh2048.pem
-o smtpd_enforce_tls=no
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
127.0.0.1:9821 inet n - - - smtpd -v
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
-o syslog_name=postfix/afterfilter
-o smtpd_enforce_tls=no
-o smtpd_tls_auth_only=no
-o smtpd_tls_dh1024_param_file=${config_directory}/dh2048.pem
-o smtpd_enforce_tls=no
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
(此配置在生產中使用是不安全的,但我嘗試盡可能消除複雜性)
127.0.0.1:9830
127.0.0.1:9821
是佇列前內容過濾器伺服器,我將 Postfix 設定為使用檔案的第二個設定偵聽回傳郵件。
以下是我使用過濾器發回 Postfix 的內容:
EHLO localhost
AUTH PLAIN {token}
XFORWARD HELO={client_name} NAME={client_name} ADDR={client_addr} PROTO=SMTP
XFORWARD IDENT={message_id}
MAIL FROM: {sender}
RCPT TO: {recipient}
DATA
...
.
QUIT
這是過濾器日誌上的追蹤: 使用過濾器傳送郵件時記錄
這是我在 Postfix 上看到的: proxy-reject :佇列檔案寫入錯誤
當過濾器發送命令時,Postfix 已偵測到所有命令,但data=0/1
原始入站郵件的回應表示尚未收到 DATA。事實上,當submission
進程嘗試將代理內容新增到佇列時,似乎會發生錯誤。
我希望我能清楚地解釋一切,因為我真的需要一些幫助...