Принудительное использование адреса from при пересылке postfix через smtp


28

Я пытаюсь получать отчеты по электронной почте от наших экземпляров AWS EC2. Мы используем Exchange Online (часть Microsoft Online Services). Я настроил учетную запись пользователя специально для SMTP-ретрансляции и настроил Postfix для удовлетворения всех требований для ретрансляции сообщений через этот сервер. Однако SMTP-сервер Exchange Online будет отклонять сообщения, если только адрес отправителя не совпадает с адресом аутентификации (сообщение об ошибке 550 5.7.1 Client does not have permissions to send as this sender).

Благодаря тщательной настройке я могу настроить свои службы для отправки в качестве этого пользователя. Но я не большой поклонник осторожности - я бы предпочел постфикс исправить проблему. Есть ли способ сделать это?

Ответы:


38

Вот как это действительно сделать в postfix.

Этот конфиг изменяет адреса отправителей как из локального исходного, так и ретранслированного почтового SMTP-трафика:

/etc/postfix/main.cf:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

Перепишите адрес конверта из электронного письма, полученного с самого сервера

/ И т.д. / постфикса / sender_canonical_maps:

/.+/    newsender@address.com

Переписать с адреса в ретранслируемой электронной почте SMTP

/ И т.д. / постфикса / header_check:

/From:.*/ REPLACE From: newsender@address.com

Это очень полезно, например, если вы используете SMTP-сервер локальной ретрансляции, который используется всеми вашими многофункциональными устройствами и несколькими приложениями.

Если вы используете SMTP-сервер Office 365, любая почта с адресом отправителя, отличным от электронной почты самого аутентифицированного пользователя, будет просто отклонена. Приведенный выше конфиг предотвращает это.


Благодарность! Это похоже на то, что я искал. К сожалению, мой доступ к Office 365 был две работы назад. Может кто-нибудь подтвердить, работает ли это для них?
Джон Уитлок

1
Я могу. Я использую это с офисом 365.
Джаспер

1
При использовании sender_canonical_mapspostfix не может сохранить отклоненную почту в локальную папку и вместо этого пытается бесконечно отправлять ее через ретранслятор
бассейн

2
@Jasper FYI Мне было проще изменить вышеуказанные конфигурации postconf -e sender_canonical_classes=envelope_sender,header_sender postconf -e sender_canonical_maps=regexp:/etc/postfix/sender_canonical_maps postconf -e smtp_header_checks=regexp:/etc/postfix/header_check
Джейкоб Эванс

была похожая проблема, sender_canonical_classes = envelope_sender спас мой день!
Стефан Рихтер

13

Необязательная универсальная таблица задает сопоставление адресов, которое применяется при доставке (отправке) почты с сервера.

Это противоположно каноническому отображению, которое применяется при получении почты сервером.

(Примечание. Адреса FROM и TO совпадают для замены любой из общих и канонических таблиц.)

Использование канонической таблицы при получении почты сервером уже объяснено, другие ответы.

Вы можете переписать адреса FROM при отправке почты с сервера с помощью smtp_generic_maps.

Согласно постфиксной документации :

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    user@localdomain.local      account@isp.example.com
    @localdomain.local          wholedomain@isp.example.com

Затем сделайте:

sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload

Ссылки:


1
Это работает, но как я могу также изменить имя ОТ?
Джоанна Микалай

Мой опыт работы с родовыми картами является то , что он будет определять как FROM и адресов, использовать канонические карты , чтобы заставить только от адреса как OP попросил
doz87

Можно ли изменить почту отправителя и сопоставить адреса отправителей с помощью регулярных выражений?
WM

@ doz87 и FROM, и TO будут сопоставляться как каноническими, так и общими картами. Я обновил свой ответ, чтобы объяснить разницу между двумя картами.
Джоселин

@WM да, вы можете использовать регулярное выражение. Я никогда не пробовал , но вы, вероятно , придется изменить , hash:чтобы regexp:в main.cf и использования линий , как /foo.*@localdomain.local/ account@example.comв общей карте. Это объясняется на странице руководства
Джоселин

