Локальный postfix c релеем на GMail
Почтовые сервера категорически не хотят принимать письма с локальной машины, из-за отсутствия обратной зоны и даже не кладут эти письма в спам – мочат на корню. Решил использовать GMail в качестве SMTP а для отправки postfix. Приступим.
При подключении к gmail используется протокол TLS. Если уже были какие-то попытки настройки и почта не уходила, а в логе /var/log/mail.info красовалась ошибка:
Mar 19 21:51:23 sergey-desktop postfix/smtp[22818]: 9ED5411723F9: to=
, relay=smtp.gmail.com[209.85.129.111]:587, delay=0.25, delays=0.01/0.01/0.18/0.06, dsn=5.7.0, status=bounced (host smtp.gmail.com[209.85.129.111] said: 530 5.7.0 Must issue a STARTTLS command first. d13sm2389062fka.32 (in reply to MAIL FROM command))
то значит что как раз таки TLS не используется. Блок с настройкой целиком из статьи на opennet (только тот который TLS, остальное в данном контексте не нужно) у меня заработал без каких либо проблем.
Для начала нам необходимо создать свой собственный сертификат сервера.
Для этого воспользуемся несколько модифицированным скриптом из поставки Cyrus-IMAP
test -x /usr/bin/openssl || exit 0
prefix="/"
if test -f /etc/ssl/server.pem
then
echo "/etc/ssl/server.pem already exists."
exit 1
fi
cp /dev/null /etc/ssl/server.pem
chmod 600 /etc/ssl/server.pem
chown root /etc/ssl/server.pem
cleanup() {
rm -f /etc/ssl/server.pem
rm -f /etc/ssl/server.rand
exit 1
}
dd if=/dev/urandom of=/etc/ssl/server.rand count=1 2>/dev/null
/usr/bin/openssl req -new -x509 -days 3650 -nodes -config /etc/ssl/openssl.cnf \
-out /etc/ssl/server.pem -keyout /etc/ssl/server.pem
/usr/bin/openssl gendh -rand /etc/ssl/server.rand 512 \
>>/etc/ssl/server.pem || cleanup
/usr/bin/openssl x509 -subject -dates -fingerprint \
-noout -in /etc/ssl/server.pem || cleanup
rm -f /etc/ssl/server.rand
можете скачать готовый файл: mkcert.sh.tar
При помощи этого скрипта, мы создаем в директории /etc/ssl самоподписанный сертификат нашего сервера – server.pem. В процессе создания будет необходимо указать некоторые значения, названия достаточно понятные и я думаю проблем не должно возникнуть. Главное в поле Common Name (eg, YOUR name) [mail.domain.ru]: указать FQDN вашего почтового сервера, в данном примере: mail.domain.ru. Если имя сервера для отправки/приема почты в настройках почтовой программы не совпадает с указанным в сертификате – почтовая программа будет <<ругаться>>.
Теперь редактируем файл /etc/postfix/main.cf, а именно – добавляем следующие строки:
smtp_tls_key_file = /etc/ssl/server.pem
smtp_tls_cert_file = $smtp_tls_key_file
smtp_tls_CAfile = $smtp_tls_key_file
smtp_tls_note_starttls_offer = yes
smtp_tls_loglevel = 0
smtpd_tls_auth_only = yes
smtpd_use_tls = yes
smtpd_tls_loglevel = 0
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_key_file = /etc/ssl/server.pem
smtpd_tls_cert_file = $smtpd_tls_key_file
smtpd_tls_CAfile = $smtpd_tls_key_file
и в нем же устанавливаем relayhost и добавляем параметры авторизации
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =
Опция smtpd_tls_auth_only = yes позволяет производить SMTP авторизацию только в режиме TLS.
В /etc/postfix/sasl_passwd необходимо добавить данные для авторизации на GMail вида
и выполнить
sudo /etc/init.d/postfix restart
В php.ini проверить настройки отправки почты
...
SMTP = localhost
smtp_port = 25
; теперь можно закомментировать этот параметр
;sendmail_path =
В принципе все – почта должна уходить из скриптов. Единственный нюанс – GMail в качестве отправителя подставит учетную запись, которая использовалась при авторизации для отправки.
Есть еще вариант настройки разных релеев, в зависимости от какого аккаунта отправляется почта, подробнее здесь: Configure Postfix for Multiple ISP Client SMTP Authentication, ubuntu-tutorials.com (на английском)