заметки на полях

Блокнот разработчика

Локальный 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

#!/bin/sh
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_use_tls = yes
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 и добавляем параметры авторизации

relayhost = [smtp.gmail.com]:587

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 вида

smtp.gmail.com  gmail-login@gmail.com:password

и выполнить

sudo postmap hash:/etc/postfix/sasl_passwd
sudo /etc/init.d/postfix restart

В php.ini проверить настройки отправки почты

[mail function]
...
SMTP = localhost
smtp_port = 25

; теперь можно закомментировать этот параметр
;sendmail_path =

В принципе все – почта должна уходить из скриптов. Единственный нюанс – GMail в качестве отправителя подставит учетную запись, которая использовалась при авторизации для отправки.

Есть еще вариант настройки разных релеев, в зависимости от какого аккаунта отправляется почта, подробнее здесь: Configure Postfix for Multiple ISP Client SMTP Authentication, ubuntu-tutorials.com (на английском)

Tags: , ,

Leave a Reply