Статьи

Отправка писем в PHP с PHPMailer

Управляйте своими библиотеками PHP с помощью Composer. Посмотрите наш скринкаст « Зависимости от PHP — это просто» с помощью Composer, чтобы узнать, как это сделать.

PHPMailer является одной из самых популярных библиотек PHP с открытым исходным кодом для отправки писем. Впервые он был выпущен еще в 2001 году, и с тех пор он стал любимым способом программной отправки писем PHP-разработчиком, помимо нескольких других фаворитов, таких как Swiftmailer .

Emails flying stock picture

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

Является ли это альтернативой функции PHP mail() ?

В большинстве случаев это альтернатива PHP-функции mail() , но во многих других случаях функция mail() просто недостаточно гибкая для достижения того, что вам нужно.

Прежде всего, PHPMailer предоставляет объектно-ориентированный интерфейс, тогда как mail() не является объектно-ориентированным. Разработчики PHP, как правило, ненавидят создавать строки $headers при отправке электронных писем с помощью функции mail() потому что они требуют много экранирования — PHPMailer делает это проще простого. Разработчикам также необходимо написать грязный код (экранирование символов, кодирование и форматирование) для отправки вложений и электронных писем на основе HTML при использовании функции mail() тогда как PHPMailer делает это безболезненным.

Кроме того, функция mail() требует, чтобы локальный почтовый сервер отправлял электронные письма. PHPMailer может использовать нелокальный почтовый сервер (SMTP), если у вас есть аутентификация.

Дополнительные преимущества включают в себя:

  • Он может печатать различные виды сообщений об ошибках на более чем 40 языках, когда не удается отправить электронное письмо
  • Интегрированная поддержка протокола SMTP и аутентификация по SSL и TLS
  • Может отправлять альтернативную текстовую версию электронной почты для почтовых клиентов без HTML
  • Очень активное сообщество разработчиков, которое обеспечивает его безопасность и актуальность

PHPMailer также используется популярными системами управления контентом PHP, такими как WordPress, Drupal, Joomla и т. Д.

Установка PHPMailer

Вы можете установить PHPMailer с помощью Composer:

 composer require phpmailer/phpmailer 

Отправка электронной почты с локального веб-сервера с помощью PHPMailer

Вот самый простой пример отправки электронной почты с локального веб-сервера с использованием PHPMailer

 <?php require_once "vendor/autoload.php"; //PHPMailer Object $mail = new PHPMailer; //From email address and name $mail->From = "[email protected]"; $mail->FromName = "Full Name"; //To address and name $mail->addAddress("[email protected]", "Recepient Name"); $mail->addAddress("[email protected]"); //Recipient name is optional //Address to which recipient will reply $mail->addReplyTo("[email protected]", "Reply"); //CC and BCC $mail->addCC("[email protected]"); $mail->addBCC("[email protected]"); //Send HTML or Plain Text email $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"; if(!$mail->send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent successfully"; } 

Код и комментарии должны быть достаточно четкими, чтобы объяснить все, что происходит.

Отправка электронного письма с вложениями

Давайте рассмотрим пример того, как отправить письмо с вложениями, используя PHPMailer.

 <?php require_once "vendor/autoload.php"; $mail = new PHPMailer; $mail->From = "[email protected]"; $mail->FromName = "Full Name"; $mail->addAddress("[email protected]", "Recipient Name"); //Provide file path and name of the attachments $mail->addAttachment("file.txt", "File.txt"); $mail->addAttachment("images/profile.png"); //Filename is optional $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"; if(!$mail->send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent successfully"; } 

Здесь мы прилагаем два файла, т.е. file.txt который находится в том же каталоге, что и скрипт, и images/profile.png который находится в каталоге images каталога скрипта.

Чтобы добавить вложения в электронное письмо, нам просто нужно вызвать функцию addAttachment объекта PHPMailer, передав путь к файлу в качестве аргумента. Для прикрепления нескольких файлов нам нужно вызывать его несколько раз.

Использование SMTP

