Crossroads » Linux » Postfix. Отправка почты через внешний SMTP

Postfix. Отправка почты через внешний SMTP

  • Dislike
  • +6
  • Like
Письма, отправленные с сайта через функцию mail() в 99% случаев попадают в спам, если ваш SMTP сервер не настроен профессионально. Зачастую острой необходимости в установке и тонкой настройке SMTP у вебмастера нет, а ещё чаще тупо лень. Во многих CMS есть опция, или сторонние плагины, позволяющие обойти эту проблему, используя внешние SMTP сервисы. Но что если CMS не имеет такой опции, или выполнена она коряво и работает с ограничениями по портам или ещё с какими-нибудь сюрпризами? Особенно досадно, если это коммерческий проект, а разработчик движка, за который заплачено не мало денег и который, по большому счёту всем устраивает, говорит, что «опция планируется, но приоритет низкий, т.к. запросов на фичу очень мало»? И совсем уж печально, если узнаёте вы это из архива форума поддержки, где обсуждалась сия «неприоритетная» задача несколько лет назад, а воз и ныне там. Я не знаю почему низкий приоритет… Возможно в Рунете никого не напрягает, что письма с подтверждениями, счетами и прочие валятся в спам. Меня напрягает.
И так, если нельзя заставить движок работать с внешним SMTP, то нужно заставить работать с ним стандартную функцию mail(). Заворачивать почту мы будем через SMTP сервер Google. В примере у меня домен, подключенный к Google Apps, но то же самое можно сделать и с обычным аккаунтом Gmail.
Имеем: Сервер под Ubuntu 12.04 с хостом host.domain.name, доменное имя domain.name, подключенное к Google Apps и CMS, отправляющую почту только через mail(). Последнее не важно, так как CMS мы не будет трогать совсем.
Устанавливаем Postfix. При установке на вопрос об использовании отвечаем «интернет сайт».
aptitude install postfix mailutils libsasl2-2 ca-certificates libsasl2-modules

Далее редактируем конфигурационный файл /etc/postfix/main.cf. Удаляем из него всё, вместо это пишем следующее:
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = host.domain.name
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = host.domain.name, localhost.net, , localhost
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
relayhost= [smtp.gmail.com]:587
smtp_connection_cache_destinations = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/mailpass
smtp_sasl_security_options = noanonymous
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
smtp_generic_maps = hash:/etc/postfix/generic
smtp_tls_CAfile = /etc/postfix/cacert.pem
soft_bounce = yes
default_destination_concurrency_limit = 1
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

Где поля "myhostname = host.domain.name" и "mydestination = host.domain.name" указывают на имя вашего хоста. То есть надо заменить.
Сохраняем. Копируем сертификат.
cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem | tee -a /etc/postfix/cacert.pem

Далее, всё там же, в /etc/postfix создаём файл mailpass и пишем в нём следующее:
[smtp.gmail.com]:587               [email protected]:password

Где [email protected] у нас почтовый аккаунт, а password, соответственно пароль от него.
Сохраняем и запрещаем к нему доступ всем, кроме супер пользователя.
chmod 600 /etc/postfix/mailpass

А лучше 400, так как и root’у там править ничего больше не понадобится.
Сохраняем и создаём файл generic следующего содержания:
www-data               [email protected]

«www-data» - это у нас пользователь, под которым работает apache на виртуальном хосте и от имени которого CMS генерирует контент. Если apache у вас настроен грамотно и работает от имени пользователя, которому принадлежит директория, в которой размещается CMS, то вместо «www-data» следует указать его. Вторая часть – это соответственно e-mail, с которого будет приходить почта от пользователя www-data.
Сохраняем и создаём файл sender_relay следующего содержания:
[email protected] [smtp.gmail.com]:587
[email protected] [smtp.gmail.com]:587

Тут я думаю, всё понятно. В системе два пользователя (root и user) и почта обоих идёт через внешний SMTP.
Сохраняем и создаём файл tls_policy. Пишем в нём следующее:
[smtp.gmail.com]:587 encrypt

На самом деле, возня с файлом «tls_policy» не обязательна. Говорят, работает и без него, но у меня не завелось. Если не создавать этот файл, то и строку «smtp_tls_policy_maps = hash:/etc/postfix/tls_policy» из конфигурации следует удалить.
После выполняем следующие команды:
postmap /etc/postfix/tls_policy

(Без надобности, если «tls_policy» не используется).
postmap /etc/postfix/generic
postmap /etc/postfix/mailpass
postmap /etc/postfix/sender_relay

После чего перезагружаем Postfix.
/etc/init.d/postfix restart

Всё. Можно проверить следующей командой:
echo "Test mail from postfix" | mail -s "Test Postfix" [email protected]

Где [email protected] у нас почта, на которую мы только что отправили письмо.
Логи у нас в /var/log/mail.log. Если всё сделано правильно, то там отчёт об операции. Если накосорезили, то там сведения об ошибке.
Если у вас и в Google Apps настроено всё грамотно и за доменом закреплена цифровая подпись, то письма, отправленные через стандартную функцию mail() никогда не попадут в спам.
Ну и на последок ложка дёгтя. Я не знаю, как сейчас, но на аккаунтах Gmail раньше был лимит в 500 исходящих писем в сутки. Борьба со спамом. Не знаю, действуют ли эти лимиты в Google Apps (никогда их не превышала), но обратить на это внимание стоит. Но если лимиты и есть, то по этой схеме всегда можно завернуть почту через более безалаберные сервисы, если у вас большая аудитория и все подписаны на каждый чих, раздающийся на сайте.
Like Dislike




Tags: Postfix, Ubuntu


 
  • Creative Commons Licence
  • Norton Safeweb
  • Website Uptime Monitoring By ServiceUptime.com