Это первый раз, когда я использую 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}
Рецепт получает заголовок электронной почты TO, анализирует его и создает адрес электронной почты для пересылки.
ПРОБЛЕМА
Проблема с рецептом заключается в том, что электронное письмо отклоняется получателем из-за изменения заголовка 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:[ ]*\/[^ ].+"
ВОПРОСЫ
Не знаю, нужно ли менять канал postfix,
procmail-fax-send unix - n n - - pipe
flags= user=zimbra argv=/usr/bin/procmail /opt/zimbra/procmail/procmailrc
Или как изменить мой рецепт, чтобы исходный отправитель не изменялся после обработки электронной почты procmail.
Не пытаясь решить часть вопроса, относящуюся к Postfix, вот попытка исправить проблемы Procmail и избавиться от множества внешних процессов, просто чтобы извлечь токен перед знаком @ в адресе To :.
# Do you really need to much 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.