
В этой статье пойдет разговор о том, как выполнить настройку своего Mail на PHP. Рассмотрим особенности использования Mail, что делать, если письма не отправляются, как выполняется отправка с вложением и какие бывают проблемы с кодировкой.
Какой бы интернет-проект на PHP вы не сделали, на нём должна быть форма обратной связи, что особенно актуально для проектов коммерческого направления. А значит, вам не обойтись без функции mail. Что же, давайте посмотрим, как использовать эту функцию для отправки сообщений.
Лирическое отступление
Прежде чем двигаться дальше, давайте немного вспомним теорию. Чтобы отправлять письма, нам потребуется почтовый сервер SMTP. Но это не проблема, т. к. он есть практически на всех современных платных хостингах. SMTP — сетевой протокол (protocol), используемый для передачи почты в сетях TCP/IP. Почтовые серверы и прочие агенты пересылки задействуют SMTP для получения и отправки сообщений.
Для приёма почты нам понадобится POP-сервер. Также следует понимать, что сам по себе PHP не отправляет сообщение, а лишь передаёт команды приложению sendmail — именно оно занимается отправкой, следовательно, его нужно иметь (если используете Денвер, то данное приложение уже встроено). Вдобавок ко всему, все сообщения почты помещаются в директорию под названием «tmp/!sendmail».
Как настроить mail?
Настройка выполняется в конфигурационном файле php.ini. В этом файле нужно прописать путь к лог-файлам, а также задать значения порта.
Общее описание функции:

Список основных параметров:
1. to — получатель (получатели) письма. Формат должен соответствовать » RFC 2822. Пример — [email protected];
2. subject — тема отправляемого письма;
3. message — отправляемое сообщение. Строка отделяется символом CRLF (rn). Сами строки не д. б. длиннее семидесяти символов.
4. additional_headers — этот параметр является необязательным. Обозначает строку либо массив, которые вставляются в самый конец отправляемых заголовков.
5. additional_parameters — тоже необязателен. Используют для передачи дополнительных флагов в качестве аргументов командной строки для программы, которая сконфигурирована для отправки писем и указана директивой sendmail_path. К примеру, есть возможность установить отправителя при применении sendmail и с помощью опции -f.
Приведём пример:
Если вы являетесь веб-мастером и используете Денвер, то информация, которая будет вами отправлена, сохранится на виртуальном диске Z в папке «tmp!sendmail».
Особенности использования
Работа функции mail в PHP зависит от ряда нюансов, включая вид операционной системы, выполненные настройки и параметры. Вот некоторые особенности:
— во время отправки письма заголовок Form задаётся через необязательный параметр «additional_headers». Если его нет, нередко возникает ошибка при отправлении;
— заголовки разделяйте символами перевода на новую строку и перевода каретки (rn);
— следите, чтобы длина строки не превышала 70 знаков, для регулировки тоже используйте (rn).
Что делать, если функция не отправляет письма?
Даже если учесть всё вышеперечисленное, mail в PHP иногда не работает, причём на локальном сервере всё отправляется нормально. Одна из причин — некорректная настройка функции непосредственно на хостинге. Для решения проблемы рекомендуется обратиться к конфигурационному файлу php.ini и посмотреть на параметры функции «disable_functions». Дело в том, что нужная вам функция mail() может не работать, если она занесена в php.ini в раздел запрещённых (disable_functions).

Идём дальше. Мы можем проверить работоспособность, написав простой код и разместив его в корневом каталоге созданного веб-проекта (сайта):
Если всё функционирует верно, на экране браузера мы увидим цифру один — «1». Её нам вернёт «print» после выполнения. В качестве кодировки рекомендуется использовать UTF-8.

Важный момент! Если вы в качестве локального сервера используете OpenServer, то письма будут сохраняться в папке C:openserveruserdatatempemail. Естественно, если вы его установили на локальный диск «С».
Отправка с вложением
Давайте посмотрим, как отсылать сообщения, включающие в себя прикреплённый файл. Воспользуемся для этого функцией sendMailAttachment():
<? $file = "./files/test.txt"; // прописывается путь к тому файлу, который надо отправить $mailTo = "[email protected]"; // адрес отправителя $from = "[email protected]"; // от кого письмо (от чьего имени) $subject = "Test file"; // тема $message = "Текст с вложением"; // содержимое письма $r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением echo ($r)?Отправлено':'Ошибка. Письмо не отправлено!'; //$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка без вложения //echo ($r)?Отправлено':'Ошибка. Письмо не отправлено!'; ?>Проблемы с кодировкой
Бывает, что после доставки сообщения поступают в виде вопросов «?» либо каких-то непонятных символов. Это свидетельствует о проблемах с кодировкой. Проблема может заключаться в заголовке From. Такие заголовки по стандарту должны быть в US-ASCII. Существуют 2 формы кодирования —BASE64 и Quoted-Printable. BASE64 более универсальна и может работать с UTF-8, поэтому лучше использовать ее. Пример:
Однако в данном варианте заголовки могут быть нечитаемы. Для решения данной проблемы следует написать заголовок так:
Также необходимо использовать исключительно кодировку UTF-8.
Как видите, работа функции mail в PHP совсем несложна. Да, мы рассмотрели лишь наиболее распространённые ошибки, возникающие при её реализации. Однако никто не мешает повысить свои навыки PHP-программирования на наших курсах.
Источники:
https://www.php.net/manual/ru/function.mail.php;
https://start-luck.ru/sozdanie-sayta/php-funkciya-mail.html.
Проверка отправки почты из консоли линукс
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка
-bash: mail: command not found
Если php почта не отправляется, устанавливаем комманду
yum install mailx
Проверяем дальше
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка
/usr/sbin/sendmail: No such file or directory
«/root/dead.letter» 9/216
. . . message not sent.
Устанавливаем sendmail
yum install sendmail sendmail-cf -y
chkconfig —level 345 sendmail on
service sendmail start
Проверяем дальше
echo «Testing» | mail -s «Test» johndoe@example.comс
Ошибка пропала, письма приходят
Но вот не задача…
PHP Функция mail() не работает
Вопрос решился письмом в службу поддержки firstVDS сервера
У меня на сервере VDS установлено веб окрежение битрикс
Необходимо было в файле /etc/php.d/bitrixenv.ini
сменить параметр sendmail_path
;sendmail_path = msmtp -t -i
sendmail_path = /usr/sbin/sendmail -t -i
и все заработало!
PS: для работы curl потребуется еще одна настройка
копируем данные из /etc/php.d/20-curl.ini.disabled в 20-curl.ini
service httpd restart
Тривиальные ситуации, когда имеется непорядок со значением sendmail_path в конфигурации php, решаются легко. Проверьте через phpinfo();, чтобы у вас было задано значение типа /usr/sbin/sendmail -t -i в конфиге, и чтобы за /usr/sbin/sendmail действительно скрывался установленный и работающий MTA. Но сегодня пришлось побеждать менее типовую проблему: из php-скрипта почта как бы отправлялась, но где-то дальше сообщения терялись.
Убеждаемся, что PHP точно пытается отправить почту
Для начала напомню, что начиная с php 5.3 можно включить лог для всей исходящей почты, отсылаемой через функцию mail() из php. Достаточно в конфигурацию php.ini добавить такую настройку:
mail.log = /var/log/phpmail.log
При этом важно, чтобы пользователь, от которого работает php, имел доступ к файлу /var/log/phpmail.log на запись. Рекомендую для комфортной отладки создать файл и позволить всем в него записывать, примерно так:
touch /var/log/phpmail.log chmod 666 /var/log/phpmail.log
Если у вас php работает как модуль Apache, то перезапустите последний.
Записи в логе будут примерно такие:
mail() on [/var/www/modules/system/system.mail.inc:83]: To: admin@example.tld -- Headers: From: user@example.tld
Если версия php у вас поновее чем 5.3, то в лог добавятся дата и время (что, конечно, очень полезно). Например, PHP версии 5.5.32 точно добавляет дату и время (но с какой в точности версии это началось — я не знаю). Всё-таки главное в этом логе — абсолютный адрес скрипта и номер строки, с которой вызывалась функция.
В общем, следующий тривиальный скрипт должен обязательно оставить след в логе:
<?php
$to = 'yourmail@example.tld';
$subject = 'Test email subject';
$message = 'Test from PHP at ' . date('Y-m-d H:i:s');
mail($to, $subject, $message);
echo 'Mail sent';
?>
У меня была как раз такая ситуация: php исправно делал свою работу и записи в логе почты оставлял (ничего при этом не оставляя в логе ошибок).
Проверяем, что письмо может отправить администратор из консоли (без всяких там PHP)
Одновременно с этим почта у меня прекрасно отправлялась из серверной консоли. Проверить можно так:
echo "Test message" | mail -s "Test emal subject" yourmail@example.tld
Если вдруг на вашем сервере нет утилиты mail, то установите пакет mailx вот так:
yum -y install mailx
Анализируем лог postfix
Пришлось заглядывать в лог почтовика. Он пишется в файл /var/log/maillog (актуально для CentOS).
И вот там-то нашлись неприятные записи такого характера:
18:34:31 postfix/sendmail[26381]: fatal: chdir /var/spool/postfix: Permission denied 18:51:16 postfix/sendmail[4603]: fatal: chdir /var/spool/postfix: Permission denied
Даже минимальный опыт общения с линуксом подсказывает, что тут дело либо в несоответствии прав/владельцев, либо в какой-то дефолтной защите, типа фаерволла или… SELinux. В данном случае «виноват» последний.
Отучаем SELinux блокировать почту, отправляемую из PHP
Проверить можно такой командой:
getsebool httpd_can_sendmail
Если вывод будет httpd_can_sendmail --> off, то значит вашу почту блокирует SELinux. Чтобы его от этого отучить на постоянной основе выполните команду:
setsebool -P httpd_can_sendmail 1
И после этого ждите несколько секунд, пока снова не увидите приглашение командной строки. Без ключа -P блокировка снимется только до перезагрузки.
Кстати, пусть вас не смущает, что в параметрах SELinux упомянут httpd. Даже если у вас Apache отсутствует в принципе, а используется, например, связка nginx и php-fpm, то почта всё равно может блокироваться с аналогичными симптомами. Решается проблема точно также и для php-fpm (меняем ту же переменную).
Запрещаем виртуальному хосту отправлять почту
Иногда бывает такая ситуация, что надо наоборот запретить отправлять почту какому-то сайту. Например, если ясно, что на нём вирус, но на лечение вируса нужно время.
Тогда действуем от противного — в настройки виртуального хоста проблемного сайта добавляем параметр:
php_admin_value sendmail_path "/dev/null"
И перезапускаем Apache, чтобы изменения вступили в силу. Либо вы можете включить упомянутый выше параметр SELinux, однако, учтите, что это не поможет, если в вашей системе SELinux отсутствует или перманентно отключен.
-
#1
Вопрос такой, есть php-код отправки почты пользователю:
PHP:
$checksum = base64_encode(substr($_POST['user'],0,3).$email_cnx[0]);
$email = '[email protected]';
$from = '[email protected]';
$subject = 'Регистрация на сайте!';
$subject = "=?utf-8?b?".base64_encode($subject)."?=";
$headers = "Content-Type: text/plain; charset="utf-8"rn";
$headers .= "MIME-Version: 1.0rn";
$headers .= "From: <".$from.">rn";
$headers .= "Reply-To: ".$from."rn";
$headers .= "Date: ". date('D, d M Y H:i:s O') ."rn";
$message = "Вы зарегестрировались на сайте под именем: user1!rn";
$message .= "Для активации вашего аккаунта пожалуйста пройдите по ссылке, указанной ниже!rn";
$message .= "<br><a href='http://test.ru/activate.php?checksum=".$checksum."&email=".$email."'><b>Активировать аккаунт!</b></a>rn";
if (mail($email,$subject,$message,$headers,'-f'.$from)) {echo "ПОЧТА ОТПРАВЛЕНА!!!";}
else {echo "Отправка почты НЕ удалась!!!";}
ну обычная такая отправка почты. И суть в том, что на локальном сервере (Denwer) все отправляется, и выдается сообщение ‘Мы отправили вам письмо для подтверждения регистрации!’. То есть функция mail() возвращает значение true. Проверяю этот же код на реальном хостинге и выдается сообщение ‘Отправка почты не получилась!’. Соответственно mail() выдает false. Попытался пообщаться с техподдержкой хостинга, они сказали, что у них все должно работать, функция mail() не запрещена и sendmail настроен верно. В чем может быть проблема?
-
#2
зарегестрировались
facepalm.jpg
-
#3
AdeL1ne
Поподробнее с момента, как это денвер отправляет почту с локальной машины? На сколько мне известно там простая заглушка была на сендмейл долгое время, которая просто складировала письма в одну папку.
-
#4
AdeL1ne
Поподробнее с момента, как это денвер отправляет почту с локальной машины? На сколько мне известно там простая заглушка была на сендмейл долгое время, которая просто складировала письма в одну папку.
Вообще речь о том что mail() вернул true , то что почта не ушла с машины дело другое 
AdeL1ne
я думаю вам стоит просто попытаться вызывать mail с минимальным количеством параметров и смотреть на ошибки, ТП иногда ТП
-
#5
tz-lom
вопрос в том, что отладка почты на денвере и фраза «у меня на нем все работало, а на сервере перестало», внушает как минимум — улыбку.
-
#6
такое наивное использование данных пришедших непонятно откуда прям «как есть»…
вы уверены, что в $_POST[’email’] хоть что-то есть?
з.ы. … отправил спамерам новый адресок… [email protected] ))
-
#7
да, на денвере почта падает в !sendmail, тоесть функция возвращает значение true, а на хостинге false. Я уже много чего подправил, но все равно, зараза, на хостинге не отрабатывается 
-
#8
такое наивное использование данных пришедших непонятно откуда прям «как есть»…
вы уверены, что в $_POST[’email’] хоть что-то есть?
з.ы. … отправил спамерам новый адресок… [email protected] ))
дружок, ну ты пойми, свое чсв можно повышать миллионом других способов.
а конкретно по твоему вопросу — мне важно, что бы почта таки начала отправляться.
все проверки и прочая защита будут доделываться потом и сейчас нет смысла заморачиваться этим, если функция пока просто отказывается работать на хостинге!
P.S.: в первом посте отредактированный вариант отправки почты, согласно множеству рекомендаций из разных источников. Пока все-так же безрезультатно, функция выдает false 
-
#9
проверь на простом примере из мануала:
если отправляет, ищи ошибки в твоём коде;
если не отправляет, в техподдержку хостинга с этим примером.
-
#10
AdeL1ne
А в логи ты смотрел?
-
#11
AdeL1ne
А в логи ты смотрел?
а как их посмотреть?
отправил такой вариант:
выдало ошибку… наверно все-таки хостинг, хотя они заверяют, что все впорядке!
-
#12
AdeL1ne
tail -n 50 /var/log/mail.log… ну или например лог от твоего php. Да и вообще хотелось бы видеть, что все таки функция mail породит в системе на хостинге.
После вызова mail(xxx) вставь print_r(error_get_last()); и посмотри, есть ли там что.
-
#13
AdeL1ne
tail -n 50 /var/log/mail.log… ну или например лог от твоего php. Да и вообще хотелось бы видеть, что все таки функция mail породит в системе на хостинге.
После вызова mail(xxx) вставь print_r(error_get_last()); и посмотри, есть ли там что.
print_r(error_get_last()); вообще ничего не выдал!
а насчет логов я так и не понял, где их смотреть конкретно на хостинге?
-
#14
служба поддержки хостинга долго тупила, но потом таки признала, что функция mail у нее отключена… всем спасибо за ответы, кое-что новое все-таки узнал.
-
#15
Логи смотреть с консоли через ssh
Май 31, 2022
Elena B.
7хв. читання
Электронная почта — неотъемлемая часть любого проекта или бизнеса. Хотя существует множество платформ для корпоративной почты, включая Hostinger, Zoho Mail и G Suite, вы также можете отправлять письма с помощью PHP. В этом руководстве мы расскажем, как работает отправка email с PHP mail() — встроенной функции, PHPMailer и простым протоколом передачи почты (SMTP).
Функция PHP mail()
Функция PHP mail() вызывает программу Sendmail, обычно настраиваемую системным администратором, которая и позволяет отправлять электронные письма.
Чтобы использовать эту функцию, убедитесь, что ваш хостинг-провайдер позволяет вам вручную управлять службой Sendmail.
Возникли проблемы с отправкой писем? Hostinger предусмотрена функция PHP mail().
Если вы уже являетесь клиентом Hostinger, вы можете включить или отключить эту функцию, войдя в hPanel. Нажмите «Почта» -> «Управление почтовыми сервисами».

