Хотите правильно настроить отправку почты с Вашего сайта? Письма, отправляемые с помощью PHP-функции mail() не приходят? Давно пора использовать SMTP крупных сервисов типа Яндекса, Google или Mail.ru. И речь в данной статье идёт не про рассылку сообщений кому-либо. Мы говорим о нормальной работе форм обратной связи на нашем сайте. Я многократно сталкивался с ситуацией, когда владельцы сайта попросту не получали заявки от клиентов по той простой причине, что все заявки (работавшие через функцию mail()) просто отправлялись в спам!
И в данной статье я расскажу, как, используя Swift Mailer, настроить отправку писем.
После настройки Вам понадобится указать данные для входа в Ваш почтовый ящик. К примеру, так:
$transport = (new Swift_SmtpTransport('smtp.yandex.ru', 465))
->setUsername('имя_пользователя')
->setPassword('пароль_пользователя')
->setEncryption('SSL')
;
И отправка почты будет работать! Всё гениальное просто :)
Swift Mailer требует PHP 7.0 или выше. Также, обязательно должны быть включены функции proc_* (proc_get_status, proc_open, proc_close, proc_terminate и proc_nice). Если данные функции у нас выключены - включаем их обратно. В случае, если у Вас стандартный хостинг - обратитесь в техподдержку. В случае, если у Вас свой сервер, откройте php.ini и проверьте, чтобы в строке, где указаны disable_functions не были указаны данные функции. Если указаны - удаляем их из данной строки.
Также Swift Mailer не работает, когда mbstring.func_overload имеет значение 2.
Для установки Swift Mailer нам понадобится SSH доступ к серверу, права на установку, прямые руки и Сomposer. Даже если у Вас стандартный хостинг, установка также возможна. Composer обычно уже стоит на многих современных хостингах, а если нет, то обычно включается после обращения в техподдержку.
Если у Вас есть root-доступ и Сomposer не установлен, то он устанавливается с помощью этих команд:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'baf1608c33254d00611ac1705c1d9958c817a1a33bce370c0595974b342601bd80b92a3f46067da89e3b06bff421f182') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
Итак, начинаем установку Swift Mailer
❶Подключаемся к серверу по SSH. Выполняем команду:
composer require "swiftmailer/swiftmailer:^6.0"
При возникновении каких-либо ошибок - фиксим их. Если ошибок нет - продолжаем дальше.
❷Теперь нам нужно создать файл (давайте назовём его mail_settings.php) с настройками нашего почтового сервера. Файл рекомендую расположить выше уровня Вашего сайта. Т.е. таким образом, чтобы он не лежал в папке с Вашим сайтом. Содержимое файла:
<?php
require_once '/путь_на_папку_внутри_которой_установлен_composer/vendor/autoload.php';
// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.yandex.ru', 465))
->setUsername('имя_пользователя_без_знака_@_и_домена')
->setPassword('пароль_пользователя')
->setEncryption('SSL')
;
// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);
❸Теперь создаём файл, который будет обрабатывать Вашу форму обратной связи. В него через функцию require_once включаем наш файл с настройками почтового сервера. Пример содержимого файла:
<?php
require_once 'путь_на_файл_с_настройками_почтового_сервера';
// здесь указываем адрес администратора, который получит заявку с сайта
// если получателей несколько, указываем в формате: ['receiver@domain.org', 'other@domain.org' => 'A NAME']
// (там где 'A NAME' пишем любое имя, это ни на что не влияет)
$to = ['email_адрес_администратора' => 'ADMIN'];
// здесь указываем почтовый ящик, с помощью которого мы отсылаем почту
// имя пользователя для этого ящика мы указывали с Вами в файле с конфигурацией
$from = 'ваш_логин@домен_почтового_сервера_например_yandex.ru';
// допустим, наша форма связи получает данные с формы, в которой заполняются имя, телефон, e-mail
$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
$tel = filter_var($_POST['tel'], FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
// формируем тело письма для отправки администратору сайта
$adminText = <<<MESS
<b>Имя клиента</b>: {$name}<br>
<b>Телефон</b>: {$tel}<br>
<b>E-mail</b>: {$email}<br>
MESS;
// формируем тело письма для отправки клиенту, что его заявка получена
$clientText = <<<MESS
<b>{$name}</b>, Ваша заявка принята в работу<br>
Ожидайте звонок на номер телефона <b>{$tel}</b><br>
Ожидайте письмо на e-mail: <b>{$email}</b><br>
MESS;
// готовим отправку письма для администратора сайта
$messageToAdmin = (new Swift_Message("Заказ на обратный звонок"))
->setFrom([$from => $from])
->setTo($to)
->setBody($adminText, 'text/html')
;
// готовим отправку письма для клиента
$messageToClient = (new Swift_Message("Ваш заказ принят в работу"))
->setFrom([$from => $from])
->setTo([$email => $name])
->setBody($clientText, 'text/html')
;
// отправляем письмо администратору сайта и записываем результат в переменную $result
$result = $mailer->send($messageToAdmin);
// отправляем письмо клиенту
$mailer->send($messageToClient);
if($result === 1) { // если всё хорошо и письмо было отправлено
echo '<h1>Спасибо! Ваша заявка была успешно отправлена! Ожидайте обратную связь по указанным контактным данным.</h1>';
}
else { // если произошла ошибка и письмо не было отправлено
echo '<h1>Произошла ошибка при отправке сообщения. Пожалуйста, свяжитесь с нами по телефону.</h1>';
}
Удачного использования!
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
Web development blog!