Задача: отправка почты через внешний smtp шлюз с авторизацией по логину и паролю.
Хост: srv1.server.ru
SMTP сервер: smtp.jino.ru, порт 587 (tls)
Почтовый ящик admin@server.ru, который хостится на jino.ru
Установка
sudo apt install postfix
Настройка конфига
В файл /etc/postfix/main.cf
вставляем
mydomain = server.ru myhostname = srv1.server.ru myorigin = $myhostname mydestination = $myhostname, localhost.$mydomain, localhost inet_interfaces = 127.0.0.1 inet_protocols = ipv4 mynetworks = 127.0.0.1/32 relayhost = [smtp.jino.ru]:587 smtp_use_tls = yes smtp_tls_loglevel = 1 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/private/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous smtp_sasl_type = cyrus smtp_sasl_mechanism_filter = login smtp_sender_dependent_authentication = yes smtp_dns_support_level = disabled smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination alias_maps = hash:/etc/aliases
Содержимое файла /etc/postfix/private/sasl_passwd
содержит smtp сервер с портом, логин и пароль учётной записи:
[smtp.jino.ru]:587 admin@server.ru:password123
Описание параметров и дополнительные настройки
mydomain
— интернет домен для почтовой службы
myhostname
— по умолчанию = полное доменное имя машины = FQDN. Или берётся не-FQDN доменное имя и прибавляется «.$mydomain».
Узнать текущий FQDN машины можно командой hostname -f
Но если команды: postconf myhostname
и postconf mydomain
изначально выводят правильные и нужные нам значения – то указывать не обязательно.
myorigin
— параметр myorigin указывает имя домена, которое используется в почте, отправляемой с этой машины (userLinux@$myorigin). По умолчанию, используется имя локальной машины — $myhostname
mydestination
— для каких доменов почта будет доставляться локально вместо пересылки на другой хост
inet_interfaces = 127.0.0.1
— т.к. нет потребности подключаться из вне, то запускаем postfix только на localhost
mynetworks
— сети, которым разрешено выполнять пересылку через данный сервер
Подмена отправителя
В письме имеется 2 заголовка отправителя From
и Return-Path
Заголовок Return-Path
используется для доставки отчёта с описанием возникшей ошибки.
По умолчанию Return-Path
будет содержать имя пользователя linux от которого отправляется почта. Например www-data@server.ru, где server.ru — это myorigin
. Отчёты о недоставке будут направляться туда.
Если небходимо, что бы заголовок From
и Return-Path
содержал тот же адрес почты под которым и происходит авторизация на smtp сервере, то добавляем в /etc/postfix/main.cf
строку:
sender_canonical_maps = hash:/etc/postfix/private/canonical
Содержимое файла /etc/postfix/private/canonical
@server.ru admin@server.ru
Подмена отправителя через php
Подменить отправителя можно в sendmail_path
в php.ini
sendmail_path = "/usr/sbin/sendmail -t -i -f admin@server.ru";
Если php-fpm, то ещё и в файле pool-а /etc/php/5.6/fpm/pool.d/www.conf
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f admin@server.ru
Завершение настройки и запуск
После этого необходимо сделать хэшированные базы данных из наполненных нами файлов (Postfix lookup tables). И обновить alias_database и alias_maps.
postmap /etc/postfix/private/sasl_passwd postmap /etc/postfix/private/canonical newaliases
Перезапуск службы postfix:
service postfix restart
Настройка SPF-записи
Чтобы почтовые сервера корректно принимали почту и не клали её в папку спам, можно дополнительно прописать в днс SPF запись в TXT типе.
В моём примере почта отправляется с 2 серверов srv1.server.ru и srv2.server.ru через внешний почтовый сервер smtp.jino.ru.
ip srv1.server.ru = 1.1.1.1
ip srv2.server.ru = 1.1.1.2
Создаю TXT-запись со следующими значениями полей
v=spf1 +a +mx ip4:1.1.1.1 ip4:1.1.1.2 include:jino.ru ~all
где:+а
— разрешить отправку почты с ip адресов, указанных в А записях текущего домена+mx
— принимать почту с MX-серверов текущего доменаip4:1.1.1.1
ip4:1.1.1.2
— разрешить с этих двух ipinclude:jino.ru
— включает в запись SPF значение SPF записи другого домена~all
— если письмо пришло с сервера, который не входит в вышеперечисленный список, его стоит проанализировать более тщательно. Также иногда используется -all — в этом случае письмо не проходит дополнительных проверок и сразу отвергается.
Подробнее тут
Проверка почты
sudo apt install mutt echo "test" | mutt -s "subject" to@e-mail.ru
С указанием From
echo "My message" | mutt -s "subject" -e 'my_hdr From: myName <test111@server.ru>' -- to@e-mail.ru
Через mail() функцию из php файла
<?php $to = 'nash@e-mail.ru'; $subject = 'the subject'; $message = 'hello'; $headers = 'From: admin@example.com' . "\r\n" . 'Reply-To: admin@example.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); if( mail($to, $subject, $message, $headers) ) { echo "OK"; } else { echo "FAIL"; }
Просмотреть лог:
tail -50 /var/log/mail.log
http://www.postfix.org/postconf.5.html
http://carantin2006.narod.ru/postfix/postfix/BASIC_CONFIGURATION_README.html
http://carantin2006.narod.ru/postfix/postfix/
https://docs.altlinux.org/ru-RU/archive/2.2/html-single/master/admin-html/ch09.html
https://help.ubuntu.ru/wiki/postfix
https://help.ubuntu.ru/wiki/postfix_relay_yandex
https://guruadmin.ru/page/nastrojka-pochtovogo-shljuza-na-baze-postfix
https://www.linux.org.ru/forum/admin/4383051
https://serveradmin.ru/postfix-nastrojka-relayhost-otdelnyj-dlya-kazhdogo-domena/
https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex