Sendmail php: PHP: mb_send_mail — Manual

Настройка 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:» является важным заголовком в глазах почтовых сервисов.
Если его не установить, заголовок будет равен примерно такому значению «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.ru
5. Редактировать файл 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 connections

Apr 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-сокет для каждого отправляемого вами письма, что далеко не эффективно.

Если вы посмотрите на PEAR::Mail, вы сможете использовать 3 бэкенда: mail , sendmail и обычный SMTP . Что бы это ни стоило, я лично предпочел SMTP, потому что его легко поддерживать как в Linux, так и в Windows.

Если вы хотите отправлять почту в фоновом режиме, используя очередь, решением может быть PEAR::Mail_Queue.

sendmail — это агент передачи почты (MTA). В системах на базе UNIX и Linux функция PHP mail() просто передает электронную почту через sendmail (или совместимый MTA). Для отправки массовой электронной почты вы можете захотеть напрямую подключиться к SMTP-серверу. Zend Framework предоставляет транспорт SMTP.

1

Если вы сами используете почтовый 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
  • локальный хост
6

Чтобы использовать функцию почты, вам необходимо сгенерировать пароль приложения и назначить его для auth_password в файле sendmail.ini. Вот процесс:

1. Войдите в свою учетную запись Google.
2-Щелкните «Безопасность».
3-Включите «двухэтапную аутентификацию», затем щелкните раздел «Пароль приложения».
4-В раскрывающемся списке «Выбрать приложение» выберите «Почта», а в списке «Выбрать
устройство» выберите «Другое (Пользовательское имя)».
5-Дайте приложению описательное имя, например «Почтовый клиент».
6-Нажмите «Создать».
7-Скопируйте сгенерированный пароль приложения.
8-Вставьте пароль в качестве значения для auth_password в файле sendmail.ini.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *