procmail 转发电子邮件的配方被收件人拒绝

procmail 转发电子邮件的配方被收件人拒绝

这是第一次使用 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 标头被修改,导致电子邮件被收件人拒绝。

已尝试的解决方案

  1. 我在菜谱的顶部添加了以下内容,

    SENDMAILFLAGS="-oi -f \"$SENDER\""

    这会使 Return-Path 标头变为空白,并且收件人仍然会拒绝该电子邮件。

  2. 我发现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 渲染器将用空格替换制表符,因此您无法完全正确地复制/粘贴它。在空白处包含制表符的要求是一个特殊情况,因此对于快速测试来说,这可能并不重要。)

相关内容