这是第一次使用 procmail,我有以下配方,
SENDMAIL=/opt/zimbra/postfix/sbin/sendmail
SHELL=/bin/sh
PATH=$HOME/bin:/usr/bin:/bin:.
MAILDIR=/opt/zimbra/procmail/
DEFAULT=$MAILDIR
LOGFILE=.procmaillog
LOCKFILE=.procmaillock
VERBOSE=yes
#Get the recipient's address
TO_=`formail -xTo: \
| expand | sed -e 's/^[ ]*//g' -e 's/[ ]*$//g'`
#Get the recipient's local-part, e.g. fax number
FAXNO_=`echo "${TO_}" | awk -F@ '{ print $1 }'`
LOCALPART=${FAXNO_}
DOMAIN=faxservice.com
# Forward the email
:0
! ${LOCALPART}@${DOMAIN}
该配方获取收件人电子邮件标头,对其进行解析并构建转发电子邮件地址。
问题
该配方的问题是由于 Return-Path 标头被修改,导致电子邮件被收件人拒绝。
已尝试的解决方案
我在菜谱的顶部添加了以下内容,
SENDMAILFLAGS="-oi -f \"$SENDER\""
这会使 Return-Path 标头变为空白,并且收件人仍然会拒绝该电子邮件。
我发现这serverfault 问题并修改了我的配方如下,
# Forward the email :0 * ^Return-Path:[ ]*\/[^ ].+ { env=$MATCH } :0 ! ${env+-f "$env"} ! ${LOCALPART}@${DOMAIN}
procmail 的日志文件显示没有匹配的错误,
procmail: No match on "^Return-Path:[ ]*\/[^ ].+"
问题
我不知道是否要更改后缀管道,
procmail-fax-send unix - n n - - pipe
flags= user=zimbra argv=/usr/bin/procmail /opt/zimbra/procmail/procmailrc
或者如何更改我的配方,以便在 procmail 处理电子邮件后不会修改原始发件人。
答案1
在没有尝试解决问题的 Postfix 部分的情况下,这里尝试修复 Procmail 问题并取消多个外部进程只是为了提取收件人:地址中 @ 符号前的令牌。
# Do you really need to muck with SENDMAIL?
SENDMAIL=/opt/zimbra/postfix/sbin/sendmail
SHELL=/bin/sh
# Don't muck with PATH
#PATH=$HOME/bin:/usr/bin:/bin:.
MAILDIR=/opt/zimbra/procmail/
# Don't muck with DEFAULT
#DEFAULT=$MAILDIR
LOGFILE=.procmaillog
VERBOSE=yes
# Get the local part of the recipient's address
:0 # note: whitespace is [ ^ space tab @ ]
* ^To:.*\<\/[^ <>@]+@
{
:0
* MATCH ?? ()\/[^@]+
{ LOCALPART=$MATCH }
}
DOMAIN=faxservice.com
# Forward the email
:0 # note: whitespace is [ space tab ] and [ ^ space tab ]
* ^Return-Path:[ ]*\/[^ ].+
{ env=$MATCH }
:0
! ${env+-f "$env"} ${LOCALPART}@${DOMAIN}
如果没有Return-Path:
标题,则env
分配应该为空,并且应该使用 Postfix 生成的任何信封发件人转发消息。
(ServerFault 的 Markdown 渲染器将用空格替换制表符,因此您无法完全正确地复制/粘贴它。在空白处包含制表符的要求是一个特殊情况,因此对于快速测试来说,这可能并不重要。)