7

Обновление: по совету ИТ-друга я использую postfix на всех своих серверах, а не делаю один облачный почтовый сервер. Вот мое решение до сих пор:

/etc/postfix/main.cf

# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain

# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =   # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic

# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com

# Only listen on the local interfaces (not the public)
inet_interfaces = localhost

# I left out a bunch of CentOS defaults.  postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

/etc/postfix/sasl_passwd

# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com relayer@hosteddomain.com:YourP@ssw0rd

/etc/postfix/generic

# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal relayer@hosteddomain.com
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/etc/aliases

# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon:  postmaster
postmaster:     root

# And the important part - your email or distribution group
root:           awsadmins@hosteddomain.com

/etc/passwd

# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
#  rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash

Вещи, которыми я доволен:

  • Много почты отправляется в root, и одна строка aliasуказывает, кто ее получает.
  • Вся почта от локальных пользователей преобразуется в исходящую relayer@hosteddomain.com, поэтому она поступает через SMTP-сервер MS Online.
  • Postfix имеет намного лучшую документацию, чем sendmail.

Вещи, которые меня не устраивают:

  • Пользовательские изменения требуются для каждого хоста, и несколько шагов. Я написал скрипт bash, чтобы помочь.
  • passwdИмя трюк не всегда работает, и это может быть трудно понять, какой сервер почтовый откуда.
  • Каждое отправленное письмо помещает в журнал три предупреждения:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(SMTP-сервер отправляет пустой AUTHсписок до STARTTLS, но AUTH LOGINпосле).
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (Есть несколько параметров конфигурации вокруг сертификатов, но я не уверен, что доставка почты прерывается при обновлении сертификата)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (Так же, как № 2)

Спасибо сообществу serverfault за то, что поделились сильным мнением о почтовых серверах.


4

Вы можете использовать smtpd_sender_login_maps для указания списка карт: адрес отправителя - пользователь.

Пример:

smtpd_sender_login_maps = 
    hash:/etc/postfix/login-map 

/ И т.д. / постфикс / Логин-карта:

mail1@domain    userlogin
mail2@domain    userlogin, otheruser@example.com

Он работает для отправки, он должен работать для ретрансляции таким же образом.


Является ли целью переписать адрес from во время очереди? У меня сложилось впечатление, что smtpd_sender_login_maps используется для отклонения отправителей (как часть smtpd_sender_restrictions), а не для перевода логинов на адреса электронной почты. Имея это в echo "This is a test" | /usr/sbin/sendmail test@example.comвиду , все еще ставит в очередь (и, в конечном итоге, пересылает) почту, как пришедшуюuser@domU-DE-AD-BE-EF-00-01.compute-1.internal
Джон Уитлок

Боже мой, я как-то понял, что вы авторизуетесь на свой постфикс. В таком случае smtpd_sender_login_maps будет ограничивать то, что пользователь может использовать, какой адрес отправителя.
шёлк

Это может оказаться частью моего конечного решения. Я мог бы отклонить все адреса, кроме одного отправителя на внешнем интерфейсе, и уведомить администратора почты о любых отклонениях внешнего интерфейса, чтобы сообщить мне, когда служба еще не настроена правильно. Я смотрю на smtp_generic_maps, чтобы узнать, смогу ли я использовать их для изменения всех локальных учетных записей на Единый Истинный Адрес От. Но мне нужно перечитать документы постфикса, чтобы понять, как он определяет локальные учетные записи - AWS DNS не соответствует моей интуиции.
Джон Уитлок

0

Я использую каноническое сопоставление, чтобы переписать адрес отправителя, например переписать root @ app01 на no-reply@example.com.


3
Добро пожаловать в сбой сервера! Мы действительно предпочитаем, чтобы ответы содержали контент, а не указатели на контент. Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
user9517 поддерживает GoFundMonica 12.12.12
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.