Ubuntu 18.04. Postfix. Настройка отправки почты через внешний smtp сервер

Задача: отправка почты через внешний 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 — разрешить с этих двух ip
include: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