Как прикрепить файл phpmailer
В этой статье мы расскажем, почему стоит использовать библиотеку PHPMailer вместо функции mail(). А также продемонстрируем несколько примеров использования этой библиотеки.
Является ли она альтернативой PHP-функции mail()?
PHP-разработчики ненавидят создавать строки $headers при отправке электронных писем, используя функцию mail(). Библиотека PHPMailer позволяет делать это без экранирования символов, форматирования вложений и электронных писем.
Функция mail() требует, чтобы электронные письма отправлял локальный почтовый сервер. Библиотека PHPMailer может использовать нелокальный почтовый сервер.
Дополнительные преимущества библиотеки:
Установка библиотеки PHPMailer
Вы можете установить библиотеку PHPMailer с помощью Composer:
Отправка электронной почты с локального сервера с помощью PHPMailer
Ниже приведен простой пример отправки электронного письма с локального веб-сервера с помощью библиотеки PHPMailer.
Отправка письма с вложениями
В этом примере мы прикрепляем к письму file.txt, который находится в том же каталоге, что и скрипт. А также изображение profile.jpg, которое находится в каталоге images.
Чтобы добавить вложения в электронное письмо, нужно вызвать функцию addAttachmentобъекта PHPMailer и передать ей в качестве аргумента путь к файлу.
Отладка
В приведенных выше примерах мы использовали для отладки класс Exception . Мы также добавили аргумент true в конструктор PHPMailer , чтобы вывести исключения более высокого уровня.
Самая частая ошибка, которую мы увидим, будет связана с запуском функции mail() в фоновом режиме:
Mailer Error: Could not instantiate mail function.
Если нужно получить больше информации об ошибке, можно добавить в оператор catch следующий код:
Самая частая проблема с PHP-функцией mail() связана с отсутствием настройки почтового сервера. В этом случае функция error_get_last возвращает следующий результат:
Эту проблему можно решить, используя SMTP.
Например, установите для объекта PHPMailer русский язык с помощью вызова приведенного ниже метода:
Использование SMTP
Протокол SMTP используется почтовыми клиентами для отправки запроса на доставку писем на почтовый сервер. Как только почтовый сервер проверит email, он отправит ее на целевой адрес.
Ниже приведен пример отправки электронного письма из Gmail с вашего домена. При этом не требуется локальный почтовый сервер для запуска кода. Он использует протокол SMTP.
Использование Gmail требует TLS-шифрования через SMTP, поэтому мы установили его. Затем необходимо указать имя хоста, номер порта, тип шифрования. Для аутентификации также понадобятся логин пользователя и пароль.
Применение удаленного SMTP позволяет использовать для отправки электронной почты PHP-функцию mail() с адресом домена from с любым значением, кроме имени локального домена (имени сервера). Иначе фильтры на почтовом сервере получателя пометят письмо спам.
Получение электронной почты с использованием POP3
Библиотека PHPMailer также позволяет отправлять электронные письма с проверкой POP-before-SMTP . Другими словами, вы сможете аутентифицироваться с помощью протокола POP3 и отправлять электронную почту, используя SMTP. К сожалению, библиотека PHPMailer не поддерживает получение писем с почтовых серверов по протоколу POP3. Ее возможности ограничены только отправкой электронной почты.
Заключение
Для программной отправки писем можно использовать специализированные сторонние сервисы, такие как Mandrill или SendGrid. Но лучше всего делать это с помощью PHPMailer и ее альтернатив (Zend Mail, Swift Mailer и т. д.).
Вы можете узнать об API этой библиотеки в вики-репозитории или из официальной документации .
Пожалуйста, опубликуйте ваши мнения по текущей теме материала. За комментарии, подписки, отклики, дизлайки, лайки низкий вам поклон!
Для начала разберу пару простых примеров, чтобы было понятно, как отправлять письма с помощью PHPMailer.
Отправка писем через функцию mail() с помощью PHPMailer
Если вы хотите отправлять письма со своего хостинга через свой почтовый сервер, то всё довольно просто и будет выглядеть примерно так:
Как видим, всё довольно просто: подключаем библиотеку, заполняем от кого, кому, тему и текст письма и отправляем. Отправка писем таким способом будет работать только с почтовых адресов вашего домена (если только они не привязаны к другим почтовикам).
Отправка писем через SMTP с помощью PHPMailer на примере Yandex и Google
Дальше в php-программе отправка писем через PHPMailer происходит аналогично как через yandex, нужно только заменить настройки SMTP так:
Отправка письма с вложением с помощью PHPMailer
Здесь всё довольно просто, нужно лишь использовать метод addAttachment. Приведу пример, заодно продемонстрировав еще несколько дополнительных возможностей:
Адресов получателей можно добавить несколько с помощью addAddress. Или, если необходимо, можно наоборот, очистить все адреса получателей методом clearAddresses(). Очистить все вложения можно с помощью clearAttachments().
Так же можно использовать AddEmbeddedImage чтобы добавить в письмо вложение (обычно изображения), которое предназначено для использования в html-коде и не будет доступно для скачивания. Пример использования картинки в письме, не доступной для скачивания:
Таким образом, вы можете отправлять письма с изображениями, которые есть только в теле письма, но их нельзя скачать как вложение. Эти изображения можно использовать в любом месте html-кода письма, нужно лишь указывать вместо url-адреса cid изображения, который вы использовали в AddEmbeddedImage.
Отправка подписанного и зашифрованного письма через PHPMailer
По-умолчанию, PHPMailer шифрует все отправляемые письма. Отключить шифрование письма можно только при отправке писем через SMTP использовав код:
Чтобы подписать письмо подписью DKIM, необходимо выполнить несколько действий:
- Сгенерировать приватный (private) и публичный (public) ключи для вашего домена
- Добавить DNS-запись для домена типа TXT с публичным ключом
- Настроить DKIM подпись в PHPMailer перед отправкой письма
Теперь опишу каждый шаг немного подробнее.
Генерация приватного и публичного ключей
Если у вас Linux-хостинг и есть доступ в Shell, то сгенерировать файлы ключей проще простого, нужно выполнить всего 2 команды с обычными правами своего пользователя:
Соответственно, test-private.pem и test-public.pem - это приватный и публичный ключи. Сохранить их нужно в папке, которая будет не доступна посетителям сайта или кому-то еще кроме вас.
Если нет возможности выполнить команды в shell, тогда чтобы сгенерировать приватный (private) и публичный (public) ключи и сохранить их в файлы, можно воспользоваться следующим кодом:
Внимание! Не забудьте убедиться, что папка, в которую будут сохраняться файлы, доступна для записи.
Добавление DNS-записи с публичным ключом
DNS-запись нужна, чтобы почтовые серверы, которые будут получать ваши письма, смогли проверить подпись на письме, прочитав DNS-запись вашего домена. Как правило, DNS-запись можно добавить в панели управления вашим доменом, либо в панели управления хостингом. Если не знаете, как добавить запись, обратитесь в поддержку вашего хостинг-провайдера.
Нужно добавить DNS-запись следующего вида:
Имя записи: mail._domainkey.test.ru. (в конце точка ".")
TTL: 3600 (или какое будет по-умолчанию)
Тип записи: TXT
Значение: v=DKIM1; h=sha256; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ
В имени записи test.ru нужно заменить на имя вашего домена. Слова "ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ" вы заменяете на текст, который вы получили на предыдущем шаге после "Public key", без "-----BEGIN PUBLIC KEY-----" и "-----END PUBLIC KEY-----", только сам ключ. При этом все строчки ключа нужно соединить в одну длинную строку, чтобы переводов строки не было.
Настройка подписи DKIM в PHPMailer и отправка письма
Теперь осталось лишь сделать несколько настроек PHPMailer перед отправкой письма и оно будет подписано. Думаю, на приведенном примере будет всё понятно:
Теперь, ваши письма, отправляемые через PHPMailer будут подписаны подписью DKIM вашим приватным ключом.
PHPMailer обновился и инструкция к прошлой версии не актуальна, хотя вы также можете использовать прикреплённые файлы в той инструкции. Работать будет.
О чем эта инструкция.
Это инструкция по добавлению на ваш сайт PHPMailer и отправки писем с прикреплёнными файлами к вам на почту без перезагрузки страницы.
Здесь будет инструкция для более простой базовой версии формы, без анимации и валидаций на чистом JavaScript. Навороченную версию формы (та, что на картинке) вы можете скачать по ссылке в конце статьи.
1. Скачиваем PHPMailer
Во всём архиве нам нужны только 3 файла:
Всё остальн о е, что хранится на Github — на*уй не нужно, можете удалять.
2. Удаляем из файлов весь хлам
Этот пункт вы можете пропустить. Он не является обязательным
Файлы, написанные разработчиками PHPMailer, содержат немереное количество мусора, состоящего из одних комментариев (зачем?!). Вес этих трёх файлов вместе с комментариями равен 196кб, после удаления комментов вес составит 72кб. Почти в 3 раза…
- Открываете файл PHPMailer.php
- Копируете содержимое файла
- Вставляете в форму на сайте php-minify и жмёте “COMPRESS”
- Результат пересохраняете в новом файле с тем же названием
Процедуру повторяете со всеми тремя файлами.
Для наглядности файл Exception.php
3. Перемещаем файлы в проект
И теперь помещаем эти 3 файла в наш проект. Я создал специально для этих файлов папку под названием phpmailer
4. Создаём файл конфигурации
Создадим файл send.php с таким содержанием
Здесь вам нужно отредактировать эти поля под себя:
Нужно использовать не пароль от самой почты, а “Пароль приложения”. В настройках вашей почты, будь то Gmail, Yandex или Mailru— есть раздел “Пароли приложений”, где вы можете специально создать отдельный сгенерированный пароль для PHPMailer.
Сохраняем этот файл send.php и помещаем его в корень сайта
5. Создаём HTML форму
Теперь поместим эту форму в нужное место на вашем сайте
Обратите внимание на onsubmit. Там вторым аргументом должно быть указано имя файла, то есть send.php.
6. Прописываем JavaScript
Нужно теперь просто где-то в коде разместить эту функцию. Вы можете её скопировать в свой script файл, который уже подключён в <head>, либо вставить его после закрывающего тега </body>.
7. Всё (почти)
Форма у вас должна выглядеть вот так:
8. Почему ошибка?
Это очень частый вопрос, где я с полной уверенностью могу сказать: 60% причин ошибок — это ваш хостинг, 30% — ваша почта, 9% — вы неверно указали данные от почты, а 1% причин —ты, сука, даун, который решил изменить код, а потом начинаешь искренне удивляться, почему ничерта не работает.
Чтобы узнать, в чём причина, нужно раскомментировать вот эту строчку кода (убрать //):
Если для вас эти строчки, как иероглифы, и уверены, что ошибки в написании данных почты нет, то отправляете два письма: одно в тех.поддержку вашего хостинга, второе в тех.поддержку вашей почты с таким содержанием:
Через некоторое время они ответят и письма начнут нормально уходить.
После того, настоятельно рекомендую снова закомментировать строчку c $mail->SMTPDebug = 2
У этой формы есть минус: нет защиты от спама. Каптчу вам нужно отдельно подключать
Несмотря на то, что PHPMailer — библиотека PHP с открытым исходным кодом — была создана в далёком 2001 году, она наряду со Swiftmailer остается одним из лучших программных средств для отправки электронных писем, по мнению большинства разработчиков. Расскажем о том, как применять PHPMailer вместо встроенной функции mail() , а также приведём несколько примеров использования этой библиотеки.
Является ли PHPMailer альтернативой встроенной функции mail() ?
Функционала mail() достаточно для выполнения большинства стандартных задач, связанных с отправкой электронных писем, но зачастую она не обеспечивает требуемую гибкость.
Если PHPMailer поддерживает ООП, то функция mail() уже не применима при объектно-ориентированном подходе в программировании. Также PHP-разработчики не любят использовать строки $headers при отправке писем с помощью функции mail() , поскольку при этом приходится экранировать многие символы. Еще один недостаток стандартной функции отправки писем PHP – «грязный» код (экранирование, кодирование, форматирование) скрипта отправки вложений и писем на HTML. PHPMailer полностью лишён перечисленных недостатков.
Для работы mail() требуется сконфигурированный локальный сервер, в то время как PHPMailer поддерживает протокол SMTP, который могут использовать аутентифицированные пользователи.
Рассмотрим ещё несколько преимуществ использования PHPMailer:
К слову, PHPMailer используют многие CMS, созданные на языке PHP: например, WordPress, Joomla! и Drupal.
Установка библиотеки PHPMailer
Для установки PHPMailer можно использовать менеджер пакетов (композер), выполнив следующую команду:
composer require phpmailer/phpmailer
Отправка электронных писем с локального сервера с помощью PHPMailer
Ниже представлен простой код для отправки электронного письма с локального сервера через библиотеку PHPMailer:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
//PHPMailer Object`` $mail = new PHPMailer(true); //Argument true in constructor enables exceptions`
//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";
try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo "Message has been sent successfully";
> catch (Exception $e) <
⠀⠀⠀⠀ echo "Mailer Error: " . $mail->ErrorInfo;
>
Представленный код с комментариями наглядно демонстрирует все действия, которые нужно выполнить для отправки письма.
Отправка письма с вложениями
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$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.jpg"); //Filename is optional
$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 , расположенный в папке со скриптом, и images/profile.jpg , который находится в папке images .
Чтобы прикрепить файлы к письму, необходимо вызвать метод addAttachment объекта PHPMailer, который в качестве аргумента принимает строку с адресом файла. Для прикрепления нескольких файлов нужно вызвать этот метод соответствующее число раз.
Устранение проблем в коде
Для отладки кода был использован класс Exception библиотеки PHPMailer, который способен отследить все возможные ошибки. В конструктор объекта PHPMailer был передан аргумент true , который указывает на необходимость отображения полной информации об исключениях.
В зависимости от типа системы, наиболее распространенной ошибкой при использовании встроенной функции mail() в фоновом режиме является следующая:
Mailer Error: Could not instantiate mail function.
Если нужно получить больше сведений о возникшей ошибке, можно добавить следующий код в блок catch<> :
Как правило, ошибки использования функции 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 \vendor\phpmailer\phpmailer\src\PHPMailer.php
⠀⠀⠀⠀ [line] => 863
`)
Чтобы избежать этой весьма распространённой проблемы, рекомендуется использовать протокол SMTP.
В папку language также можно добавить любой другой язык из 43 доступных.
Использование протокола SMTP
Для отправки электронных писем можно использовать почтовый сервер другого хоста, но сперва необходимо пройти аутентификацию. То есть для отправки писем через почтовый сервер Gmail необходимо иметь учётную запись в этом сервисе.
SMTP – протокол запроса на отправку электронного письма, используемый почтовыми клиентами. После того, как почтовый сервер проверит электронное письмо, он отправит его на указанный почтовый сервер.
Ниже приведен пример отправки письма через почтовый сервер Gmail с клиентского домена. Поскольку мы используем SMTP-протокол, локальный почтовый сервер не требуется:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
//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->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 использует TSL-шифрование поверх SMTP, поэтому в коде было установлено соответствующее значение для свойства объекта PHPMailer. Перед отправкой по протоколу SMTP необходимо указать имя хоста, номер порта, тип шифрования и пройти аутентификацию, а также предоставить имя пользователя и пароль. Если в Gmail была включена функция двухфакторной аутентификации, доступ к SMTP через имя пользователя и пароль будет закрыт. Для получения доступа необходимо внести дополнительные настройки.
Извлечение писем через протокол POP3
Библиотека PHPMailer поддерживает отправку писем по методу аутентификации POP перед SMTP. Иначе говоря, вы сможете пройти аутентификацию через POP и отправлять почту через SMTP. К сожалению, в PHPMailer реализована только возможность отправки электронных писем, поэтому получать почту по протоколу POP3 с использованием библиотеки не получится.
Заключение
Если вы являетесь PHP-разработчиком, вы будете часто сталкиваться с необходимостью программной отправки электронных писем. Конечно, можно использовать сторонние сервисы (Mandrill или SendGrid) или написать свою собственную библиотеку, но лучшим инструментом для решения этой задачи пока по-прежнему остаётся PHPMailer.
Стандартное электронное письмо – это обычный текст, что и используется большинством разработчиков, поэтому создание MIME заголовков для HTML писем может стать сложным процессом. Теперь трудности вам не грозят, потомучто у вас есть чудесная библиотека PHPMailer, которая, к тому же, бесплатна.
В этом обучающем курсе мы будем подробно обсуждать особенности и возможности этой библиотеки.
Требования
Требования у данной библиотеки очень скромны. Вам нужен только PHP и возможность отсылать письма посредствам команды mail() или через SMTP соединение.
Также вы должны понимать основы объектно-ориентированного программирования (ООП), или, по крайней мере, понимать как правильно применять данные ниже примеры.
Не переживайте! Этот курс достаточно прост!
О PHPMailer
Что может PHPMailer
На момент написания этого обучающего курса PHP Mailer умел:
Разработчики PHPMailer
- Brent R. Matzelle
- Patrice Fournier
- Chris Ryan
- Cem Hurturk
- Tom Klingenberg
- Jaime Bozza
Готовим PHPMailer для использования
Теперь, когда все файлы на своих местах, давайте создадим файл конфигурации нашего проекта.
Создание и использование файла конфигурации
Одна из главных вещей, которую я люблю делать перед созданием сайта – это написание файла конфигурации, он будет содержать настройки к которым я, возможно, буду обращаться много раз. И так, я создаю файл с название config.php в /home/mywebsite/public_html/config.php. Создаем внем массив с названием $site с моими ключами и значениями, которые я буду использовать в дальнейшем. В этом руководстве я опишу переменные, которые мы будем использовать в классе PHPMailer. Вот пример моего файла config.php:
Этот пример очень прост, чтобы объяснять его. Далее мы продолжим свою работу и будем брать эти настройки по мере надобности.
Создаем класс, расширяющий PHPMailer
Сразу подчеркну, что вы должны создать класс расширения, это позволит упростить вам жизнь, далее я покажу как.
Класс расширения вызовет класс PHPMailer() и установит начальные значения, такие, как Email адрес от имени которого вы будете посылать письма, настройки почтового сервера, и так далее.
Каждый из этих параметров берется по умолчанию из файла config.php, но вы также можете переписать их при вызове нашего класса расширения. Таким образом, если вы не переопределите какой-либо из параметров в классе расширения, то он будет взят поумолчанию из файла config.php, и вам не надо каждый раз переопределять эти параметры. В этом и красота данного подхода!
Взгляните на наш класс расширения:
Далее мы рассмотрим этот код.
Разберем класс FreakMailer
Наш класс, показанный выше, очень прост. И вам необходимо обладать только базовыми навыками ООП, чтобы использовать его. Давайте разберемся.
Сначала нам необходимо подключить класс PHPMailer (файл class.phpmailer.php в директории lib). Это позволяет нам расширить класс PHPMailer, потому что делает объект доступным. Вы могли бы подключить его и в другом месте, но здесь это наиболее эффективно.
Структура управления классом
Далее, мы определяем структуру управления классом и даем ему имя при расширении класса PHPMailer.
Переменные класса
Идем дальше. Теперь мы определяем внутренние переменные. Большинство из них установлены поумолчанию в NULL, чтобы позже мы могли их переопределить, если есть необходимость заменить значения, установленные в config.php.
Давайте рассмотрим эти переменные:
После определения переменных, мы с вами можем обсудить функцию FreakMailer().
Функция FreakMailer()
Эта функция, в основном, настраивает начальные значения для класса PHPMailer, чтобы посылать почту.
Сначала мы вызываем массив $site из файла config.php, чтобы иметь возможность использовать его в пределах данной функции и класса. Чтобы сделать это есть два способа: передать массив при вызове класса или сделать массив глобальным. Последний способ самый легкий и он работает, поэтому его и используем!
Все дальнейшие действия – это, в основном, определение значений переменным класса PHPMailer. Если внутренняя переменная ($this->setting) не определена, мы берем значения из файла config.php. Я уже упоминал о том, что вы можете переопределить значения из config.php, здесь мы проверяем это.
Отправка электронной почты средствами PHPMailer
Предварительная работа сделана и теперь у нас есть все, чтобы посылать письма средствами PHPMailer.
Первоначальное испытание
Это испытание очень важно, потому что в рамках данной статьи мы будем постоянно возвращаться к приведенному здесь коду. Если данный код у вас не заработает, перечитайте этот материал сначала и снова попробуйте. Наш первый пример мы сохраним в файле mailtest.php, который положим в корень нашего проекта. Вот его содержимое:
Давайте разберем этот код для лучшего его понимания.
Сначала мы подключаем наш конфигурационный файл, чтобы иметь доступ к массиву $site.
Далее, подключаем класс FreakMailer.
Теперь необходимо инициализировать наш класс расширения, а также класс PHPMailer.
Теперь PHPMailer готов и мы идем дальше.
Задаем тему письма и его содержание.
Если вы используете в качестве письма обычный текст, то необходимо разделять строки или . И вы должны использовать двойные кавычки при определении переменной $mailer->Body. Если вы используете одинарные кавычки, то перенос текста с одной строки на другую возможен с помощью клавиши .
Теперь необходимо добавить адрес получателя.
Далее, мы очищаем список адресатов и список вложений.
Основные проблемы
Вот список некоторых (типичных) проблем, которые могут возникнуть у вас при отправлении почты при помощи PHPMailer (вероятнее всего, эти проблемы у вас возникли бы и при обычном отправлении писем):
- на вашей машине не установлено или не запущено ни одного SMTP сервера;
- неправильные настройки внутри PHP скрипта, перечитайте обучающий курс еще раз;
- Сервер Apache не разрешает релей через SMTP сервер на локальной машине (типичный случай);
- вы не правильно определили получателя письма.
Но, если у вас все заработало, давайте перейдем к отправке писем с определенными особенностями.
Использование дополнительных возможностей PHPMailer
Если вы уже здесь, но не читали при этом предыдущего материала – вернитесь и прочитайте, потому что здесь мы будем заниматься расширением базового примера.
PHPMailer имеет множество особенностей, например, добавление вложений, рассылка по списку адресатов и др. В этой части нашего материала мы с вами посмотрим, как это выглядит на практике.
Обработка адресов электронной почты
PHPMailer поддерживает много особенностей Адреса электронной почты, типа "Для" TO, "от" FROM и списков получателей, точная копия CC и Слепая точная копия BCC, Reply-TO и др. Давайте посмотрим, как использовать эти особенности.
Помните, что мы опираемся на основной пример, приведенный выше.
Добавление адреса отправителя (FROM)
В нашем основном примере адрес отправителя уже задан посредствам config.php и класса расширения, но вы в любой момент можете его переопределить. Например:
Если не определить FromName, то большинство почтовых клиентов в качестве имени подставят емаил.
Добавление адреса для ответа (Reply-To)
Поумолчанию, адрес для ответа совпадает с адресом, с которого вы отослали письмо (FROM). Однако вы можете определить разные адреса для ответа на ваше письмо:
ЗАМЕЧАНИЕ:
Вы можете задать несколько адресов для ответа. Для этого необходимо продублировать приведенный выше код столько раз, сколько вы имеете адресов (не забудьте в примере менять адреса на нужные вам).
Добавление нескольких получателей
Этот метод позволяет вам добавить нескольких получателей для письма. Я не рекомендую этот способ для анонимных листов рассылки. Смотрите позже пример для списка рассылки.
ЗАМЕЧАНИЕ:
Не рекомендуем пользоваться этим методом для рассылки по списку адресатов! Каждый получатель вашего письма будет видеть ВЕСЬ список получателей, а, затем, сможет использовать его по своему усмотрению. Позже мы расскажем как правильно отсылать письма по списку адресатов.
Добавить получателей точной копии (CC)
Вы можете добавить получателей точной копии точно также, как и предыдущих примерах, используя функцию AddCC.
Добавление получателей слепой точной копии (BCC)
Невидимых получателей или BCC можно добавить используя следущую функцию:
Требование подтверждения прочтения
Если вы хотите запросить у человека, читающего ваше письмо, подтверждение о прочтении, подайте следующую команду:
Теперь, когда мы рассмотрели все адреса для отправки почты, давайте посмотрим, как посылать письма ввиде HTML!
Отправление писем ввиде HTML при помощи PHP и PHPMailer
Формирование HTML письма – это одна из самых сложных задач при отправке почты средствами PHP. Настройка MIME заголовков и построение HTML – нелегкая задача и требует дополнительных знаний и исследований. Однако, PHPMailer сделает вашу жизнь проще, далее, мы покажем как это реализуется.
Важное замечание относительно почты ввиде HTML
Прежде чем мы приступим к отправке таких писем, я хотел бы, чтобы вы поняли, что важно знать о том, каким образом должны подключаться изображения и стили CSS, и т.д. Простое правило состоит в том, чтобы хранить эти файлы на сервере, а в письме давать полные ссылки на них. Если вы сходите сума и добавляете все эти файлы к письму, то готовьтесь к головной боли. Например, тело моего письма выглядит примерно так:
Как вы видете, я сделал каждый URL полным, а не сокращенным относительно моего документа. Если этого не сделать, то ваши изображения не будут грузиться и пользователь их не увидит!
Идем дальше, теперь нам необходимо отослать наше письмо. Для этого нам необходимо определить тело нашего письма и задать isHTML настройки. Следующий пример расширяет первоначальный базовый пример.
Дополнительные "тела" письма
Прикрепление файлов к письму
Прикрепить файл к письму – это чень легкая задача, если вы используете PHPMailer. Просто добавьте их письму точно также, как вы добавляли адреса. Вот пример:
Функция AddAttachment имеет 4 аргумента:
- путь до файла;
- имя файла;
- кодирование;
- тип заголовка.
Путь до файла, естественно, полный путь до файла на диске, имя файла – название файла, который вы хотите прикрепить, кодирование – поумолчанию base64, тип заголовка – это тип заголовка, который вы хотите послать – поумолчанию – Application/octet-stream.
Как видите, все очень легко! Давайте перейдем с вами к использованию SMTP.
Использование внешнего(их) SMTP для работы с почтой средствами PHP
Как я понимаю, PHPMailer попытается послать почту через первый сервер, если это не удается – через второй и так далее.
ЗАМЕЧАНИЕ:
Помните, что вы всегда можете включить авторизацию через SMTP или поменять порт в файле config.php.
Важное замечание, обращаю ваше внимание, что для отправки писем через SMTP необходимо использовать не стандартную функцию Send(), а функцию SMTPSend(). Например:
Проблемы с отправкой через SMTP
Есть много вариантов возникновения ошибок при работе с SMTP, в основном, все они касаются прав доступа:
- имеет ли ваш хостинг разрешение на отправку почты через указанный SMTP?
- Возможно, перед подключением по SMTP необходимо подключиться по протоколу POP (сначала скачать – потом отправлять);
- вах хостинг требует авторизации соединения;
- вы уверены, что вы ввели правильные параметры пользователя и пароля?
К сожалению, я не уверен, что PHPMailer поддерживает соединение по протоколу POP перед соединением по SMTP. Если это создает проблему – свяжитесь со своим администратором и попросите хозяина релея прописать ваш IP адрес для сервера.
Использование qmail и Sendmail
Если вы хотите обойти функцию mail() PHP и использовать бинарные программы для работы с почтой, то вам необходимо определить тип почтового сервера, а затем PHPMailer запустит указанный бинарный файл, что, возможно, немного ускорит операции. Пример:
Как видите, это довольно легко! Давайте перейдем к построению простого списка адресатов.
Пример списка рассылки
Теперь, когда вы уже имеете достаточное представление о работе PHPMailer, давайте рассмотрим некоторые особенности списков рассылки. Выскажу несколько соображений о том, что вам может понадобиться при рассылке: настройка темы письма, тела письма. И, что наиболее важно, необходимо скрыть адреса получателей друг от друга.
Следующий пример предполагает, что у вас уже есть некоторая база данных со списком адресов и вы знаете как соединиться с базой MySQL. Пока мы предположим, что вы имеете что-то следующей структуры:
- Имя
- Фамилия
- Электронный адрес
- Тип письма (text/html)
Предположим, что вы имеете 50 пользователей и хотите сделать настраиваемую рассылку по этим адресам. Следующий пример поможет вам в этом:
Разбор кода списка рассылки
Первая часть такая же, как и в нашем первом примере – мы подключаем необходимые файлы.
Далее, мы определяем тело нашего письма. Вы можете также читать его из файла, но мы, для простоты, держим его внутри этого скрипта.
Обратите внимание на условный тег . Позже, когда мы будем выполнять действия в цикле, командой str_replace() мы заменим этот тег на имя пользователя из базы данных.
Далее, мы инициализируем класс для работы с почтой.
Далее, мы получаем данные об адресатах из базы данных. И организуем цикл, в котором получаем последовательно каждый ряд в объект.
Теперь мы дошли до места, где происходит непосредственная отсылка почты. Черезвычайно важно разобраться в том, что мы здесь делам. Первая часть кода в основном занимается формированием переменной $member_name, которая будет содержать все данные текущего пользователя.
Следующая часть кода определяет предпочтения пользователя – HTML или plain-text. Если пользователь предпочитает HTML, то мы пошлем ему письмо ввиде HTML с включенным телом текстового письма. В противном случае – пошлем только текстовый вариант.
Внимательно проанализируйте текст выше, пока не достигните полного понимания. Вся необходимая информация для этого была в предыдущих частях нашего материала.
Наконец, мы отсылаем письмо и очищаем адреса в объекте $mailer от любых вложений.
ЗАМЕЧАНИЕ:
Удостоверьтесь, что вы используете функции $mailer->ClearAddresses() и $mailer->ClearAttahements(), иначе адреса пользователей будут добавляться в конец списка.
Подведем итог
Этот обучающий курс должен дать вам хороший толчек в том, чтобы сделать свою жизнь проще при работе с почтой. И все это – благодаря превосходной библиотеке PHPMailer. Теперь вы можете посылать почту незадумываясь о заголовках и прочих трудностях.
Если вы настроите данный класс правильно, то в последующем, при создании других сайтов, вам не надо будет тратить свое время.
Я надеюсь, что вы найдете время посетить сайт класса PHPMailer и почитать документацию к нему и FAQ. Очень важно понять, как устроен класс и ознакомиться со взглядом разработчиков на него. К тому же, на сайте есть другая большая обучающая статья и некоторые примеры.
Отличная статья! Может сделаете еще инструкцию по swiftmailer? Тоже очень хороший класс и работает быстрее phpmailer когда доходит речь до очень больших объемов.
Спасибо. Очень полезная статья. А как сделать рассылку по списку пользователей с учетом времени посещения? К примеру, мне надо давать периодические оповещения тем пользователям, которые не посещали сайт в течение 5-ти месяцев.
Читайте также: