Email

什麼實用程序可以根據 To: 和 Cc: 在電子郵件中添加 Deliver_to 行?

  • October 15, 2018

**TLDR:**我需要一個實用程序來讀取電子郵件並查看收件人:和抄送:欄位以從已知地址列表中查找電子郵件地址。如果它找到一個,我希望它輸出帶有額外deliver_to: <address>信封行的電子郵件。

背景

我的 ISP 將所有公司郵件發送到“域郵箱”/“Catch all”郵箱,但不會在任何地方記錄信封收件人。我們有一個交換伺服器從該郵箱接收(使用所謂的“POP3 連接器”)並將它們分發到使用者郵箱。密件抄送的郵件和來自郵寄列表的郵件被遞送到預設郵箱。我正在更換交換,這是剩下的唯一一塊。我可以使用 getmail 檢索郵件,MultidropPOP3Retriever但 getmail 期望找到一個包含我的 ISP 未提供的收件人電子郵件地址(例如,delivered_to: xxx@yyy.com)的信封行。所以我必須盡我所能,從 To:/CC: 中恢復它。

事實證明,我的答案在廣泛的 getmail 文件中。我需要使用 getmail 呼叫的內容MultiGuesser

但是,因為在我的情況下,我的 ISP 在信封標題中添加了這樣的一行:

for <xxx@DOMAIN.com>

並且由於 MultiGuesser 並不完美(例如,如果收件人是密件抄送,它就無法正確猜測)我終於實現了添加delivered_to行的原始想法。我保留了 MultiGuesser,以防我的 ISP 停止添加這條有用的線路。該實用程序是一個使用的 bash 腳本formail(由 dirkt 在他的回答中建議)。它並不快,因為它會為它處理的每封郵件創建臨時文件,但它工作正常。

#!/bin/bash
# Reads email from stdin and prints it to stdout with a twist:
# If it finds a line like " for <xxx@yyyy.zz>" in the envelope
# it will assume it refers to the receipient and will add a "Delivered-To"
# envelope line that will make getmail happy. -- Nick Demou 2018

# bash options for safety in case of errors
set -euf -o pipefail

# read stdin to temp file
cat - > /tmp/deliver.to.$$
logger -p mail.info "getmail, filtering via temp file /tmp/deliver.to.$$"

formail -X "" < /tmp/deliver.to.$$ > /tmp/deliver.to.$$.env
# logger -p mail.info "getmail, extracted envelope/headers to /tmp/deliver.to.$$.env"

ID=`grep 'SMTP id ' /tmp/deliver.to.$$.env 2>/dev/null| head -1|sed -e 's/^ *//'` || ID=UNKNOWN
# logger -p mail.info "getmail, extracted ID $ID"

ADDR=`grep '^ *for <.*@domain\.com>' /tmp/deliver.to.$$.env 2>/dev/null|head -1|sed -e 's/^.*<\([^>]*\)>.*$/\1/'` || ADDR=UNKNOWN
# logger -p mail.info "getmail, extracted delivery address $ADDR"

if echo $ADDR | grep -q '^[^@]*@domain.com *$' ; then
       cat /tmp/deliver.to.$$ | formail -A "Delivered-To: $ADDR"
else
       cat /tmp/deliver.to.$$
fi
logger -p mail.info "getmail filtered mail for $ADDR, $ID"

rm /tmp/deliver.to.$$
rm /tmp/deliver.to.$$.env

我的getmailrc包含一個像這樣的過濾器,它呼叫上面的腳本:

[filter-1]
type = Filter_external
path = /opt/envelope-add-delivered-to.sh

引用自:https://unix.stackexchange.com/questions/474491