Я пытаюсь настроить Postfix (на RHEL 6.5) для изменения содержимого входящих сообщений и пересылки писем на удаленный сервер. Я использовал Perl-скрипт, подключенный к Postfix, чтобы изменить содержимое, и электронные письма возвращаются в Postfix с помощью Sendmail.
Когда электронное письмо впервые приходит на сервер, я вижу from
поле инициализируется правильно, но затем перезаписывается:
postfix/smtpd[29150]: connect from ** local domain **[x.x.x.x]
postfix/smtpd[29150]: 2CF665F6B9: client=** local domain **[x.x.x.x]
postfix/cleanup[29155]: 2CF665F6B9: message-id=<msg_172345>
postfix/qmgr[29120]: 2CF665F6B9: from=<original_sender@external.domain>, size=66895, nrcpt=1 (queue active)
postfix/pickup[29119]: 472C75F6BC: uid=600 from=<admin>
postfix/cleanup[29155]: 472C75F6BC: message-id=<msg_172345>
postfix/pipe[29159]: 2CF665F6B9: to=<correct_recipient@external.domain>, relay=myhook, delay=3.1, delays=3/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via myhook service)
postfix/qmgr[29120]: 2CF665F6B9: removed
postfix/qmgr[29120]: 472C75F6BC: from=<admin@** local domain **>, size=67025, nrcpt=1 (queue active)
Как видите, from
поле меняется с original_sender@external.domain
к admin@** local domain **
Я предполагаю что admin
исходит из трубы user=admin
в main.cf, а локальный домен взят из /etc/hosts
.
Что мне здесь нужно, так это сохранить первоначального отправителя электронного письма, но, похоже, я не могу этого добиться. Не могли бы вы указать мне правильное направление?
Огромное спасибо.
РЕДАКТИРОВАТЬ:
Это моя конфигурация Postfix:
postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
header_checks = regexp:/etc/postfix/header_checks
html_directory = no
inet_interfaces = $myhostname, localhost
inet_protocols = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
myhostname = ** local domain **
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
sample_directory = /usr/share/doc/postfix-2.6.6/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_connection_cache_on_demand = yes
smtpd_helo_required = no
transport_maps = hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 550
Похоже, мой Postfix не принимает -M
флаг.
Это master.cf:
# cat /etc/postfix/master.cf | grep -v "#"
smtp inet n - n - - smtpd
-o content_filter=myhook:
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
-o smtp_fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
myhook unix - n n - - pipe
flags=Rq user=admin argv=/var/tmp/filter.pl ${sender} ${recipient}
На основе вывода master.cf
выше, мы знаем, что postfix будет передавать исходному отправителю по первому аргументу вашего скрипта. Таким образом, ваш сценарий должен будет проанализировать аргументы, сохранить их в переменной и использовать для предоставления адреса отправителя, когда электронное письмо повторно отправляется в postfix с помощью команды sendmail.
Команда sendmail принимает параметр отправителя через параметр -f. Итак, ваш сценарий должен вызывать sendmail -f $origsender ...other parameter
Ссылки: http://www.postfix.org/FILTER_README.html#simple_filter