总括:我需要一个实用程序来读取电子邮件并查看“收件人:”和“抄送:”字段,以从已知地址列表中查找电子邮件地址。如果它找到一个,我希望它输出带有额外deliver_to: <address>
信封行的电子邮件。
背景
我的 ISP 将所有公司邮件发送到“域邮箱”/“捕获所有”邮箱,但不会在任何地方记录信封收件人。我们有一个交换服务器从该邮箱接收数据(使用所谓的“POP3 连接器”)并将其分发到用户邮箱。密件抄送的邮件和邮件列表中的邮件将传送到默认邮箱。我正在更换交换,这是唯一剩下的部分。我可以使用 getmail 检索邮件MultidropPOP3Retriever
,但 getmail 期望找到包含收件人电子邮件地址的信封行(例如,delivered_to:[电子邮件受保护])我的 ISP 不提供。所以我必须尽力从To:/CC: 恢复它。
答案1
结果我的答案就在大量的 getmail 文档中。我需要使用 getmail 所调用的内容MultiGuesser
。
然而,就我而言,我的 ISP 在信封标头中添加了这样一行:
for <[email protected]>
由于 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 <[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