Для того, чтобы быть в курсе всего, что происходит на сервере, помимо мониторинга, полезно следить за стандартными письмами, которые шлют различные сервисы. Я расскажу, как настроить на сервере отправку писем через стандартный postfix с авторизацией на стороннем smtp сервере. Так же эта настройка будет полезна для отправки почты через консоль linux с авторизацией по smtp.
По-умолчанию, в минимальной установке дистрибутива CentOS 7 уже идет в комплекте почтовый сервер postfix. Его я и буду использовать. Стандартные настройки сервера не дают нормальных возможностей для отправки почты. Сделаем некоторые дополнительные действия.
Для начала, чтобы иметь возможность оперативно проверять отправку почты через консоль, установим программу mailx. Без нее при попытке отправить письмо в консоли, будете получать ошибку:
# mail bash: mail: command not found
Для того, чтобы это исправить, устанавливаем mailx.
# yum install mailx
После этого можно отправлять со своего сервера сообщения во внешний мир, например вот так.
# df -h | mail -s "Disk usage" admin@mymail.ru
На почту улетит вывод команды df.
Но при стандартных настройках ваше письмо либо попадет в спам, либо вообще не будет принято сервером получателя, потому что на вашем сервере нет корректных настроек для отправки почты (dns записи, spf, dkim и т.д.). Чтобы почта нормально отправлялась, надо воспользоваться каким-то внешним почтовым сервером. Настроим postfix на отправку локальных писем через внешний сервер с авторизацией по smtp.
Я взял дефолтный конфиг postfix, очистил его от комментариев и пробелов, добавил в конец свои настройки.
# cat /etc/postfix/main.cf
## DEFAULT CONFIG BEGIN ###################### queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix inet_interfaces = localhost inet_protocols = all unknown_local_recipient_reject_code = 550 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.10.1/samples readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES ## DEFAULT CONFIG END ###################### # Имя сервера, которое выводит команда hostname myhostname = centos7-test.xs.local # Здесь по логике нужно оставлять только домен, но в данном случае лучше оставить полное имя сервера, чтобы в поле отправитель # фигурировало полное имя сервера, так удобнее разбирать служебные сообщения mydomain = centos7-test.xs.local mydestination = $myhostname myorigin = $mydomain # Адрес сервера, через который будем отправлять почту relayhost = mailsrv.mymail.ru:25 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = may
Создаем файл с информацией об имени пользователя и пароле для авторизации.
# mcedit /etc/postfix/sasl_passwd
mailsrv.mymail.ru:25 admin@mymail.ru:password
Создаем db файл.
# postmap /etc/postfix/sasl_passwd
Теперь можно перезапустить postfix и проверить работу.
# systemctl restart postfix
Отправляем тестовое письмо через консоль. Проверяем почтовый лог.
# tail -n 10 /var/log/maillog
Если у вас там будет похожая ошибка:
postfix/smtp[5420]: warning: SASL authentication failure: No worthy mechs found postfix/smtp[5420]: 24762774C6: to=<admin@mymail.ru>, relay=mailsrv.mymail.ru[10.10.30.3]:25, delay=450, delays=450/0.03/0.02/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server mailsrv.mymail.ru[10.10.30.3]: no mechanism available)
То необходимо установить еще несколько пакетов:
# yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain
После этого перезапускайте postfix и проверяйте отправку в консоли. Если все в порядке, то к стандартному алиасу для root в /etc/aliases, добавьте внешний адрес, куда будет дублироваться почта, адресованная root. Для этого редактируем указанный файл, изменяя последнюю строку.
Было:
#root: marc
Стало
root: root,admin@mymail.ru
Обновляем базу сертификатов:
# newaliases
На этом все. Теперь все письма, адресованные локальному root, например, отчеты от cron, будут дублироваться на внешний почтовый ящик, причем с отправкой через внешний нормальный почтовый сервер. Так что письма будут нормально доставляться, не попадая в спам (хотя не обязательно, есть еще эвристические фильтры). Теперь удобно использовать локальную отправку в скриптах, не задавая дополнительные параметры. Все уже настроено, можно использовать простую локальную доставку.
Подскажите, пожалуйста, Вы редактировали сам файл /etc/postfix/main.cf?
Или создали новый с другим именем?
Возможно ли эту схему использовать для настройки на SMTP Google?
Редактировал текущий. Создать новый нельзя, нужно именно main.cf редактировать. Можно его скопировать куда-нибудь, чтобы сохранить оригинальное содержание.
И для google, и для yandex использовать можно, я проверял и использовал. Нужно только правильные настройки smtp пора указать, у них они разные.
Пытаюсь настроить уведомления, используя сервер mail.ru.
По ходу настроек узнал, что postfix не работает с ssl)
Поменял порт на 587, сервер mail.ru стал ругаться на адрес отправителя с ошибкой 550.
Дописал строку:
smtp_generic_maps = hash:/etc/postfix/generic
В файл /etc/postfix/generic добавил:
root@CentOS.CentOS mail@mail.ru
Создfk хеш-файл:
postmap /etc/postfix/generic
Перезапустил postfix.
Теперь пишет: «postfix/smtp[54631]: 402C6C7DE6: conversation with smtp.mail.ru[94.100.180.160] timed out while sending DATA command».
Что с этим делать я не знаю 🙁
Да, я тоже столкнулся с тем, что postfix не умеет работать по ssl, а в инструкции яндекса написано, что надо использовать именно ssl. Но оказалось, что starttls на 587 порту он все-таки поддерживает. В итоге все получилось.
Но если mail.ru не предлагает альтернатив ssl, то не знаю, что можно сделать. Разве что не пользоваться почтой mail.ru.
Сколько раз зарекался не пользоваться mail.ru)
Для Gmail не знаете настроек, случайно? )
Так а какие там настройки? Только адрес порта поставить 587 и адрес сервера прописать smtp.gmail.com.
Сервер входящей почты (IMAP)
imap.gmail.com
Требуется SSL: да
Порт: 993
Сервер исходящей почты (SMTP)
smtp.gmail.com
Требуется SSL: да
Требуется TLS: да (при наличии)
Требуется аутентификация: да
Порт для SSL: 465
Порт для TLS/STARTTLS: 587
Полное или отображаемое имя: Ваше имя
Учетная запись, имя пользователя или адрес электронной почты: Ваш адрес электронной почты полностью
Пароль: Ваш пароль Gmail
С TLS postfix умеет работать?
умеет )
Настроил postfix по вашей статье, письма отправляются и доходят (через smtp.gmail.com). Спасибо!
Проблемы тоже есть.
1) Письма приходят только на gmail. На mail.ru — не приходят даже в спам.
2) Все письма попадают с спам, даже если указать в gmail, что это не спам и добавить почтовый ящик в адресную книгу.
При отправке писем с другого SMTP-сервера нужно чтобы адрес отправителя в письме совпадал с реальным адресом отправителя (в частности, чтобы письма приходили на серверы mail.ru)
нужно в фале /etc/posstfix/main.cf добавить строку
smtp_generic_maps = hash:/etc/postfix/generic
в самом файле /etc/postfix/generic добавить строку
root@server.mydomain.ru реальное_имя_отправителя@mydomain.ru
и создать хэш
postmap /etc/postfix/generic
перезапустить postfix
systemctl restart postfix
Спасибо большое! Обязательно попробую сделать так )
Спасибо автору за статью, очень полезно. Все отлично работает с Gmail-ом. Почта приходит как было сказано в «Входящие» а не в «Спам».
Вопрос: Почта отправляется в открытом виде или шифруется пакеты при отправке?
Gmail работает только по шифрованному протоколу, так что все зашифровано.
Благодарю.
После настроек мне приходит письмо следующего содержания:
This is the mail system at host centos.localdomain.
I’m sorry to have to inform you that your message could not
be delivered to one or more recipients. It’s attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
The mail system
(expanded from ): host
mail.мой провайдер.com[ip.моего.провайдера.почты] said: 550-Verification failed for
550-Unrouteable address 550 Sender verify failed
(in reply to RCPT TO command)
Имеются два прикрепленный файла:
message2.delivery-status
message3.eml
Это уже вопрос к вашему почтовому провайдеру, через которого вы отправляете. Я не совсем понимаю, что он имеет ввиду, говоря:
Вы не проходите проверку на отправителя у вашего провайдера почты.
Сейчас переключился на настройку Zabbix на боевом сервере(наконец то железку купили хорошую), и проблему с почтой отложил пока. Но есть мысля что гадит сертификат провайдера. Я просто сейчас не помню пробовал ли я с шифрованием почту настраивать или без и какой порт вписывал. А сертификат у провайдера само-подписанный типа и из-за этого бывают проблемы с настройкой почтовых клиентов на смартфонах с iOC и WindowsPhone. Ну не доверяют они сертификату, а принять его что самое интересное не во всех моделях выходит. Выкручиваюсь настраиваю почту через 25 порт без шифрования. На днях проверю свою мысль и отпишусь.
получаю ошибку авторизации:
[code]said: 553 5.7.1 Sender address rejected: not owned by auth user. (in reply to MAIL FROM command))[/code]
с чем может быть связано?
в [code]/etc/postfix/sasl_passwd[/code]
прописал:
[code]smtp.yandex.ru:587 логин:пассворд[/code]
в main.cf — тоже:
[code]relayhost = smtp.yandex.ru:587[/code]
может в этом ошибка?
Лог:
[code]
[root@name-vps-1 rsyslog.d]# tail -n 10 /var/log/maillog
Feb 6 04:16:35 name-vps-1 postfix/pickup[3363]: D6F8C1371: uid=0 from=
Feb 6 04:16:35 name-vps-1 postfix/cleanup[3369]: D6F8C1371: message-id=
Feb 6 04:16:35 name-vps-1 postfix/qmgr[3364]: D6F8C1371: from=, size=767, nrcpt=1 (queue active)
Feb 6 04:16:36 name-vps-1 postfix/smtp[3371]: D6F8C1371: to=, relay=smtp.yandex.ru[77.88.21.38]:587, delay=0.31, delays=0.06/0.05/0.18/0.02, dsn=5.7.1, status=bounced (host smtp.yandex.ru[77.88.21.38] said: 553 5.7.1 Sender address rejected: not owned by auth user. (in reply to MAIL FROM command))
Feb 6 04:16:36 name-vps-1 postfix/cleanup[3369]: 367BB1924: message-id=
Feb 6 04:16:36 name-vps-1 postfix/bounce[3373]: D6F8C1371: sender non-delivery notification: 367BB1924
Feb 6 04:16:36 name-vps-1 postfix/qmgr[3364]: 367BB1924: from=, size=2707, nrcpt=1 (queue active)
Feb 6 04:16:36 name-vps-1 postfix/qmgr[3364]: D6F8C1371: removed
Feb 6 04:16:36 name-vps-1 postfix/smtp[3371]: 367BB1924: to=, relay=smtp.yandex.ru[213.180.204.38]:587, delay=0.15, delays=0.01/0/0.13/0.01, dsn=5.7.1, status=bounced (host smtp.yandex.ru[213.180.204.38] said: 553 5.7.1 Sender address rejected: not owned by auth user. (in reply to MAIL FROM command))
Feb 6 04:16:36 name-vps-1 postfix/qmgr[3364]: 367BB1924: removed
[/code]
В логе написано, в чем причина ошибки. Яндекс не допускает отправку, когда адрес отправителя не совпадает с адресом пользователя для авторизации:
Sender address rejected: not owned by auth user.
сейчас в from попадает email вида root@mydomain.ru
где изменить root на нужное мне имя для авторизации?
т.е. на то что прописано в sasl_passwd ?
судя по логу (к сожалению часть лога ваш парсер порезал) в начале запроса from присутствует (первые 5 строк с ошибкой), но дальше from — пуст (последние 5 строк с ошибкой)
во первом SENDe в to нужный емейл
во втором SENDe в to попадает root@mydomain.ru (хотя не совсем понимаю, что он пытается отправить на этот емейл, т.к. он ни где вроде бы не прописан)
создал временно ящик root@mydomain.ru
прописал его данные в /etc/postfix/sasl_passwd
при отправке письма на конкретный ящик, например:
df -h | mail -s «Disk usage» admin@mydomain.ru
письмо приходит на admin@mydomain.ru
при отправке же письма на root, например:
df -h | mail -s «Disk usage» root
письмо приходит на root@mydomain.ru
в /etc/aliases прописано:
root: root,admin@mydomain.ru
впрочем, ни чего не меняется и если прописано:
root: admin@mydomain.ru
или строка закомментирована
естественно, что после каждого изменения выполнялись:
# newaliases
# systemctl restart postfix
что-то я совсем запутался :-/
Собственно присоединяюсь к предыдущему коллеге.
Суть:
Работаем под root
Отправляем почту через smtp.yandex.ru:587
Есть учетка zabbix@mydomain.ru
# hostname = Zabbix
Часть конфига main.cf
myhostname = Zabbix
mydomain = myadmin.ru
Часть конфига sasl_passwd
smtp.yandex.ru:587 root@mydomain.ru:pass
Часть конфига aliases
root: root, info@mydomain.ru
Собственно вопросы:
1) Как заставить проходить авторизацию не под root@mydomain.ru (я, конечно, завел пользователя root@mydomain.ru как вынужденную меру, но все же как-то не очень ситуация)
2) Что-то, видимо делаю не так с алиасами. Напрямую почта уходит, при выполнении mail -s «test» root почта не уходит, хотя в /var/log/maillog ошибок нет. Письмо уходит на «root»
Помогите с решением вопроса
Попытка №2.
Уважаемый Zerox, есть следующая ситуация абсолютно схожая с комментарием Выше.
Вопрос1: каким образом можно работать из под root, при этом авторизация postfix будет происходить от имени учетки zabbix@mydomain.ru?
Вопрос2: Прописал Алиасы как у Вас указано. На прямую почту письма ходят, по алиасу root, нет. Где копать?
Доброго дня суток. Уважаемый Zerox,а вы не планируете статьи по сортировке почты, в частности только консольными клиентами, но не на примере почтового сервера, а обычной машинки, фактически домашней. В гугле в основном упор делается именно на сервера.
Не очень понял, о чем идет речь.
Спасибо за статью!
Да, с mail.ru не получилось. Получилось с gmail.com
Только у меня там включена двухэтапная авторизация (с подтверждением по смс) и поэтому нужно было создавать специальный отдельный пароль для приложения. Gmail его сам генерирует. Затем его нужно прописать в /etc/postfix/sasl_passwd
https://myaccount.google.com/apppasswords
Спасибо за подсказку. Сэкономила время.
Присоединяюсь к вопросу Андрея. Так же сделал все настройки, но почта напрямую для root ну уходит, команда
df -h | mail -s «Disk usage» root
Хорошая статья, спасибо!
Вопрос как сделать тоже самое без авторизации? В локалке есть полноценный почтовик который работает для доверенных хостов без авторизации по smtp. Настраиваемый сервер доверенный в данном случае.
Спасибо за статью и старания)
Здравствуйте. Не отправляется почта на gmail.
По telnet с сервака порт 465 на smtp.gmail.com открыт.
Но в логе пишет, что сеть не доступна.(
Oct 29 15:52:54 localhost postfix/qmgr[1968]: CDBB4605FD: from=, size=1096, nrcpt=1 (queue active)
Oct 29 15:52:54 localhost postfix/qmgr[1968]: 11A086930C: from=, size=944, nrcpt=1 (queue active)
Oct 29 15:52:54 localhost postfix/qmgr[1968]: 8426F3D6D4: from=, size=949, nrcpt=1 (queue active)
Oct 29 15:52:54 localhost postfix/error[2031]: CDBB4605FD: to=, orig_to=, relay=none, delay=373, delays=373/0.02/0/0.03, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to smtp.gmail.com[2a00:1450:4010:c0b::6c]:465: Network is unreachable)
Oct 29 15:52:54 localhost postfix/error[2032]: 11A086930C: to=, relay=none, delay=5075, delays=5075/0.02/0/0.05, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to smtp.gmail.com[2a00:1450:4010:c0b::6c]:465: Network is unreachable)
Oct 29 15:52:54 localhost postfix/error[2034]: 8426F3D6D4: to=, relay=none, delay=357, delays=357/0.02/0/0.05, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to smtp.gmail.com[2a00:1450:4010:c0b::6c]:465: Network is unreachable)
Отправка идет по сети ipv6. Вероятно она либо не настроена, либо настроена неправильно. Лучше ее отключить полностью, если не используется.
Oct 29 15:52:54 localhost postfix/qmgr[1968]: CDBB4605FD: from=, size=1096, nrcpt=1 (queue active)
Oct 29 15:52:54 localhost postfix/qmgr[1968]: 11A086930C: from=, size=944, nrcpt=1 (queue active)
Oct 29 15:52:54 localhost postfix/qmgr[1968]: 8426F3D6D4: from=, size=949, nrcpt=1 (queue active)
Oct 29 15:52:54 localhost postfix/error[2031]: CDBB4605FD: to=, orig_to=, relay=none, delay=373, delays=373/0.02/0/0.03, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to smtp.gmail.com[2a00:1450:4010:c0b::6c]:465: Network is unreachable)
Oct 29 15:52:54 localhost postfix/error[2032]: 11A086930C: to=, relay=none, delay=5075, delays=5075/0.02/0/0.05, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to smtp.gmail.com[2a00:1450:4010:c0b::6c]:465: Network is unreachable)
Oct 29 15:52:54 localhost postfix/error[2034]: 8426F3D6D4: to=, relay=none, delay=357, delays=357/0.02/0/0.05, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to smtp.gmail.com[2a00:1450:4010:c0b::6c]:465: Network is unreachable)
ipv6 может стоит погасить или настроить корректно?