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

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

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

4 Responses to “Локальный postfix c релеем на GMail”

  1. Denis Says:

    Мне хватило:
    relayhost = [smtp.gmail.com]:587

    smtp_use_tls = yes
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_security_options =

  2. Alex Says:

    Спасибо. Все работает. Без сертификата не работало.

  3. sugrob Says:

    Серега, привет.
    А можешь показать остальную часть конфига? Ту в которой хост определяется и домен.
    У меня что-то не работает как надо. Почта уходит, но в логах при этом пишет вот что:
    …certificate verification failed for smtp.gmail.com[74.125.39.109]:587: untrusted issuer…

  4. Дерябин Сергей Says:

    Вот конфиг целиком.

    # See /usr/share/postfix/main.cf.dist for a commented, more complete version


    # Debian specific:  Specifying a file name will cause the first
    # line of that file to be used as the name.  The Debian default
    # is /etc/mailname.
    #myorigin = /etc/mailname

    smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
    biff = no

    # appending .domain is the MUA's job.
    append_dot_mydomain = no

    # Uncomment the next line to generate "delayed mail" warnings
    #delay_warning_time = 4h

    readme_directory = no

    # TLS parameters
    smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    smtpd_use_tls=yes

    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

    smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

    # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
    # information on enabling SSL in the smtp client.

    myhostname = remza-team.ru
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    mydestination = remza-team.ru, localhost.localdomain, localhost
    #relayhost = smtp.mail.ru
    relayhost = [smtp.gmail.com]:587
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
    #mailbox_size_limit = 0
    #recipient_delimiter = +
    inet_interfaces = 127.0.0.1
    #default_transport = error
    #relay_transport = error

    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_security_options =

Leave a Reply