Вы можете использовать почтовый сервер другого хоста для отправки электронной почты, но для этого сначала нужно пройти аутентификацию. Например: чтобы отправить электронное письмо с почтового сервера Gmail, вам необходимо иметь учетную запись Gmail.

SMTP — это протокол, используемый почтовыми клиентами для отправки запроса на отправку электронной почты на почтовый сервер. Когда почтовый сервер проверяет электронную почту, он отправляет ее на почтовый сервер назначения.

Вот пример отправки электронной почты с почтового сервера Gmail с вашего домена. Вам не нужен локальный почтовый сервер для запуска кода. Мы будем использовать протокол SMTP:

 <?php require_once "vendor/autoload.php"; $mail = new PHPMailer; //Enable SMTP debugging. $mail->SMTPDebug = 3; //Set PHPMailer to use SMTP. $mail->isSMTP(); //Set SMTP host name $mail->Host = "smtp.gmail.com"; //Set this to true if SMTP host requires authentication to send email $mail->SMTPAuth = true; //Provide username and password $mail->Username = "[email protected]"; $mail->Password = "super_secret_password"; //If SMTP requires TLS encryption then set it $mail->SMTPSecure = "tls"; //Set TCP port to connect to $mail->Port = 587; $mail->From = "[email protected]"; $mail->FromName = "Full Name"; $mail->addAddress("[email protected]", "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"; if(!$mail->send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent successfully"; } 

Gmail требует шифрования TLS через SMTP, поэтому мы установили его соответствующим образом. Прежде чем отправлять через SMTP, вам необходимо выяснить имя хоста, номер порта, тип шифрования, если требуется, и если требуется аутентификация, вам также понадобятся имя пользователя и пароль. Обратите внимание, что при включении двухфакторной аутентификации в Gmail вы не сможете использовать их SMTP с именем пользователя / паролем — вместо этого потребуется дополнительная настройка .

Одним из больших преимуществ использования удаленного SMTP перед локальной почтой является то, что если вы используете функцию PHP mail() для отправки электронной почты с адресом домена from отличным от имени локального домена (имя сервера), то атака сервера электронной почты получателя фильтры пометят его как спам. Например, если вы отправите электронное письмо с сервера с фактическим именем хоста example.com с адресом from [email protected] на [email protected] , то серверы Yahoo [email protected] его как спам или отобразят сообщение для пользователя, который не доверять электронной почте, потому что источником почты является example.com и все же она выглядит так, как будто она пришла с gmail.com . Хотя у вас есть [email protected] , у Yahoo нет способа узнать это.

Получение электронной почты с использованием POP3

PHPMailer также позволяет отправлять электронные письма с проверкой POP-before-SMTP . Другими словами, вы можете аутентифицироваться с помощью POP и отправлять электронную почту с помощью SMTP. К сожалению, PHPMailer не поддерживает получение электронной почты с почтовых серверов по протоколу POP3. Это ограничено только отправкой электронной почты.

Отображение локализованных сообщений об ошибках

$mail->ErrorInfo может возвращать сообщения об ошибках на 43 разных языках.

Чтобы отобразить сообщения об ошибках на другом языке, скопируйте language каталог из исходного кода PHPMailer в каталог проекта.

Чтобы вернуть сообщения об ошибках, например, на русском языке, установите объект PHPMailer на русский язык с помощью вызова метода ниже:

 $mail->setLanguage("ru"); 

Вы также можете добавить свои языковые файлы в language каталог.

Вывод

Если вы являетесь разработчиком PHP, у вас мало шансов избежать программной отправки электронных писем. В то время как вы можете выбрать сторонние сервисы, такие как Mandrill или Sendgrid, иногда это просто не вариант, а сворачивание вашей собственной библиотеки отправки электронной почты еще меньше. Вот где приходит PHPMailer и его альтернативы (Zend Mail, Swiftmailer и т. Д.).

Вы можете узнать об API этой библиотеки в официальной документации . Вы используете PHPMailer? Или вы предпочитаете полностью удаленные решения на основе API? Дайте нам знать об этом в комментариях!

Вы увязли в зависимости от библиотек PHP? Посмотрите наш скринкаст и узнайте, как Composer может помочь вам в этом.