Служба Sendmail должна быть включена по умолчанию. Однако рекомендуем перепроверить это в вашей панели управления хостингом.

Создание Тестового Файла PHP Mail
Прежде всего, вам необходимо создать файл для PHP-скрипта и поместить его в каталог public_html, чтобы к нему можно было легко получить доступ через доменное имя.
- В hPanel щёлкните на Файловый менеджер -> Перейдите на страницу Файлового менеджера.
- Создайте новый файл, нажав на иконку «Новый Файл» в верхнем меню. Назовём наш файл testmail.php и завершим процесс создания, нажав кнопку «Создать«.

- Дважды кликните по файлу testmail.php, поскольку мы собираемся редактировать его с помощью функции PHP mail(). Вот пример основных компонентов функции, которые мы будем использовать в этом руководстве. Они будут объяснены более подробно в следующем разделе. Сейчас просто нажмите «Save & Close«, когда закончите редактировать.

- Теперь вы можете отправить электронное письмо, открыв в браузере VashDomen/testmail.php. Не забудьте заменить «VashDomen» на доменное имя, которое вы использовали для создания тестового файла testmail.php.
- Теперь отправка email с PHP должна работать. Письмо должно прийти на почту получателя.

Компоненты PHP mail
Как мы и обещали, сейчас мы более подробно рассмотрим компоненты PHP-скрипта для отправки сообщений. В примере ниже вы увидите базовый синтаксис email, который поможет лучше понять эту функцию.
Однако, если вам нужна дополнительная информация о функции Sendmail и её компонентах, вы можете обратиться к официальной документации PHP.
Вот синтаксис PHP, который мы использовали в предыдущем разделе:
<?php
ini_set( 'display_errors', 1 );
error_reporting( E_ALL );
$from = "test@hostinger-tutorials.com";
$to = "test@hostinger.com";
$subject = "Checking PHP mail";
$message = "PHP mail works just fine";
$headers = "From:" . $from;
mail($to,$subject,$message, $headers);
echo "The email message was sent.";
?>
Теперь давайте рассмотрим каждую его часть отдельно.
ini_set( 'display_errors', 1 ); error_reporting( E_ALL );
Эти первые две строки охватывают отчёты об ошибках. Они сообщат вам, если скрипт не удалось выполнить.
$from = "test@hostinger-tutorials.com";
Эта строка должна содержать адрес электронной почты отправителя. Большинство хостинг-провайдеров не разрешают использовать случайные адреса, так как это может быть использовано с целью спуфинга (англ.) — подделки писем. Всегда указывайте адреса, созданные для вашего доменного имени или бренда, тогда отправка email c PHP mail должна быть успешной.
$to = "test@gmail.com";
Здесь вы вводите адрес электронной почты получателя.
$subject = "Checking PHP mail";
Здесь мы вводим тему письма.
$message = "PHP mail works just fine";
Здесь мы вводим текст сообщения.
$headers = "From:" . $from;
Указывает важную информацию, такую как адрес отправителя.
mail ($to,$subject,$message,$headers);
Эта строка используется при выполнении функции. Оставьте её без изменений.
echo "The email message was sent.";
Сообщение, которое появится в случае успешного выполнения скрипта.
Отправка Писем с PHPMailer
PHPMailer — популярная библиотека отправки почты для PHP. Она поддерживает отправку писем, как через функцию mail(), так и через простой протокол передачи почты (SMTP). Библиотека значительно упрощает сложный процесс отправки писем с помощью PHP, предоставляя набор готовых функций для создания и отправки почты.
Установить PHPMailer довольно просто, особенно если у вас установлен Composer. Если вы используете Hostinger, вам не нужно об этом беспокоиться, поскольку он по умолчанию включен в каждый пакет хостинга.
Однако, если вам нужно установить PHPMailer вручную, тогда подключите свою учётную запись хостинга через терминал SSH. Следуй этой инструкции:
- Загрузите и установите SSH-клиент PuTTY.
- Перейдите в панель управления hPanel, найдите и кликните по «SSH-доступ» в разделе «Расширенные«.
- Обратите внимание на раздел с информацией для SSH-доступа. Вам понадобится SSH IP, порт, имя пользователя и пароль.
- Откройте PuTTY, затем укажите свой SSH IP и порт соответственно.

