Как отправлять письма при помощи PHPMailer через SMTP

С целью борьбы со спамом многие хостеры накладывают ограничение на использование стандартной функции PHP mail():

  • Ограничивают количество отправляемых писем (в день, в час, ваш вариант)
  • Требуют наличия почтового ящика у себя (раз отправляете от нашего имени, тогда храните почту у нас)
  • Или попросту рекомендуют использовать внешний SMTP сервер

Внешние SMTP сервера бывают разные, на мой взгляд удобнее всего работать с Gmail.

Для работы используем PHPMailer — полнофункциональный класс создания и передачи электронной почты для PHP.

PHPMailer намного удобнее стандартной функции PHP mail(), позволяет легко создавать HTML письма, прикладывать файлы к письмам, в итоге упрощает задачи по отправке почты.

Скачиваем PHPMailer, распаковываем и удобно именуем:

wget https://github.com/PHPMailer/PHPMailer/archive/master.zip
unzip master.zip
mv PHPMailer-master PHPMailer

А потом создаем скрипт:


<?php
// Импортируем классы PHPMailer в глобальное пространство имен
// Эти строки должны быть вначале скрипта, не внутри функции
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);        // "true" включает работу исключений (exceptions)
try {
    //Настройки сервера
    $mail->SMTPDebug = 2;        // "2" включает подробный вывод отладки. Отключить - "0"
    $mail->isSMTP();        // Включаем SMTP
    $mail->Host = 'smtp.gmail.com';        // задаем адрес SMTP сервера
    $mail->SMTPAuth = true;        // Включаем SMTP аутентификацию
    $mail->Username = '[email protected]';        // имя пользователя
    $mail->Password = 'gm41lp4$$w0rd';        // Пароль (https://myaccount.google.com/apppasswords)
    $mail->SMTPSecure = 'ssl';        // Включаем SSL шифрование (или можно TLS для порта 587)
    $mail->Port = 465;        // Порт для подключения

    //Задаем получателей
    $mail->setFrom('[email protected]', 'SMTP Mailer');        //Задаем адрес и имя отправителя
    $mail->addAddress('[email protected]', 'Gmail User');        // И адрес и имя получателя
    //$mail->addAddress('[email protected]');        // Имя не обязательно
    //$mail->addReplyTo('[email protected]', 'Info');        // Сюда будут приходить ответы
    //$mail->addCC('[email protected]');        // копия
    //$mail->addBCC('[email protected]');        //скрытая копия

    //Приложения
    //$mail->addAttachment('/var/tmp/file.tar.gz');        // Приложить файл
    //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');        // Задать файлу имя

    //Содержание
    $mail->CharSet = 'UTF-8';        // Задаем кодировку, иначе письмо будет нечитабельным
    $mail->isHTML(true);        // Задаем HTML формат письма
    $mail->Subject = 'Здесь будет тема письма';
    $mail->Body    = 'Здесь будет текст письма <b>в формате HTML</b>';
    //$mail->AltBody = 'Здесь будет обычный текст письма для раритетных не-HTML клиентов.';

    $mail->send();
    echo 'Сообщение было отправлено';
} catch (Exception $e) {
    echo 'Сообщение не отправлено.';
    echo 'Ошибка: ' . $mail->ErrorInfo;
}
?>

При включенной двухэтапной аутентификации, следует создать пароль для приложения здесь: https://myaccount.google.com/apppasswords