要約:電子メールを読み、「受信者:」フィールドと「参照:」フィールドを確認して、既知のアドレス一覧から電子メールアドレスを見つけるユーティリティが必要です。 1つを見つけたら、deliver_to: <address>
追加の封筒行を含む電子メールを出力したいと思います。
背景
私のISPは、すべての会社のメールを「ドメインメールボックス」/「すべてキャプチャ」メールボックスに送信しますが、封筒の受信者をどこにも記録しません。我々は、このメールボックスからデータを受信し(いわゆる「POP3コネクタ」を使用して)、それをユーザーのメールボックスに配布する交換サーバーを持っています。隠し参照メッセージとメーリングリストのメッセージは、メインメールボックスに転送されます。スワップを交換するのにこの部分だけが残りましたね。 getmailを使用してメッセージを取得できますが、MultidropPOP3Retriever
getmailは受信者のEメールアドレスを含む封筒行を見つけることを期待しています(例:Deliver_to:[Eメール保護])私のISPはそれを提供していません。だからTo:/CC:から回復するために最善を尽くす必要があります。
答え1
私の答えは広範囲のgetmailドキュメントにあることがわかりました。 getmailが呼び出すものを使用する必要がありますMultiGuesser
。
しかし、私の場合、ISPは封筒ヘッダに次の行を追加しました。
for <[email protected]>
MultiGuesserは完璧ではないため(たとえば、受信者がBCCであるかどうかを正確に推測することはできません)、最終的に行を追加する元のdelivered_to
アイデアを実装しました。私のISPがこの便利な行の追加を中断した場合に備えて、MultiGuesserを維持します。このユーティリティはformail
(dirktが答えで提案した)bashスクリプトです。処理するすべてのメッセージに対して一時ファイルを生成するため、高速ではありませんが、うまく機能します。
#!/bin/bash
# Reads email from stdin and prints it to stdout with a twist:
# If it finds a line like " for <[email protected]>" 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