вторник, 13 декабря 2011 г.

Настройка sendmail для использования gmail в качестве хоста передачи (smarthost)

Люблю я сендмейл. Ну нравится он мне. И в данной заметке я опишу, как настроить  сендмейл для использования gmail в качестве смартхоста.

Рассматриваемая ОС Ubuntu 11.04. Но и в любой другой ОС настройка будет скорее всего примерно такой.

Итак, устанавливаем сендмейл и дополнительные утилиты:

$ sudo apt-get install sendmail sasl2-bin

Обратите внимание, что в Ubuntu сендмейл уже поставляются с фейковыми  сертификатами для соединений TLS, поэтому мы их генерировать не будем, а воспользуемся существующими, в других дистрибутивах сертификаты возможно вам придется генерировать вручную.

Проверим, что у нас получилось:

$ sudo /usr/sbin/sendmail -d0.1 -bv root
Version 8.14.4
 Compiled with: DNSMAP LDAPMAP LDAP_REFERRALS LOG MAP_REGEX MATCHGECOS
        MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX
        NEWDB NIS NISPLUS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS
        TCPWRAPPERS USERDB USE_LDAP_INIT XDEBUG

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = chelny
  (canonical domain name) $j = chelny.buteo.ru
         (subdomain name) $m = buteo.ru
              (node name) $k = chelny
========================================================

root... deliverable: mailer local, user root

Обратите внимание, на наличие опций SASLv2 и STARTTLS.

Переместитесь в каталог /etc/mail

Создайте файл authinfo со следующим содержимым:

AuthInfo:smtp.gmail.com "U:username" "I:username@gmail.com" "P:password" "M:PLAIN"
AuthInfo:smtp.gmail.com:587 "U:username" "I:username@gmail.com" "P:password" "M:PLAIN"

Выполните команду:

# makemap -r hash authinfo.db < authinfo

Для создания файла /etc/mail/sasl/sasl.m4 выполните:

# make

Отредактируйте sendmail.mc как показано ниже (добавлены строки выделенные жирным):

dnl #
include(`/etc/mail/m4/dialup.m4')dnl
include(`/etc/mail/m4/provider.m4')dnl
include(`/etc/mail/tls/starttls.m4')dnl
include(`/etc/mail/sasl/sasl.m4')dnl
FEATURE(`authinfo', `hash /etc/mail/authinfo.db')dnl
define(`SMART_HOST',`smtp.gmail.com')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
 
dnl #
dnl # Default Mailer setup
MAILER_DEFINITIONS
MAILER(`local')dnl
MAILER(`smtp')dnl

И еще раз:

# make && /etc/init.d/sendmail reload

Если все получилось без ошибок, то релей через gmail настроен. Проверяем!

Отправляем сообщение с локального хоста на mail.ru:

$ mail -v asa***@mail.ru
Subject: Тестовое сообщение
Это тестовое сообщение
.
Cc: 
...
050 235 2.7.0 Accepted
...
250 2.0.0 pBDA7MDj024641 Message accepted for delivery
asa***@mail.ru... Sent (pBDA7MDj024641 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT


Вуаля! Наше письмо было успешно доставлено!




11 комментариев:

  1. Спасибо добрый человек =) Возможно стоит добавить, что есть такой баг, что php.mail() выполняется слишком долго, подвисая на минуту где-то. Решается добавлением в /etc/hosts строчки:
    127.0.0.1 localhost localhost.localdomain YourServer

    ОтветитьУдалить
    Ответы
    1. Вообще заметка не совсем про php ) но в любом случае рад, что заметка принесла пользу )

      Удалить
  2. А для других серверов, не gmail.com это подходит? Я пытаюсь сделать так как написано, но мне все равно удаленный сервер пишет "User unknown". Посоветуйте что-нибудь, пожалуйста.

    ОтветитьУдалить
    Ответы
    1. Если сервер, который вы хотите использовать в качестве смартхоста использует smtp, то вероятно нет никаких причин не настроить его таковым.

      Для себя ответьте на вопросы: нужна ли авторизация для отправки сообщения? нужен ли tls? разрешен ли relay для вас этим сервером?

      Когда узнаете ответы на эти вопросы, то сможете настроить релеем тот хост, который захотите.

      Удалить
    2. нужна ли авторизация для отправки сообщения? - да
      нужен ли tls? - да
      разрешен ли relay для вас этим сервером? - без авторизации нет.
      То есть единственный способ отправить письмо - притвориться, что мы клиент, у которого на этом хосте есть почтовый ящик. Но не получается. Вот логи:

      Jul 11 00:32:02 main sendmail[12059]: q6AKW2n1012059: from=root, size=59, class=0, nrcpts=1, msgid=<201207102032.q6AKW2n1012059@xxx.xxx.ru>, relay=root@localhost
      Jul 11 00:32:02 main sm-mta[12060]: STARTTLS=server, relay=localhost [127.0.0.1], version=TLSv1/SSLv3, verify=NOT, cipher=DHE-RSA-AES256-SHA, bits=256/256
      Jul 11 00:32:02 main sendmail[12059]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-SHA, bits=256/256
      Jul 11 00:32:03 main sm-mta[12060]: q6AKW2V2012060: from=, size=316, class=0, nrcpts=1, msgid=<201207102032.q6AKW2n1012059@xxx.xxx.ru>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
      Jul 11 00:32:03 main sendmail[12059]: q6AKW2n1012059: to=, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30059, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (q6AKW2V2012060 Message accepted for delivery)
      Jul 11 00:32:03 main sm-mta[12062]: STARTTLS=client, relay=mx.cm.hc.ru., version=TLSv1/SSLv3, verify=OK, cipher=AES256-SHA, bits=256/256
      Jul 11 00:32:03 main sm-mta[12062]: q6AKW2V2012060: to=, ctladdr= (0/0), delay=00:00:01, xdelay=00:00:00, mailer=relay, pri=120316, relay=mx.cm.hc.ru. [89.111.177.200], dsn=5.1.1, stat=User unknown
      Jul 11 00:32:03 main sm-mta[12062]: q6AKW2V2012060: q6AKW3V1012062: DSN: User unknown
      Jul 11 00:32:03 main sm-mta[12062]: q6AKW3V1012062: to=, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30000, dsn=2.0.0, stat=Sent

      Спасибо за ответ!

      Удалить
    3. Что значит "притвориться"?... Если пользователя нет и вводятся левые учетные данные, то сервер и дает отлуп в виде "User unknown".

      А чего здесь можно ожидать еще? Получайте корректные учетные данные и настраивайте authinfo в соответствии с ними.

      Удалить
  3. Супер! Огромное спасиба за статью!

    ОтветитьУдалить
  4. Очень помогла статья! Спасибо! Три дня мучался, чтобы настроить отправку почты. И как говорит petanqistics в первом сообщении, прописать свой домен в hosts нужно. Иначе минута ожидания php.mail гарантирована.

    ОтветитьУдалить
  5. спасибо! работает с http://www.mxgate.ru/!!!

    ОтветитьУдалить
  6. Прошу прощения, но я не понял кого(что) вводить в "U:username". I:username@gmail.com - тут аккаунт gmail.com. тут "P:password" пасворд от мыла. а вот "U:username" - я хз. пишет User unknown.

    ОтветитьУдалить
    Ответы
    1. Попробуйте ввести имя пользователя без домена "@gmail.com"

      Удалить