Настройка Sendmail для отправки почты без попадания в Спам / Хабр
Столкнулся с проблемой: на правильно настроенном сервере Apache с установленными модулями и настроенными доменными записями у провайдера — письма отправленные через функцию mail из скриптов php попадали в спам или не доставлялись вовсе.Начал разбираться и не смог найти не одной полноценной публикации в рунете, которая раскрывала бы проблему и помогала решить все вопросы.
Вашему вниманию представляю собранный из разных источников, проверенный и используемый способ настройки сервера для правильной отправки писем sendmail.
Система: Ubuntu 20.06
Почтовый сервис: Яндекс
1. Установка Sendmail
Если по какой-то причине не был установлен. Произведите базовую установку и настройку
sudo apt-get install php-mail sudo apt-get install sendmail sudo sendmailconfigПравим php.ini
Вместо [email protected] пишем почту на которую будут приходить отчеты (заголовок Return-Path:).
sendmail_path = "/usr/sbin/sendmail -t -f [email protected] -i"
Если его не установить, заголовок будет равен примерно такому значению «Return-Path: <[email protected]>».
Очень желательно чтобы значение заголовка всегда совпадало с именем домена с которого отправляется письмо, независимо от значения заголовка «From:», иначе оно может быть отправлено в «Спам» или же отклонено вовсе.
2. Настройка DNS записей
Нам необходимо настроить SPF, DMARC, DKIM записи.
Какая за что отвечает расписывать не буду. В рунете огромное количество инструкций.
Если тоже используете какой-либо почтовый сервис, у них свои подробные инструкции по настройке.
На что следует обратить внимание — чтобы в SPF был прописан IP-адрес сервера.
v=spf1 ip4:ip_server include:_spf.yandex.net ~allЗатем следует запросить у провайдера DNS-хостинга обратную запись rDNS (PTR-запись).
Привязать свой домен к ip-адресу сервера.
Как правило провайдер самостоятельно ее устанавливает по запросу.
4. Изменить hostname
Установить hostname равный названию нашего домена:
sudo hostnamectl set-hostname site.ru5. Редактировать файл sendmail.mc
Переходим к файлу /etc/mail/sendmail.mc
Нам необходимо настроить заголовки «Received: from» и «Received: by». Они являются важными при определении уровня доверия к серверу отправляющему электронную почту.
Добавляем следующие строки в конце файла перед MAILER_DEFINITIONS
FEATURE(allmasquerade) FEATURE(masquerade_envelope) FEATURE(local_no_masquerade) MASQUERADE_AS(`site.ru')И в конец файла:
define(`MAIL_HUB', `site.ru.')dnl define(`LOCAL_RELAY', `site.ru.')dnl
6. Проверяем настройки apache и файервола
sudo ufw allow 25 sudo nano /etc/apache2/envvarsИщем строчки и заменяем www-data на текущего пользователя под которым запущен apache
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
7. Обновляем конфигурацию и перезагружаем sendmail
sudo sendmailconfig sudo service sendmail restart sudo systemctl restart apache2
ошибка sendmail php
- Регулярное выражение убрать текст в скобочках (console.warn,log)
- PHP определение страны/города по IP адресу пользователя без оплаты (MaxMind)
Оставить отзыв
- Подробности
SYSERR(root): Cannot exec /usr/sbin/sensible-mda: Permission denied
sendmail.service - LSB: powerful, efficient, and scalable Mail Transport Agent
Loaded: loaded (/etc/init. d/sendmail; generated)
Active: active (running) since Sun 2021-04-11 04:08:15 EEST; 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 12037 ExecStart=/etc/init.d/sendmail start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 4915)
Memory: 3.3M
CGroup: /system.slice/sendmail.service
└─12082 sendmail: MTA: accepting connectionsApr 11 04:08:13 client su[12065]: (to smmsp) root on none
Apr 11 04:08:13 client su[12065]: pam_unix(su:session): session opened for user smmsp by (uid=0)Apr 11 04:08:13 client su[12065]: pam_unix(su:session): session closed for user smmsp
Apr 11 04:08:13 client sm-mta[12082]: starting daemon (8.15.2): SMTP+queueing@00:10:00
Apr 11 04:08:13 client sm-mta[12083]: 13AHj031943: to=<wdata@client>, delay=07:22:21, xdelay=00:00:00, mailer=local, pri=80000, dsn=2.0.0, stat=Sent
Apr 11 04:08:13 client sm-mta[12083]: 1392s000855: to=<wdata@client>, delay=1+22:52:21, xdelay=00:00:00, mailer=local, pri=410000, dsn=2. 0.0, stat=Sent
Apr 11 04:08:13 client sm-mta[12083]: 138HB017989: to=<wdata@client>, delay=2+08:02:21, xdelay=00:00:00, mailer=local, pri=360000, dsn=2.0.0, stat=Sent
Apr 11 04:08:13 client sm-mta[12083]: 137Ht013312: to=<wdata@client>, delay=3+07:12:21, xdelay=00:00:00, mailer=local, pri=870000, dsn=2.0.0, stat=Sent
Apr 11 04:08:15 client sendmail[12037]: .
Apr 11 04:08:15 client systemd[1]: Started LSB: powerful, efficient, and scalable Mail Transport Agent.
Попробуйте установить:
apt-get install sensible-mda
Перезагрузите службу:
systemctl restart sendmail
systemctl status sendmail
Если сообщения не отправляются только на какой-то конкретный домен:
… например, такая ошибка:
mailer=esmtp, pri=?, relay=?. [?], dsn=4.0.0, stat=Deferred: 403 4.7.0 TLS handshake failed
взято отсюда: https://sysadmins.ru/topic185417.html
В файл:
/etc/mail/access
добавить:
Try_TLS: mail. 7tv.ru NO
Try_TLS: 7tv.ru NO
где mail.7tv.ru — необходимый домен (куда НЕ отправляются письма)
выполнить:
cd /etc/mail
makemap hash access.db < access
chmod 640 access.db
По-идее, после этого, письма НЕ будут шифроваться через TLS, но это не точно. Поэтому, берегите свою частую переписку.
Отзывов пока нет
Электронная почта— PHP: mail() против SendMail
спросил
Изменено 13 лет, 7 месяцев назад
Просмотрено 23 тысячи раз
Часть коллектива PHPпростой вопрос: какой из них имеет хорошую производительность для массовой рассылки писем?
функция mail() или sendmail
какая из них используется популярными пакетами менеджера списков PHP?
- php
- электронная почта
- веб-сервер
Что ж, функция mail()
на самом деле не подходит для массовых рассылок, потому что она открывает и закрывает SMTP-сокет для каждого отправляемого вами письма, что далеко не эффективно.
mail
, sendmail
и обычный SMTP
. Что бы это ни стоило, я лично предпочел SMTP, потому что его легко поддерживать как в Linux, так и в Windows.Если вы хотите отправлять почту в фоновом режиме, используя очередь, решением может быть PEAR::Mail_Queue.
sendmail — это агент передачи почты (MTA). В системах на базе UNIX и Linux функция PHP mail()
просто передает электронную почту через sendmail (или совместимый MTA). Для отправки массовой электронной почты вы можете захотеть напрямую подключиться к SMTP-серверу. Zend Framework предоставляет транспорт SMTP.
Если вы сами используете почтовый SMTP-сервер, убедитесь, что у вас правильно настроены SPF и ключи домена, иначе ваша почта попадет в корзину для большинства крупных доменов (yahoo, gmail и т. д.).
Также не забывайте об обработке отказов и надежной функциональности отказа от подписки. Без них ваши рассылки по электронной почте будут гораздо менее эффективными, а ваш IP-адрес попадет в черный список.
И, конечно же, не позволяйте открытым реле. Сделайте свою домашнюю работу и действуйте осторожно, спамеры усложнили нам задачу.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
xampp — почтовая функция PHP не отправляет электронную почту (настроены php.ini и sendmail.ini)
Для работы с почтовой функцией php я настроил и php.ini, и sendmail.ini, закомментировав весь код в [функции почты] в php.ini и вставив следующий код:
SMTP=smtp.gmail.com smtp_port=587 sendmail_from = ******@gmail.com sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
и сделал то же самое в файле sendmail.ini:
smtp_server=smtp.gmail.com smtp_port=587 error_logfile=error.log debug_logfile=debug.log auth_username=******@gmail.com auth_password=********* force_sender=******@gmail.com
После этого перестала возникать следующая ошибка:
Предупреждение: mail(): не удалось подключиться к почтовому серверу через порт 25 «localhost», проверьте настройки «SMTP» и «smtp_port» в php.ini или используйте ini_set()
, но почтовая функция по-прежнему не работает и отображает строку «Ошибка», поскольку я указал в операторе else следующий код:
com"; если (почта ($ rec, $ sub, $ msg)) { эхо "письмо отправлено"; }еще{ эхо "Ошибка"; } ?>
- php
- xampp
- smtp
- локальный хост
Чтобы использовать функцию почты, вам необходимо сгенерировать пароль приложения и назначить его для auth_password в файле sendmail.ini. Вот процесс:
1. Войдите в свою учетную запись Google.
2-Щелкните «Безопасность».
3-Включите «двухэтапную аутентификацию», затем щелкните раздел «Пароль приложения».
4-В раскрывающемся списке «Выбрать приложение» выберите «Почта», а в списке «Выбрать
устройство» выберите «Другое (Пользовательское имя)».
5-Дайте приложению описательное имя, например «Почтовый клиент».
6-Нажмите «Создать».
7-Скопируйте сгенерированный пароль приложения.
8-Вставьте пароль в качестве значения для auth_password в файле sendmail.ini.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.