Отправка писем через SMTP Яндекса, Google, Mail, используя Swift Mailer


13-12-2019
Денис Л.
Php
4
224
Отправка писем через SMTP Яндекса, Google, Mail, используя Swift Mailer

Хотите правильно настроить отправку почты с Вашего сайта? Письма, отправляемые с помощью 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!

Читайте также:

Форма на PHP с безопасной загрузкой файлов на сервер

PHP скрипт, определяющий сколько лет организации

Ставим надёжную защиту от спама на сайте своими силами