Письма, отправленные с сайта через функцию 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. При установке на вопрос об использовании отвечаем «интернет сайт».
Далее редактируем конфигурационный файл /etc/postfix/main.cf. Удаляем из него всё, вместо это пишем следующее:
Где поля "myhostname = host.domain.name" и "mydestination = host.domain.name" указывают на имя вашего хоста. То есть надо заменить.
Сохраняем. Копируем сертификат.
Далее, всё там же, в /etc/postfix создаём файл mailpass и пишем в нём следующее:
Где [email protected] у нас почтовый аккаунт, а password, соответственно пароль от него.
Сохраняем и запрещаем к нему доступ всем, кроме супер пользователя.
А лучше 400, так как и root’у там править ничего больше не понадобится.
Сохраняем и создаём файл generic следующего содержания:
«www-data» - это у нас пользователь, под которым работает apache на виртуальном хосте и от имени которого CMS генерирует контент. Если apache у вас настроен грамотно и работает от имени пользователя, которому принадлежит директория, в которой размещается CMS, то вместо «www-data» следует указать его. Вторая часть – это соответственно e-mail, с которого будет приходить почта от пользователя www-data.
Сохраняем и создаём файл sender_relay следующего содержания:
Тут я думаю, всё понятно. В системе два пользователя (root и user) и почта обоих идёт через внешний SMTP.
Сохраняем и создаём файл tls_policy. Пишем в нём следующее:
На самом деле, возня с файлом «tls_policy» не обязательна. Говорят, работает и без него, но у меня не завелось. Если не создавать этот файл, то и строку «smtp_tls_policy_maps = hash:/etc/postfix/tls_policy» из конфигурации следует удалить.
После выполняем следующие команды:
(Без надобности, если «tls_policy» не используется).
После чего перезагружаем Postfix.
Всё. Можно проверить следующей командой:
Где [email protected] у нас почта, на которую мы только что отправили письмо.
Логи у нас в /var/log/mail.log. Если всё сделано правильно, то там отчёт об операции. Если накосорезили, то там сведения об ошибке.
Если у вас и в Google Apps настроено всё грамотно и за доменом закреплена цифровая подпись, то письма, отправленные через стандартную функцию mail() никогда не попадут в спам.
Ну и на последок ложка дёгтя. Я не знаю, как сейчас, но на аккаунтах Gmail раньше был лимит в 500 исходящих писем в сутки. Борьба со спамом. Не знаю, действуют ли эти лимиты в Google Apps (никогда их не превышала), но обратить на это внимание стоит. Но если лимиты и есть, то по этой схеме всегда можно завернуть почту через более безалаберные сервисы, если у вас большая аудитория и все подписаны на каждый чих, раздающийся на сайте.
И так, если нельзя заставить движок работать с внешним 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 (никогда их не превышала), но обратить на это внимание стоит. Но если лимиты и есть, то по этой схеме всегда можно завернуть почту через более безалаберные сервисы, если у вас большая аудитория и все подписаны на каждый чих, раздающийся на сайте.