- Нажмите Open, появится командное окно. Введите своё имя пользователя и пароль SSH. Как только это будет сделано, нажмите Enter.
-
ПРИМЕЧАНИЕ: PuTTY НЕ показывает пароли. Не волнуйтесь, если вы не увидите ваш пароль на экране.
- Выполните следующую команду:
cd public_html
- Нажмите Enter, затем запустите эту команду:
composer require phpmailer/phpmailer
- Подождите, пока процесс установки не будет завершён.

Использование PHPMailer с SMTP Hostinger
Теперь, когда PHPMailer готов к работе, вы можете начать использовать его для отправки почты средствами PHP и через Hostinger SMTP.
- Создайте учётную запись электронной почты, войдя в hPanel. Перейдите в раздел «Почтовые аккаунты» -> «Создать новую учётную запись электронной почты». Введите новый адрес электронной почты и установите пароль, затем нажмите «Создать».

- Когда закончите, обратите внимание на свои данные SMTP, расположенные на той же странице в самом вверху.
ПРИМЕЧАНИЕ. Для того чтобы отправить письмо через PHPMailer, вам нужно знать имя пользователя учётной записи электронной почты, пароль к учётной записи, хост SMTP и порт SMTP.
- Создайте файл testphpmailer.php в Public_html. Откройте панель управления hPanel и щёлкните по Файловому менеджеру -> Перейдите на страницу Файлового менеджера
- Нажмите на иконку «Новый Файл». Назовите файл testphpmailer.php, а затем нажмите кнопку «Создать«.
- Дважды щёлкните по только что созданном файле testphpmailer.php, затем скопируйте и вставьте следующее:
<?php
use PHPMailerPHPMailerPHPMailer;
require 'vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 2;
$mail->Host = 'smtp.hostinger.com';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = 'test@hostinger-tutorials.com';
$mail->Password = 'YOUR PASSWORD HERE';
$mail->setFrom('test@hostinger-tutorials.com', 'Your Name');
$mail->addReplyTo('test@hostinger-tutorials.com', 'Your Name');
$mail->addAddress('example@email.com', 'Receiver Name');
$mail->Subject = 'Testing PHPMailer';
$mail->msgHTML(file_get_contents('message.html'), __DIR__);
$mail->Body = 'This is a plain text message body';
//$mail->addAttachment('test.txt');
if (!$mail->send()) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'The email message was sent.';
}
?>
- Измените приведённый выше код соответствующим образом. Например, вам нужно заменить EMAIL_ACCOUNT_PASSWORD своим паролем электронной почты или test@hostinger-tutorials.com на своё имя пользователя, example@gmail.com на адрес электронной почты получателя и т. д. После этого нажмите «Save & Close».
- Теперь ваш PHPMailer готов к использованию. Запустите скрипт, введя VashDomen.com/testphpmailer.php в браузере.
Компоненты PHPMailer
Чтобы понять, как работает PHPMailer, давайте разберём приведённый выше пример скрипта, который использует SMTP для отправки электронной почты. Вот подробное объяснение каждого компонента:
use PHPMailerPHPMailerPHPMailer;
Эта строка импортирует класс PHPMailer в глобальное пространство имён.
require '../vendor/autoload.php';
Включает различные библиотеки, необходимые PHPMailer.
$mail->
Все похожие переменные содержат важную информацию, такую как сведения о сервере, заголовки сообщений, вложения и многое другое. Короче говоря, они гарантируют, что отправитель защищён аутентификацией SMTP.
if (!$mail->send()) {
Определяет, что происходит при выполнении скриптов.
echo 'Mailer Error: ' . $mail->ErrorInfo;
В случае сбоя отправки скрипта отобразится сообщение об ошибке с пояснением.
} else {
Определяет, что произойдёт, если скрипт будет выполнен.
echo 'The email message was sent!';
Если письмо успешно отправлено, появится это сообщение.
СОВЕТ: строка SMTPDebug = 2; полезна лишь в том случае, если вы тестируете скрипт и хотите увидеть, как он работает. Измените её на SMTPDebug = 0; если вы закончили тест. Таким образом, конечный пользователь не увидит отчёт по SMTP.
Если вы обратили внимание, то, наверняка, заметили, что в этом примере мы делаем что-то немного по-другому. Вместо обычного текста, мы отправляем HTML-сообщение.
Следовательно, содержимое вашего сообщения будет загружаться из файла message.html, расположенного в том же каталоге — public_html.
Этот формат обеспечивает больше функциональности по сравнению с обычными текстовыми сообщениями. HTML предлагает много опций для настройки. Например, вы можете изменить цвет, стиль, изображение или даже включить мультимедийные файлы, которые обычно устаревают в обычном текстовом сообщении.
Контактная Форма PHPMailer
Возможности PHPMailer не ограничиваются только отправкой PHP-почты. Ещё один вариант его применения — создание контактной формы, с помощью которой ваша аудитория сможет с вами связаться.
Вот пример скрипта:
<?php
use PHPMailerPHPMailerPHPMailer;
require 'vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'smtp.hostinger.com';
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->Username = 'test@hostinger-tutorials.com';
$mail->Password = 'EMAIL_ACCOUNT_PASSWORD';
$mail->setFrom('test@hostinger-tutorials.com', 'Mr. Drago');
$mail->addAddress('example@gmail.com', 'Receiver Name');
if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
$mail->Subject = 'PHPMailer contact form';
$mail->isHTML(false);
$mail->Body = <<<EOT
Email: {$_POST['email']}
Name: {$_POST['name']}
Message: {$_POST['message']}
EOT;
if (!$mail->send()) {
$msg = 'Sorry, something went wrong. Please try again later.';
} else {
$msg = 'Message sent! Thanks for contacting us.';
}
} else {
$msg = 'Share it with us!';
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Contact form</title>
</head>
<body>
<h1>Do You Have Anything in Mind?</h1>
<?php if (!empty($msg)) {
echo "<h2>$msg</h2>";
} ?>
<form method="POST">
<label for="name">Name: <input type="text" name="name" id="name"></label><br><br>
<label for="email">Email: <input type="email" name="email" id="email"></label><br><br>
<label for="message">Message: <textarea name="message" id="message" rows="8" cols="20"></textarea></label><br><br>
<input type="submit" value="Send">
</form>
</body>
</html>
Делаем всё то же самое, что и с предыдущими скриптами. Вам нужно создать новый файл в папке public_html. В данном случае мы назвали файл formscript.php. Отредактируйте информацию внутри скрипта соответствующим образом. После этого вам нужно только запустить скрипт из вашего браузера.
Вот как выглядит результат:
Как только ваш клиент отправит форму, он получит подтверждающее сообщение, а содержимое формы будет доставлено вам на почтовый адрес, которое вы должны указать здесь:
$mail->addAddress('example@gmail.com', 'Имя Получателя');
СОВЕТ: если контактная форма PHPMailer не работает, добавьте строку $mail->SMTPDebug = 2;, чтобы узнать, что вызывает проблему. Не забудьте удалить эту строку или поменять 2 на 0, когда закончите.
PHPMailer имеет больше примеров применения, которые вы найдёте в их официальном репозитории GitHub. Кроме того, если вы используете WordPress, вы можете легко создать контактную форму с помощью таких плагинов, как WP Forms, Formidable Form или Gravity Forms.

Устранение Распространённых Ошибок PHP Mail и PHPMailer
Отправка Email с PHP или PHPMailer время от времени может сопровождаться ошибками. Вот список наиболее распространённых проблем и способы их решения.
Адрес Отправителя Отклонён: Не Принадлежит Пользователю
Эта ошибка означает, что серверу не удалось пройти аутентификацию с использованием предоставленных данных.
Чтобы исправить это, проверьте адрес электронной почты, который вы использовали для отправки сообщения, и убедитесь, что он соответствует существующему ящику электронной почты. Если он указывает не на тот почтовый ящик, измените его соответствующим образом. Также убедитесь, что вы включили SPF-запись (англ).
Системе Gmail не Удалось Подтвердить, что Это Письмо Отправлено из Домена VashDomen.com
Если вы увидели это предупреждение при тестировании почтового скрипта PHP, это может означать одно из следующих:
- Ваша SPF-запись не включена. Вы можете найти инструкции по её добавлению здесь (англ.).
- Вы отправили электронное письмо с адреса, который не существует или не принадлежит вам. Убедитесь, что вы используете действительные данные аутентификации SMTP.
Сообщения Попадают в Спам
Есть несколько причин, по которым сообщения PHP могут попадать в спам. Вот некоторые из самых распространённых:
- Тема сообщения, вводящая в заблуждение или похожая на спам. Например, когда вы указываете одно слово: «тест» или «тестирование», «привет», «срочно» или что-то подобное. Убедитесь, что ваша тема чётко отображает суть сообщения.
- Вы используете неправильный адрес отправителя и ваше сообщение отфильтровывается как спам. Такая мера безопасности направлена на борьбу со спуфингом и мошенничеством.
- Вы используете слова, которые работают как триггеры для фильтрации спама. В эту категорию входят такие фразы, как «отличное предложение», «нажмите здесь», «специальная акция», «это не спам» и т. д. Попробуйте изменить содержание сообщения, чтобы проверить, так ли это.
- В вашем списке рассылки нет кнопки «Отписаться от рассылки«. Когда много людей сообщают о ваших письмах как о спаме, вам будет сложно избежать спам-фильтра. Наличие кнопки отказа от подписки — отличный способ предотвратить это и вызвать больше доверия у ваших читателей.
Заключение
Теперь вы знаете, как происходит отправка email с PHP, а также, как использовать PHPMailer для отправки писем с аутентификацией SMTP. Не смотря на то, что в этом руководстве представлены базовые примеры, тот же синтаксис можно использовать в разработке контактной формы и других расширений для вашего сайта.
Для более подробной информации не забудьте посетить страницу проекта PHPMailer. Если у вас есть какие-либо советы, рекомендации или идеи, мы будем рады услышать их в разделе комментариев ниже.
Елена имеет профессиональное техническое образование в области информационных технологий и опыт программирования на разных языках под разные платформы и системы. Более 10 лет посвятила сфере веб, работая с разными CMS, такими как: Drupal, Joomla, Magento и конечно же наиболее популярной в наши дни системой управления контентом – WordPress. Её статьи всегда технически выверены и точны, будь то обзор для WordPress или инструкции по настройке вашего VPS сервера.
Хотя есть части этого ответа, которые применяются только к использованию самой функции mail(), многие из этих шагов устранения неполадок могут быть применены к любой почтовой системе PHP.
Существует множество причин, по которым ваш скрипт не отправляет электронные письма. Трудно диагностировать эти вещи, если нет очевидной синтаксической ошибки. Без этого вам нужно пройти через контрольный список ниже, чтобы найти возможные потенциальные проблемы, с которыми вы можете столкнуться.
Убедитесь, что отчет об ошибках включен и установлен для сообщения обо всех ошибках
Отчеты об ошибках необходимы для устранения ошибок в коде и общих ошибок, с которыми сталкивается PHP. Для получения этих ошибок необходимо включить отчет об ошибках. Размещение следующего кода в верхней части ваших файлов PHP (или в файле главной конфигурации) позволит включить отчет об ошибках.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
См. Этот ответ для получения дополнительной информации об этом.
Убедитесь, что функция mail() вызывается
Это может показаться глупым, но распространенной ошибкой является забыть фактически разместить функцию mail() в вашем коде. Удостоверьтесь, что он есть и не прокомментирован.
Убедитесь, что функция mail() вызывается правильно
bool mail (string $ to, string $ subject, string $ message [, string $ дополнительные_headers [, string $ дополнительные_параметры]])
Функция почты принимает три обязательных параметра и, необязательно, четвертый и пятый. Если ваш вызов на mail() не имеет по крайней мере трех параметров, он не сработает.
Если ваш запрос на mail() не имеет правильных параметров в правильном порядке, он также потерпит неудачу.
Проверка почтовых журналов сервера
Ваш веб-сервер должен регистрировать все попытки отправки электронной почты через него. Расположение этих журналов будет отличаться (вам может потребоваться спросить администратора вашего сервера, где они находятся), но их обычно можно найти в корневом каталоге пользователя в logs. Внутри будут сообщения об ошибках, сообщенные сервером, если таковые имеются, связанные с вашими попытками отправить электронную почту.
Проверка сбоя подключения к порту
Порт-блок — очень распространенная проблема, с которой сталкиваются большинство разработчиков, интегрируя свой код для доставки электронной почты с использованием SMTP. И это можно легко проследить на сервере maillogs (расположение сервера почтового журнала может варьироваться от сервера к серверу, как объяснялось выше). Если вы находитесь на сервере общедоступного хостинга, порты 25 и 587 по умолчанию остаются заблокированными. Этот блок специально предназначен вашим хостинг-провайдером. Это справедливо даже для некоторых выделенных серверов. Когда эти порты заблокированы, попробуйте подключиться с помощью порта 2525. Если вы обнаружите, что порт также заблокирован, единственное решение — связаться с вашим хостинг-провайдером, чтобы разблокировать эти порты.
Большинство хостинг-провайдеров блокируют эти почтовые порты, чтобы защитить свою сеть от отправки любых спам-писем.
Используйте порты 25 или 587 для соединений с обычным /TLS и с портом 465 для соединений SSL. Для большинства пользователей предлагается использовать порт 587, чтобы избежать ограничений по скорости, установленных некоторыми хостинг-провайдерами.
Не используйте оператор подавления ошибок
Когда оператор подавления ошибок @ добавляется к выражению в PHP, любые сообщения об ошибках, которые могут быть сгенерированы этим выражением, будут игнорироваться. Существуют обстоятельства, при которых использование этого оператора необходимо, но отправка почты не является одним из них.
Если ваш код содержит @mail(...) вы можете скрывать важные сообщения об ошибках, которые помогут вам отладить это. Удалите @ и проверьте, не сообщаются ли какие-либо ошибки.
Это целесообразно только после проверки с error_get_last() сразу для конкретных отказов.
Проверьте возвращаемое значение mail()
Функция mail():
Возвращает
TRUEесли почта была успешно принята к доставке, в противном случаеFALSE. Важно отметить, что только потому, что почта была принята для доставки, это НЕ означает, что почта действительно достигнет предполагаемого адресата.
Это важно отметить, потому что:
- Если вы получили возвращаемое значение
FALSEвы знаете, что ошибка заключается в том, что ваш сервер принимает вашу почту. Вероятно, это не проблема с кодировкой, а проблема конфигурации сервера. Вам нужно поговорить с вашим системным администратором, чтобы узнать, почему это происходит. - Если вы получите
TRUEвозвращаемое значение, это не означает, что ваш адрес электронной почты определенно будет отправлен. Это просто означает, что письмо было отправлено на соответствующий обработчик на сервере с помощью PHP. Есть еще больше проблем с ошибкой вне контроля PHP, которые могут привести к тому, что письмо не будет отправлено.
Таким образом, FALSE поможет указать вам в правильном направлении, тогда как TRUE не обязательно означает, что ваша электронная почта была успешно отправлена. Это важно отметить!
Убедитесь, что ваш хостинг-провайдер позволяет отправлять электронные письма и не ограничивает отправку почты
Многие общие веб-хосты, особенно бесплатные провайдеры веб-хостинга, не позволяют отправлять электронные письма со своих серверов или ограничивать количество, которое может быть отправлено в течение любого заданного периода времени. Это связано с их усилиями по ограничению спамеров от использования их более дешевых услуг.
Если вы считаете, что ваш хост имеет ограничения по электронной почте или блокирует отправку электронных писем, проверьте их часто задаваемые вопросы, чтобы узнать, перечисляют ли они такие ограничения. В противном случае вам может потребоваться обратиться к их поддержке, чтобы проверить, существуют ли какие-либо ограничения в отношении отправки электронных писем.
Проверьте папки спама; предотвращать помехи от сообщений электронной почты как спам
Зачастую по различным причинам электронные письма, отправленные через PHP (и другие языки программирования на стороне сервера), попадают в папку спама получателя. Всегда проверяйте их перед тем, как устранить неисправность вашего кода.
Чтобы избежать отправки почты, отправленной через PHP, в папку спама-получателя, вы можете делать различные действия, как в вашем PHP-коде, так и в других целях, чтобы минимизировать вероятность того, что ваши письма будут помечены как спам. Хорошие советы от Michiel de Mare включают:
- Используйте методы проверки подлинности электронной почты, такие как SPF и DKIM, чтобы доказать, что ваши электронные письма и ваше доменное имя принадлежат друг другу, и для предотвращения подмены имени домена. На веб-сайте SPF есть мастер для создания DNS-информации для вашего сайта.
- Проверьте обратный DNS, чтобы убедиться, что IP-адрес вашего почтового сервера указывает на имя домена, которое вы используете для отправки почты.
- Убедитесь, что IP-адрес, который вы используете, не включен в черный список
- Убедитесь, что адрес ответа — это действительный существующий адрес.
- Используйте полное, настоящее имя адресата в поле Кому, а не только адрес электронной почты (например,
"John Smith" <[email protected]>).- Контролируйте свои учетные записи о злоупотреблениях, такие как [email protected] и [email protected] Это означает — убедитесь, что эти учетные записи существуют, читайте, что им прислали, и поступайте по жалобам.
- Наконец, очень легко отказаться от подписки. В противном случае ваши пользователи откажутся от подписки, нажав кнопку спама, и это повлияет на вашу репутацию.
См. Как вы уверены, что адрес электронной почты, который вы отправляете программно, автоматически не помечен как спам? для получения дополнительной информации по этой теме.
Убедитесь, что все почтовые заголовки поставлены
Некоторые спам-программы отклонят почту, если отсутствуют общие заголовки, такие как «От» и «Ответ на»:
$headers = array("From: [email protected]",
"Reply-To: [email protected]",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("rn", $headers);
mail($to, $subject, $message, $headers);
Убедитесь, что заголовки сообщений не имеют синтаксических ошибок
Недопустимые заголовки так же плохи, как отсутствие заголовков. Одним из неправильных символов может быть все, что нужно, чтобы сорвать вашу электронную почту. Выполните двойную проверку, чтобы убедиться, что ваш синтаксис верен, поскольку PHP не поймает эти ошибки для вас.
$headers = array("From [email protected]", // missing colon
"Reply To: [email protected]", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Убедитесь, что значение получателя правильно
Иногда проблема такая же простая, как неправильное значение для получателя сообщения электронной почты. Это может быть связано с использованием неправильной переменной.
$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Другой способ проверить это — записать код получателя в вызов функции mail():
mail('[email protected]', $subject, $message, $headers);
Это может применяться ко всем параметрам mail().
Отправить на несколько аккаунтов
Чтобы устранить проблемы с электронной почтой, отправьте свое электронное письмо на несколько учетных записей электронной почты у разных поставщиков электронной почты. Если ваши электронные письма не поступают в учетную запись пользователя Gmail, отправьте те же письма на учетную запись Yahoo, учетную запись Hotmail и обычную учетную запись POP3 (например, вашу учетную запись электронной почты, предоставленную поставщиком услуг Интернета).
Если электронные письма поступают на все или другие учетные записи электронной почты, вы знаете, что ваш код отправляет электронные письма, но, скорее всего, поставщик электронной почты блокирует их по какой-либо причине. Если письмо не приходит ни на одну учетную запись электронной почты, проблема скорее связана с вашим кодом.
Убедитесь, что код соответствует методу формы
Если вы установили метод формы в POST, убедитесь, что вы используете $_POST для поиска значений формы. Если вы установили его в GET или не установили его вообще, убедитесь, что вы используете $_GET для поиска значений формы.
Убедитесь, что значение action формы указывает на правильное местоположение
Убедитесь, что атрибут action формы содержит значение, указывающее на ваш почтовый код PHP.
<form action="send_email.php" method="POST">
Убедитесь, что веб-хост поддерживает отправку электронной почты
Некоторые веб-хостинг-провайдеры не разрешают или не позволяют отправлять электронные письма через свои серверы. Причины этого могут различаться, но если они отключили отправку почты, вам нужно будет использовать альтернативный метод, который использует стороннюю компанию для отправки этих электронных писем для вас.
Электронная почта к их технической поддержке (после поездки к их онлайн-поддержке или FAQ) должна уточнить, доступны ли возможности электронной почты на вашем сервере.
Убедитесь, что почтовый сервер localhost настроен
Если вы работаете на своей локальной рабочей станции с помощью WAMP, MAMP или XAMPP, сервер электронной почты, вероятно, не установлен на вашей рабочей станции. Без него PHP не может отправлять почту по умолчанию.
Вы можете преодолеть это, установив базовый почтовый сервер. Для Windows вы можете использовать бесплатную Mercury Mail.
Вы также можете использовать SMTP для отправки своих писем. Посмотрите на этот отличный ответ от Викаса Дувиди, чтобы узнать, как это сделать.
Включить собственный пользовательский mail.log
В дополнение к файлу журнала MTA и PHP вы можете включить ведение журнала для функции mail(). Он не записывает полное взаимодействие с SMTP, но, по крайней мере, выполняет функции вызова и сценарий вызова.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Подробнее см. Http://php.net/manual/en/mail.configuration.php. (Лучше всего включить эти опции в возможностях php.ini или .user.ini или .htaccess.)
Проверьте с помощью службы проверки почты
Существуют различные службы проверки доставки и спама, которые вы можете использовать для тестирования вашей настройки MTA/webserver. Обычно вы отправляете почтовый пробник To: их адрес, затем получаете отчет о доставке и более конкретные отказы или анализы позже:
- mail-tester.com (бесплатный/простой)
- glockapps.com (бесплатно/$$$)
- senforensics.com (регистрация/$$$)
- mailtrap.io (pro/$$$)
- ultratools/…/emailTest (только для проверки /MX)
- Различные: http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
Использовать другую почтовую программу
Функция PHP, встроенная в функцию mail() удобна и часто выполняет свою работу, но имеет свои недостатки. К счастью, есть альтернативы, которые предлагают больше возможностей и гибкости, включая решение многих проблем, описанных выше:
- Наиболее популярным является: PHPMailer
- Точно так же: SwiftMailer
- Или даже старшая PEAR :: Mail.
Все они могут быть объединены с профессиональным SMTP-сервером/поставщиком услуг. (Поскольку типичные общие 15/15 общие планы веб-хостинга поражают или пропускают, когда дело доходит до настройки/настройки электронной почты).

