Отправка электронных писем с помощью PHPMailer
В этой статье мы расскажем, почему стоит использовать библиотеку PHPMailer вместо функции mail(). А также продемонстрируем несколько примеров использования этой библиотеки.
Является ли она альтернативой PHP-функции mail()?
PHP-разработчики ненавидят создавать строки $headers при отправке электронных писем, используя функцию mail(). Библиотека PHPMailer позволяет делать это без экранирования символов, форматирования вложений и электронных писем.
Функция mail() требует, чтобы электронные письма отправлял локальный почтовый сервер. Библиотека PHPMailer может использовать нелокальный почтовый сервер.
Дополнительные преимущества библиотеки:
- Вывод сообщений об ошибках на более чем 40 языках.
- Встроенная поддержка протокола SMTP и аутентификации по протоколам SSL и TLS.
- Отправка альтернативной текстовой версии письма, отличной от HTML.
- Активное сообщество разработчиков, которое поддерживает ее безопасность и актуальность.
Установка библиотеки PHPMailer
Вы можете установить библиотеку PHPMailer с помощью Composer:
composer require phpmailer/phpmailer
Отправка электронной почты с локального сервера с помощью PHPMailer
Ниже приведен простой пример отправки электронного письма с локального веб-сервера с помощью библиотеки PHPMailer.
<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
require_once "vendor/autoload.php";
// Объект PHPMailer
$mail = new PHPMailer(true); //Аргумент true в конструкторе включает исключения
//Адрес и имя отправителя
$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";
// Адрес и имя получателя
$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); //Recipient name is optional
//Адрес, на который получатель может ответить
$mail->addReplyTo("reply@yourdomain.com", "Reply");
//CC и BCC
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");
//Отправляем HTML и текстовое электронное письмо
$mail->isHTML(true);
$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";
try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
Отправка письма с вложениями
Ниже приведен пример того, как отправить электронное письмо с вложениями, используя библиотеку PHPMailer.
<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
require_once "vendor/autoload.php";
$mail = new PHPMailer;
$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";
$mail->addAddress("recipient1@example.com", "Recipient Name");
//Указываем путь и имя файла вложения
$mail->addAttachment("file.txt", "File.txt");
$mail->addAttachment("images/profile.png"); //Имя файла необязательно
$mail->isHTML(true);
$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";
try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
В этом примере мы прикрепляем к письму file.txt, который находится в том же каталоге, что и скрипт. А также изображение profile.png, которое находится в каталоге images.
Чтобы добавить вложения в электронное письмо, нужно вызвать функцию addAttachmentобъекта PHPMailer и передать ей в качестве аргумента путь к файлу.
Отладка
В приведенных выше примерах мы использовали для отладки класс Exception. Мы также добавили аргумент true в конструктор PHPMailer, чтобы вывести исключения более высокого уровня.
Самая частая ошибка, которую мы увидим, будет связана с запуском функции mail() в фоновом режиме:
Mailer Error: Could not instantiate mail function.
Если нужно получить больше информации об ошибке, можно добавить в оператор catch следующий код:
print_r(error_get_last());
Самая частая проблема с PHP-функцией mail() связана с отсутствием настройки почтового сервера. В этом случае функция error_get_last возвращает следующий результат:
Array (
[type] => 2
[message] => mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
[file] => OUR_PATH vendorphpmailerphpmailersrcPHPMailer.php
[line] => 863
)
Эту проблему можно решить, используя SMTP.
Отображение локализованных сообщений об ошибках
$mail->ErrorInfo может возвращать сообщения об ошибках на 43 языках. Чтобы вывести сообщения на другом языке, скопируйте каталог language из исходного кода библиотеки PHPMailer в каталог проекта.
Например, установите для объекта PHPMailer русский язык с помощью вызова приведенного ниже метода:
$mail->setLanguage("ru");
Использование SMTP
Чтобы использовать для отправки электронной почты почтовый сервер другого хоста, нужно пройти аутентификацию. Например, чтобы отправить электронное письмо с почтового сервера Gmail, необходимо иметь учетную запись в этом сервисе.
Протокол SMTP используется почтовыми клиентами для отправки запроса на доставку писем на почтовый сервер. Как только почтовый сервер проверит email, он отправит ее на целевой адрес.
Ниже приведен пример отправки электронного письма из Gmail с вашего домена. При этом не требуется локальный почтовый сервер для запуска кода. Он использует протокол SMTP.
<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
use PHPMailerPHPMailerException;
require_once "vendor/autoload.php";
$mail = new PHPMailer(true);
//Включаем отладку SMTP.
$mail->SMTPDebug = 3;
//Задаем для PHPMailer использование SMTP.
$mail->isSMTP();
//Задаем имя хоста SMTP
$mail->Host = "smtp.gmail.com";
//Устанавливаем true, если хост SMTP требует аутентификации для отправки почты
$mail->SMTPAuth = true;
//Предоставляем логин пользователя и пароль
$mail->Username = "name@gmail.com";
$mail->Password = "super_secret_password";
//Если SMTP требует TLS-шифрования, тогда задаем его
$mail->SMTPSecure = "tls";
//Устанавливаем порт TCP для подключения
$mail->Port = 587;
$mail->From = "name@gmail.com";
$mail->FromName = "Full Name";
$mail->addAddress("name@example.com", "Recepient Name");
$mail->isHTML(true);
$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";
try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
Использование Gmail требует TLS-шифрования через SMTP, поэтому мы установили его. Затем необходимо указать имя хоста, номер порта, тип шифрования. Для аутентификации также понадобятся логин пользователя и пароль.
Применение удаленного SMTP позволяет использовать для отправки электронной почты PHP-функцию mail() с адресом домена from с любым значением, кроме имени локального домена (имени сервера). Иначе фильтры на почтовом сервере получателя пометят письмо спам.
Например, при отправке письма с сервера с действительным именем хоста example.comс адресом from name@gmail.com на name@yahoo.com серверы Yahoo пометят его как спам.
Получение электронной почты с использованием POP3
Библиотека PHPMailer также позволяет отправлять электронные письма с проверкой POP-before-SMTP. Другими словами, вы сможете аутентифицироваться с помощью протокола POP3 и отправлять электронную почту, используя SMTP. К сожалению, библиотека PHPMailer не поддерживает получение писем с почтовых серверов по протоколу POP3. Ее возможности ограничены только отправкой электронной почты.
Заключение
Для программной отправки писем можно использовать специализированные сторонние сервисы, такие как Mandrill или SendGrid. Но лучше всего делать это с помощью PHPMailer и ее альтернатив (Zend Mail, Swift Mailer и т. д.).
Вы можете узнать об API этой библиотеки в вики-репозитории или из официальной документации.