От автора: отправка почты с сайта на email – это довольно обыденная и несложная задача. Для этого в PHP предусмотрена функция mail(), которой достаточно передать несколько параметров, и ваше письмо уйдет на указанную электронную почту. Но вот дойдет ли?
Именно на этот вопрос мы и попробуем найти ответ в этом уроке.
Причина, по которой отправленное письмо может быть не получено адресатом – это антиспамовые фильтры. Почтовые сервисы, как могут, пытаются бороться с получением спама. Также антиспамовые фильтры не очень «любят» письма, отправленные функцией mail(). В результате этого письмо попадет в папку Спам, в лучшем случае, или же попросту будет удалено антиспамовым фильтром.
Как же здесь быть? Выход прост: можно отправлять почту через SMTP популярных почтовых сервисов. Например, через gmail.com. Для этого всего-то нужно иметь почтовый ящик того почтового сервиса, протокол которого будем использовать. В уроке я буду использовать сервис mail.ru, поскольку там гораздо проще завести тестовый почтовый ящик. Однако, если вы захотите использовать сервис gmail.com, то порядок действий будет одним и тем же.
Для того, чтобы не писать весь код с нуля, мы воспользуемся популярной библиотекой PHPMailer, позволяющей выполнить, пожалуй, любую задачу, связанную с отправкой почты.
В видео версии урока вы найдете подробное комментирование процесса отправки почты. Для примера мы отправим 2 типа писем на различные почтовые сервисы: это будет письмо формата HTML и письмо с вложением. Как вы увидите, процесс использования библиотеки PHPMailer предельно прост.
На этом я с вами прощаюсь. Удачи и до новых встреч!
webformyself.com
PHPMailer — A full-featured email creation and transfer class for PHP
Build status:



Class Features
- Probably the world’s most popular code for sending email from PHP!
- Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more
- Integrated SMTP support — send without a local mail server
- Send emails with multiple To, CC, BCC and Reply-to addresses
- Multipart/alternative emails for mail clients that do not read HTML email
- Add attachments, including inline
- Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings
- SMTP authentication with LOGIN, PLAIN, CRAM-MD5 and XOAUTH2 mechanisms over SSL and SMTP+STARTTLS transports
- Validates email addresses automatically
- Protect against header injection attacks
- Error messages in over 50 languages!
- DKIM and S/MIME signing support
- Compatible with PHP 5.5 and later
- Namespaced to prevent name clashes
- Much more!
Why you might need it
Many PHP developers utilize email in their code. The only PHP function that supports this is the mail()
function. However, it does not provide any assistance for making use of popular features such as HTML-based emails and attachments.
Formatting email correctly is surprisingly difficult. There are myriad overlapping RFCs, requiring tight adherence to horribly complicated formatting and encoding rules — the vast majority of code that you’ll find online that uses the mail()
function directly is just plain wrong! Please don’t be tempted to do it yourself — if you don’t use PHPMailer, there are many other excellent libraries that you should look at before rolling your own — try SwiftMailer, Zend/Mail, eZcomponents etc.
The PHP mail()
function usually sends via a local mail server, typically fronted by a sendmail
binary on Linux, BSD and OS X platforms, however, Windows usually doesn’t include a local mail server; PHPMailer’s integrated SMTP implementation allows email sending on Windows platforms without a local mail server.
License
This software is distributed under the LGPL 2.1 license. Please read LICENSE for information on the software availability and distribution.
Installation & loading
PHPMailer is available on Packagist (using semantic versioning), and installation via Composer is the recommended way to install PHPMailer. Just add this line to your composer.json
file:
or run
Note that the vendor
folder and the vendor/autoload.php
script are generated by Composer; they are not part of PHPMailer.
If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on the league/oauth2-client
package in your composer.json
.
Alternatively, if you’re not using Composer, copy the contents of the PHPMailer folder into one of the include_path
directories specified in your PHP configuration and load each class file manually:
If you’re not using the SMTP
class explicitly (you’re probably not), you don’t need a use
line for the SMTP class.
If you don’t speak git or just want a tarball, click the ‘zip’ button on the right of the project page in GitHub, though note that docs and examples are not included in the tarball.
Legacy versions
PHPMailer 5.2 (which is compatible with PHP 5.0 — 7.0) is no longer being supported for feature updates, and will only be receiving security updates from now on. You will find the latest version of 5.2 in the 5.2-stable branch, and future versions of 5.2 will be tagged with 5.2.x version numbers, so existing Composer configs should remain working. If you’re using PHP 5.5 or later, we recommend you make the necessary changes to switch to the 6.0 release.
Upgrading from 5.2
The biggest changes are that source files are now in the src/
folder, and PHPMailer now declares the namespace
PHPMailerPHPMailer
. This has several important effects – read the upgrade guide for more details.
Minimal installation
While installing the entire package manually or with Composer is simple, convenient and reliable, you may want to include only vital files in your project. At the very least you will need src/PHPMailer.php. If you’re using SMTP, you’ll need src/SMTP.php, and if you’re using POP-before SMTP, you’ll need src/POP3.php. You can skip the language folder if you’re not showing errors to users and can make do with English-only errors. If you’re using XOAUTH2 you will need src/OAuth.php as well as the Composer dependencies for the services you wish to authenticate with. Really, it’s much easier to use Composer!
A Simple Example
You’ll find plenty more to play with in the examples folder.
That’s it. You should now be ready to use PHPMailer!
Localization
PHPMailer defaults to English, but in the language folder you’ll find numerous (48 at the time of writing!) translations for PHPMailer error messages that you may encounter. Their filenames contain ISO 639-1 language code for the translations, for example fr
for French. To specify a language, you need to tell PHPMailer which one to use, like this:
We welcome corrections and new languages — if you’re looking for corrections to do, run the PHPMailerLangTest.php script in the tests folder and it will show any missing translations.
Documentation
Start reading at the GitHub wiki. If you’re having trouble, this should be the first place you look as it’s the most frequently updated.
Examples of how to use PHPMailer for common scenarios can be found in the examples folder. If you’re looking for a good starting point, we recommend you start with the Gmail example.
Note that in order to reduce PHPMailer’s deployed code footprint, the examples are no longer included if you load PHPMailer via Composer or via GitHub’s zip file download, so you’ll need to either clone the git repository or use the above links to get to the examples directly.
Complete generated API documentation is available online.
You can generate complete API-level documentation by running phpdoc
in the top-level folder, and documentation will appear in the docs
folder, though you’ll need to have PHPDocumentor installed. You may find the unit tests a good source of how to do various operations such as encryption.
If the documentation doesn’t cover what you need, search the many questions on Stack Overflow, and before you ask a question about "SMTP Error: Could not connect to SMTP host.", read the troubleshooting guide.
Tests
There is a PHPUnit test script in the test folder. PHPMailer uses PHPUnit 4.8 — we would use 5.x but we need to run on PHP 5.5.
Build status:

If this isn’t passing, is there something you can do to help?
Security
Please disclose any vulnerabilities found responsibly — report any security problems found to the maintainers privately.
PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, CVE-2017-5223. If content passed into msgHTML()
is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that addAttachment
(just like file_get_contents
, passthru
, unlink
, etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity.
PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to CVE-2016-10045 a remote code execution vulnerability, responsibly reported by Dawid Golunski, and patched by Paul Buonopane (@Zenexer).
PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to CVE-2016-10033 a critical remote code execution vulnerability, responsibly reported by Dawid Golunski.
See SECURITY for more detail on security issues.
Contributing
Please submit bug reports, suggestions and pull requests to the GitHub issue tracker.
We’re particularly interested in fixing edge-cases, expanding test coverage and updating translations.
If you found a mistake in the docs, or want to add something, go ahead and amend the wiki — anyone can edit it.
If you have git clones from prior to the move to the PHPMailer GitHub organisation, you’ll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone:
Please don’t use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained.
Sponsorship
Development time and resources for PHPMailer are provided by Smartmessages.net, a powerful email marketing system.
Other contributions are gladly received, whether in beer ?, T-shirts ?, Amazon wishlist raids, or cold, hard cash ?. If you’d like to donate to say "thank you" to maintainers or contributors, please contact them through individual profile pages via the contributors page.
Changelog
See changelog.
History
- PHPMailer was originally written in 2001 by Brent R. Matzelle as a SourceForge project.
- Marcus Bointon (coolbru on SF) and Andy Prevost (codeworxtech) took over the project in 2004.
- Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski.
- Marcus created his fork on GitHub in 2008.
- Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013.
- PHPMailer moves to the PHPMailer organisation on GitHub in 2013.
What’s changed since moving from SourceForge?
- Official successor to the SourceForge and Google Code projects.
- Test suite.
- Continuous integration with Travis-CI.
- Composer support.
- Public development.
- Additional languages and language strings.
- CRAM-MD5 authentication support.
- Preserves full repo history of authors, commits and branches from the original SourceForge project.
php-download.com
Установка и первоначальная подготовка SMTP клиента PHPMailer к работе
Прежде всего необходимо скачать свежую версию SMTP библиотеки: https://github.com/PHPMailer/PHPMailer
Затем распаковываем скачанный архивчик и изучаем содержимое SMTP библиотеки PHPMailer:
/docs: // Директория с документацией библиотеки PHPMailer /examples: // Директория с примерами работы библиотеки PHPMailer /extras: // Дополнительные полезности при работе с почтовыми серверами /language: // Директория с переводом Debug /test: // Скрипты тестирование библиотеки PHPMailer class.phpmailer.php // Класс для создания и отправки писем различными методами class.pop3.php // Класс для работы с POP3 class.smtp.php // Класс для работы с SMTP PHPMailerAutoload.php // Файл автоматической подгрузки классов PHPMailer
Все остальное не несет функциональной нагрузки и предоставляется в качестве информационного дополнения к библиотеке PHPMailer.
Ура! Теперь мы знаем что мы имеем при распаковке библиотеке. Дело осталось за малым — разобраться как с этим делом работать!
Многие любят создавать дополнительно файл конфигурации для SMTP клиента PHPMailer и в дальнейшем использовать его. Я тоже приверженец этой традиции и предлагаю на рассмотрение пример такого файла.
config.php:
$__smtp = array( "host" => 'smtp.host.com', // SMTP сервер "debug" => 2, // Уровень логирования "auth" => true, // Авторизация на сервере SMTP. Если ее нет - false "port" => '25', // Порт SMTP сервера "username" => 'mail@host.com', // Логин запрашиваемый при авторизации на SMTP сервере "password" => '123', // Пароль "addreply" => 'reply@host.com', // Почта для ответа "secure" => 'ssl', // Тип шифрования. Например ssl или tls "mail_title" => 'Заголовок вашего письма!', // Заголовок письма "mail_name" => 'Имя отправителя' // Имя отправителя );
Заливаем все это богатство на наш хостинг и готовимся к первой инициализации и пробной отправке первого письма при помощи SMTP клиента PHPMailer.
Подключаем и инициализируем класс PHPMailer
Для подключения класса PHPMailer необходимо подключить файлы PHPMailerAutoload.php и config.php:
require_once('/путь/до/файла/config.php'); //Файл конфигурации для вашего smtp сервера require_once('/путь/до/файла/
PHPMailerAutoload.php'); //Файл автоматической подгрузки классов PHPMailer
Далее происходит процесс конфигурации SMTP клиента PHPMailer и отправка письма. Пример конфигурации вы можете посмотреть в директории с примерами /examples или воспользоваться нашим примером конфигурации и отправки письма при помощи класса PHPMailer.
Пример конфигурации SMTP клиента PHPMailer:
Данный пример демонстрирует работу библиотеки PHPMailer в качестве SMTP клиента.
require_once('/путь/до/файла/config.php'); //Файл конфигурации для вашего smtp сервера require_once('/путь/до/файла/PHPMailerAutoload.php'); //Файл автоматической подгрузки классов PHPMailer try{ $mail = new PHPMailer(true); // Создаем экземпляр класса PHPMailer $mail->IsSMTP(); // Указываем режим работы с SMTP сервером $mail->Host = $__smtp['host']; // Host SMTP сервера: ip или доменное имя $mail->SMTPDebug = $__smtp['debug']; // Уровень журнализации работы SMTP клиента PHPMailer $mail->SMTPAuth = $__smtp['auth']; // Наличие авторизации на SMTP сервере $mail->Port = $__smtp['port']; // Порт SMTP сервера $mail->SMTPSecure = $__smtp['secure']; // Тип шифрования. Например ssl или tls
$mail->CharSet="UTF-8"; // Кодировка обмена сообщениями с SMTP сервером $mail->Username = $__smtp['username']; // Имя пользователя на SMTP сервере $mail->Password = $__smtp['password']; // Пароль от учетной записи на SMTP сервере $mail->AddAddress('whoto@example.com', 'John Doe'); // Адресат почтового сообщения $mail->AddReplyTo($__smtp['addreply'], 'First Last'); // Альтернативный адрес для ответа $mail->SetFrom($__smtp['username'], $__smtp['mail_title']); // Адресант почтового сообщения $mail->Subject = htmlspecialchars($__smtp['mail_title']); // Тема письма $mail->MsgHTML('Текст сообщения!'); // Текст сообщения $mail->Send(); return 1; } catch (phpmailerException $e) { return $e->errorMessage(); }
Выводы
Мы рекомендуем библиотеку PHPMailer в качестве простого и надежного класса для работы с SMTP серверами. Данная библиотека позволит быстро организовать рассылку практически любой сложности, провести гибкую отладку работы скриптов.
Мы неоднократно использовали и продолжаем использовать данную библиотеку в своих проектах!
Всем спасибо за внимание!
r-band.ru
$mail->Host = "ssl://smtp.yandex.ru"; $mail->Port = 465; $mail->Username = "Логин@yandex.ru"; $mail->Password = "Пароль";
$mail->Host = "ssl://smtp.mail.ru"; $mail->Port = 465; $mail->Username = "Логин@mail.ru"; $mail->Password = "Пароль";
$mail->Host = "ssl://smtp.gmail.com"; $mail->Port = 465; $mail->Username = "Логин@gmail.com"; $mail->Password = "Пароль";
Если возникает ошибка при отправки почты, то нужно отключить двухфакторную авторизацию и разблокировать "ненадежные приложения" в настройках конфиденциальности аккаунта https://myaccount.google.com/security?pli=1
![]() |
![]() |
$mail->Host = "ssl://smtp.rambler.ru"; $mail->Port = 465; $mail->Username = "Логин@rambler.ru"; $mail->Password = "Пароль";
$mail->Host = "ssl://smtp.mail.me.com"; $mail->Port = 587; $mail->Username = "Логин@icloud.com"; $mail->Password = "Пароль";
$mail->Host = "ssl://smtp.masterhost.ru"; $mail->Port = 465; $mail->Username = "Логин@домен.ru"; $mail->Password = "Пароль";
Лимит — 2000 писем в день, но не более 5 в секунду.
$mail->Host = "ssl://smtp.timeweb.ru"; $mail->Port = 465; $mail->Username = "Логин@домен.ru"; $mail->Password = "Пароль";
Доступ к сторонним почтовым серверам по SMTP-портам (25, 465, 587) ограничен, разрешена отправка не более 300 сообщений в сутки.
$mail->Host = "smtp.домен.ru"; $mail->SMTPSecure = 'TLS'; $mail->Port = 25; $mail->Username = "Логин@домен.ru"; $mail->Password = "Пароль";
Лимит — 3000 писем в день
$mail->Host = "ssl://serverXXX.hosting.reg.ru"; $mail->Port = 465; $mail->Username = "Логин@домен.ru"; $mail->Password = "Пароль";
Имя сервера можно узнать в разделе "Информация о включенных сервисах и паролях доступа":
![]() |
![]() |
snipp.ru
Приветствую на страницах блога перфекциониста. Сегодня мы снова будем программировать, и да — снова на PHP (уж очень я его люблю;)).
Недавно мне потребовалось расширить функционал моего скрипта интернет-эквайринга, а именно — добавить возможность автоматической отправки почты с деталями платежа после завершения оплаты.
В PHP, начиная с версии 4, есть специальная функция mail()
которая, в принципе, справляется с этой задачей, но ничего так просто в этом мире не бывает и эта функция не стала исключением. Проблема даже кроется не в самой функции, а в том, что большинство провайдеров и хостеров распознают, что письмо было отправлено с ее помощью, и, как правило, в лучшем случае письмо попадает в папку «СПАМ» или же вовсе не доходит до адресата, т.к. сервер почтовика его забраковал — это далеко не всегда так, да, бывают и исключения. К тому же, если вы используете локальный сервер — у вас есть полный доступ к его настройкам, а следовательно и настройкам функции mail()
. Но все это частные случаи, их я разбирать не буду, т.к. я люблю чтоб все работало везде и всегда (хотя это, конечно, тоже не реально, но к этому нужно стремиться).
Я предлагаю использовать реализацию посложнее, но не на столько, чтобы от нее отказаться. Мы будем использовать реально существующий ящик, на яндексе, гугле или на вашем домене — не важно, главное чтобы он существовал, у нас был к нему логин и пароль и была доступна авторизация по протоколу SMTP:
SMTP (англ.Simple Mail Transfer Protocol — простой протокол передачи почты) — это широко используемый сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP.
© Wikipedia
Я порыскал по сети, перепробовал несколько разных классов и примеров работы с этим протоколом, но все они либо не устарели и не в состоянии были работать по ssl соединению, либо были слишком нагромождены и проще было бы с нуля написать свой класс, чем разобраться как он там работает. В конце концов я наткулся на проект PHPMailer — весьма мощный продукт, отвечающий всем моим требованиям. Его-то и решено было использовать.
Итак, начнем с того, что скачаем PHPMailer и поместим его в отдельную одноименную папку на нашем сервере. Далее создадим 2 файла — один файл будет содержать конфигурационные данные и функции, второй будет отправлять нашу почту (короче говоря — пример). Размяли пальцы — и погнали.
Открываем первый файл в редакторе — mail.class.php
и пишем примерно следующее:
class mail{ private $smtp_data = array( "host" => 'smtp.mail.ru', // SMTP сервер "debug" => 0, // Уровень логирования (0 выкл, 1 - вывод ошибок, 2- полный лог) "debugoutput" => 'html', //формат вывода лога, если включено логирование "auth" => true, // Авторизация на сервере SMTP. Если ее нет - false "port" => 587, // Порт SMTP сервера "username" => 'noreply@mail.ru', // Логин на SMTP сервере "password" => '1234567890', // Пароль на SMTP сервере "fromname" => 'Почтовый робот', // Отображаемое имя отправителя "replyto" => array( "address" => 'my@site.ru', // адрес почты для ответа "name" => 'My Name' //отображаемое имя владельца ящика ), "notification" => array( "address" => 'my@site.ru', // Почта оповещения админа (не оповещать- оставить пустым) "name" => 'My Name' //отображаемое имя владельца ящика ), "secure" => 'tls', // Тип шифрования. Например ssl или tls "charset" => 'UTF-8', //кодировка отправляемых писем "verify" => '0' // Верификация сертификата. 0 -выкл, 1 - вкл (выключить при возникновении ошибок связанных с SSL сертификатами при отправке) );
Пока все думаю понятно. Все настройки с комментарием, так что сложностей возникнуть не должно. Двигаемся дальше. Так, как мы будем отправлять сообщение в автоматическом режиме, то содержимое пиcем будет примерно одинаковым, кроме данных платежа (в нашем случае). Значит нам нужен некий шаблон, который можно будет редактировать без затруднений и поисков по коду. Создадим еще один массив с данными шаблона:
private $mail_content = array( 'title' => 'Детали платежа с сайта fussraider.ru', 'header' => 'Добрый день! Была произведена оплата на сайте fussraider.ru
Данные платежа:
', 'footer' => '
С Уважением,
Администрация a href="fussraider.ru">fussraider.ru
Это сообщение отправлено автоматически, на него не нужно отвечать.
' );
Тут мы будем задавать тему письма, его начало и конец. А все динамичные данные будут между шапкой и подвалом. Для упрощения добавим приватную функцию, которая будет приклеивать шапку и подвал сообщения и возвращать полный текст:
private function fullText($text) { if(!empty($text)) { return $this->mail_content['header'] . $text . $this->mail_content['footer']; } else { die("Отсутствует текст письма"); } }
Вот. Теперь переходим к основной части — функции отправки письма. Сам код функции выглядит вот так:
public function send($message_data) { require_once('./PHPMailer/PHPMailerAutoload.php'); // подключаем PHPMailer $mail = new PHPMailer; $mail->isSMTP(); if($this->smtp_data['verify'] == 0) { $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true )); } $mail->Host = $this->smtp_data['host']; $mail->SMTPDebug = $this->smtp_data['debug']; $mail->Debugoutput = $this->smtp_data['debugoutput']; $mail->SMTPAuth = $this->smtp_data['auth']; $mail->Port = $this->smtp_data['port']; $mail->Username = $this->smtp_data['username']; $mail->Password = $this->smtp_data['password']; $mail->SMTPSecure = $this->smtp_data['secure']; $mail->CharSet = $this->smtp_data['charset']; $mail->setFrom($this->smtp_data['username'], $this->smtp_data['fromname']); $mail->addReplyTo($this->smtp_data['replyto']['address'], $this->smtp_data['replyto']['name']); if(!empty($this->smtp_data['notification']['address'])) { $mail->addAddress($this->smtp_data['notification']['address'], $this->smtp_data['notification']['name']); } $mail->addAddress($message_data['to'], $message_data['to_name']); $mail->Subject = $this->mail_content['title']; $mail->msgHTML($this->fullText($message_data['text'])); $mail->AltBody = strip_tags($this->fullText($message_data['text'])); if (!$mail->send()) { die("Mailer Error: " . $mail->ErrorInfo); } else { return 0; } }
Тут вместо комментариев поясню отдельно. Функция принимает на вход некоторые данные $message_data
— это массив данных, который имеет строгую структуру:
$message_data = array( 'to' => 'to@mail.ru', 'to_name' => 'Василий Пупкин', 'text' => 'ТЕКСТ ПИСЬМА' );
Здесь я думаю тоже все понятно. Функция построена таким образом, что к тексту из массива, принимаемого функцией, приклеивается начало и конец письма функцией fullText
, которую я писал выше.
Вот в принципе и все содержимое нашего класса. Теперь давайте откроем второй файл — index.php
и попробуем уже отправить письмо. Для примера отправим письмо на мой ящик (он не существует в реальности, так что спамеры — идите на… гуляйте)
require_once('mail.class.php'); //подключаем наш класс $message_data = array( //задаем данные для отправки 'to' => 'admin@fussraider.ru', 'to_name' => 'Константин', 'text' => 'Ура! Оно работает!' ); $mailer = new mail; //создаем экземпляр нашего класса $sendmail = $mailer->send($message_data); //отправляем наше письмо if($sendmail == 0) //проверяем, отправилось ли оно вообще { echo "Письмо успешно отправлено"; } else { echo "Письмо не отправлено" . $sendmail; }
Теперь, если запустить выполнение скрипта — отправится письмо на ящик admin@fussraider.ru, но не дойдет, по указанным выше причинам. Для проверки можете указать свой ящик.
Добавлю еще, что этот скрипт умеет оповещать помимо адресата еще кого-то, например админа сайта. В конфигурации вы могли увидеть массив notification
— если его заполнить, при отправке письма оно будет отправляться также и по адресу, который вы там укажете. Если эта функция вам не нужна — просто оставьте значение address
пустым.
Ну вот как-то вот так. На сегодня все. Спасибо за внимание и до новых встреч!
UPD (08.07.2016):
добавил архив с исходниками и примером использования.
fussraider.ru
7 преимуществ использования PHPMailer
Существует целый ряд преимуществ использования PHPMailer для отправки электронных писем.
Объектно-ориентированный подход
Функция mail() не является объектно-ориентированной, в то время как PHPMailer имеет объектно-ориентированный интерфейс.
Возможность обойтись без заголовков и избежать грязного кода
В PHPMailer вам не придется писать грязный код и создавать заголовки, как в функции mail().
Ограничения локального почтового сервера
Для функции mail() необходим локальный почтовый сервер, тогда как PHPMailer осуществляет PHP отправку почты через SMTP. Кроме этого необходимы учетные данные.
Сообщение об ошибке на нескольких языках
Библиотека PHPMailer позволяет отправлять сообщения об ошибках более чем на 40 языках.
SSL аутентификация
Библиотека PHPMailer полностью поддерживает протокол SMTP и обеспечивает аутентификацию через SSL и TLS.
Обычная текстовая версия электронных писем
PHPMailer поддерживает отправку обычного текста для почтовых клиентов без поддержки HTML.
Поддержка сообщества
Существует активное сообщество поддержки библиотеки PHPMailer, которое постоянно актуализирует ее.
Приложения
PHPMailer используется популярными CMS, такими как Joomla, Drupal и WordPress.
Установка библиотеки PHPMailer:
Библиотека может быть установлена с помощью Composer, как показано ниже:
Отправка электронной почты с помощью PHPMailer на локальном веб-сервере
Скрипт отправки формы на почту PHP:
Отправка электронной почты с вложениями:
Также с помощью PHPMailer можно осуществлять PHP отправку почты с вложением.
Файлы File.txt и images/profile.png были прикреплены. Они находятся в одной директории. Вложения могут прикрепляться с помощью вызова объекта PHPMailer addAttachemnt. Для этого нужно вызывать объект каждый раз, когда необходимо прикрепить вложения.
При использовании SMTP:
Также можно отправить электронную почту с помощью SMTP, но для этого потребуется аутентификация email с другого хоста. Например, можно создать учетную запись на Hotmail для отправки электронной почты через этот сервис. SMTP — это протокол, который отправляет запросы электронной почты к почтовому серверу, и после проверки отправляет запросы к почтовому серверу получателя.
Рассмотрим пример отправки почты с сайта PHP с использованием протокола SMTP для почтового сервера Gmail.
Перед PHP отправкой почты через SMTP необходимо задать имя хоста, номер порта и шифрование. Также может потребоваться имя пользователя и пароль для аутентификации. Следует отметить, что не получится отправить письмо на Gmail, если включены два фактора аутентификации. Для этого потребуется дополнительная настройка.
Преимущество использования удаленного SMTP:
Основное преимущество использования удаленного SMTP заключается в том, что для функции mail(), если для отправителя установлено не имя локального домена, сообщение будет помечено сервером получателя, как спам.
Предположим, что вы являетесь владельцем домена abc.com. Когда вы отправляете электронное письмо, то указываете себя, отправителя, как name@gmail.com, а получателя, как name@yahoo.com. После этого почтовый сервер Yahoo помечает ваше письмо, как спам.
Извлечение электронных писем с помощью POP3:
PHPMailer поддерживает верификацию POP перед SMTP для отправки электронных писем. Следовательно, данная библиотека позволяет отправлять файл на почту PHP с помощью SMTP, а верификацию производить через POP. Но также можно получать письма с почтовых серверов по протоколу POP3.
Сообщения об ошибках:
$mail ->ErrorInfo используется для вывода сообщений более чем на 40 языках. Для просмотра сообщений об ошибках на любом доступном языке скопируйте каталог языка из исходного кода PHPMailer в каталог проекта. Рассмотрим следующий пример, в котором для объекта PHPMailer установлен русский язык.
PHPMailer — это надежное решение для работы с электронной почтой
Мы рассмотрели альтернативный подход PHP для отправки электронной почты. Любой PHP-разработчик не может обойтись без реализации функции отправки электронных писем. Также для этого можно использовать сторонние сервисы. Кроме PHPMailer есть и другие альтернативы, такие как Zend mail и swiftmailer.
Перевод статьи «How To Send Emails In PHP Using PHPMailer Library» дружной командой проекта Сайтостроение от А до Я.
www.internet-technologies.ru
Введение
Рассылка сообщений посредствам PHP может быть очень простой, а может быть очень сложной, все зависит от того, что и как вы собираетесь посылать.
Стандартное электронное письмо – это обычный текст, что и используется большинством разработчиков, поэтому создание MIME заголовков для HTML писем может стать сложным процессом. Теперь трудности вам не грозят, потомучто у вас есть чудесная библиотека PHPMailer, которая, к тому же, бесплатна.
В этом обучающем курсе мы будем подробно обсуждать особенности и возможности этой библиотеки.
Требования
Требования у данной библиотеки очень скромны. Вам нужен только PHP и возможность отсылать письма посредствам команды mail() или через SMTP соединение.
Также вы должны понимать основы объектно-ориентированного программирования (ООП), или, по крайней мере, понимать как правильно применять данные ниже примеры.
Не переживайте! Этот курс достаточно прост!
О PHPMailer
Это класс, обеспечивающий полную функциональность при отправке почтовых сообщений на PHP. Я назвал бы его самым лучшим из всех, которые я когда-либо использовал. Его популярность очень быстро росла. С момента появления, 7 декабря 2004 года, его скачали уже более 100 000 раз! Я надеюсь, что вы захотите увеличить это число после прочтения данного обучающего курса, и, что еще более важно, вы узнаете, как использовать те возможности по работе с почтой, о которых вы только мечтали.
Что может PHPMailer
На момент написания этого обучающего курса PHP Mailer умел:
- посылать письма с множественными: адресатами (TO), копиями (CC), BCC и REPLY-TO;
- избыточные SMTP серверы;
- многослойные/альтернативные сообщения для клиентов, которые не могут читать HTML письма;
- поддержка 8 бит, base64, бинарного режима, и пригодного для печати формата;
- Использовать все теже самые методы, что и популярный AspEmail активный сервер (COM);
- авторизация SMTP;
- перенос слов (word wrap);
- сообщения в виде HTML;
- библиотека проверена на множестве SMTP серверах: Sendmail, qmail, Postfix, Imail, Exchange, Mercury, Courier;
- работает на любой win32 и *nix платформе;
- гибкость отладки;
- определяемые вручную заголовки писем;
- совмещение нескольких сообщений и вложений;
- встроенная поддержка изображений.
Разработчики PHPMailer
- Brent R. Matzelle
- Patrice Fournier
- Chris Ryan
- Cem Hurturk
- Tom Klingenberg
- Jaime Bozza
Я выражаю этим людям свою признательность, потомучто они столько сделали, чтобы ускорить развитие моих проектов, включая PHPFreaks.com!
Готовим PHPMailer для использования
Скачать и распаковать
Первое, что вы должны сделать, это, конечно же, скачать PHPMailer! Вы можете найти его здесь: https://github.com/PHPMailer/PHPMailer/. После того, как вы скачаете файл, распакуйте его в каталог. В нашем учебнике мы предположим, что ваш сайт находится здесь: /home/mywebsite/public_html/. Теперь необходимо создать несколько директорий, чтобы упорядочить структуру проекта. Я обычно помещаю библиотеки в каталог 'lib', а затем их название. Таким образом, извлекаем PHPMailer сюда: /home/mywebsite/public_html/lib/phpmailer. Вот пример из командной строки:
/home/mywebsite/public_html/lib /home/mywebsite/public_html/lib/phpmailer /home/mywebsite/public_html/lib/phpmailer/docs /home/mywebsite/public_html/lib/phpmailer/docs/extending.html /home/mywebsite/public_html/lib/phpmailer/docs/faq.html /home/mywebsite/public_html/lib/phpmailer/docs/timeoutfix.diff /home/mywebsite/public_html/lib/phpmailer/language /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-br.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-cz.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-de.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-en.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-es.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-fr.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-it.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-nl.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-no.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-se.php /home/mywebsite/public_html/lib/phpmailer/language/phpmailer.lang-tr.php /home/mywebsite/public_html/lib/phpmailer/phpdoc /home/mywebsite/public_html/lib/phpmailer/phpdoc/allclasses-frame.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/deprecated-list.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/help-doc.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/index-all.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/index.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/overview-tree.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/packages.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/phpmailer.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/serialized-form.html /home/mywebsite/public_html/lib/phpmailer/phpdoc/stylesheet.css /home/mywebsite/public_html/lib/phpmailer/test /home/mywebsite/public_html/lib/phpmailer/test/phpmailer_test.php /home/mywebsite/public_html/lib/phpmailer/test/phpunit.php /home/mywebsite/public_html/lib/phpmailer/test/rocks.png /home/mywebsite/public_html/lib/phpmailer/ChangeLog.txt /home/mywebsite/public_html/lib/phpmailer/class.phpmailer.php /home/mywebsite/public_html/lib/phpmailer/class.smtp.php /home/mywebsite/public_html/lib/phpmailer/LICENSE /home/mywebsite/public_html/lib/phpmailer/README
Теперь, когда все файлы на своих местах, давайте создадим файл конфигурации нашего проекта.
Создание и использование файла конфигурации
Одна из главных вещей, которую я люблю делать перед созданием сайта – это написание файла конфигурации, он будет содержать настройки к которым я, возможно, буду обращаться много раз. И так, я создаю файл с название config.php в /home/mywebsite/public_html/config.php. Создаем внем массив с названием $site с моими ключами и значениями, которые я буду использовать в дальнейшем. В этом руководстве я опишу переменные, которые мы будем использовать в классе PHPMailer. Вот пример моего файла config.php:
// Настройки для MY site // Настройки Email $site['from_name'] = 'мое имя'; // from (от) имя $site['from_email'] = 'email@mywebsite.com'; // from (от) email адрес // На всякий случай указываем настройки // для дополнительного (внешнего) SMTP сервера. $site['smtp_mode'] = 'disabled'; // enabled or disabled (включен или выключен) $site['smtp_host'] = null; $site['smtp_port'] = null; $site['smtp_username'] = null;
Этот пример очень прост, чтобы объяснять его. Далее мы продолжим свою работу и будем брать эти настройки по мере надобности.
Создаем класс, расширяющий PHPMailer
Сразу подчеркну, что вы должны создать класс расширения, это позволит упростить вам жизнь, далее я покажу как.
Класс расширения вызовет класс PHPMailer() и установит начальные значения, такие, как Email адрес от имени которого вы будете посылать письма, настройки почтового сервера, и так далее.
Каждый из этих параметров берется по умолчанию из файла config.php, но вы также можете переписать их при вызове нашего класса расширения. Таким образом, если вы не переопределите какой-либо из параметров в классе расширения, то он будет взят поумолчанию из файла config.php, и вам не надо каждый раз переопределять эти параметры. В этом и красота данного подхода!
Взгляните на наш класс расширения:
require_once($_SERVER['DOCUMENT_ROOT'].'/lib/phpmailer/class.phpmailer.php'); class FreakMailer extends PHPMailer { var $priority = 3; var $to_name; var $to_email; var $From = null; var $FromName = null; var $Sender = null; function FreakMailer() { global $site; // Берем из файла config.php массив $site if($site['smtp_mode'] == 'enabled') { $this->Host = $site['smtp_host']; $this->Port = $site['smtp_port']; if($site['smtp_username'] != '') { $this->SMTPAuth = true; $this->Username = $site['smtp_username']; $this->Password = $site['smtp_password']; } $this->Mailer = "smtp"; } if(!$this->From) { $this->From = $site['from_email']; } if(!$this->FromName) { $this-> FromName = $site['from_name']; } if(!$this->Sender) { $this->Sender = $site['from_email']; } $this->Priority = $this->priority; } }
Далее мы рассмотрим этот код.
Разберем класс FreakMailer
Наш класс, показанный выше, очень прост. И вам необходимо обладать только базовыми навыками ООП, чтобы использовать его. Давайте разберемся.
Сначала нам необходимо подключить класс PHPMailer (файл class.phpmailer.php в директории lib). Это позволяет нам расширить класс PHPMailer, потому что делает объект доступным. Вы могли бы подключить его и в другом месте, но здесь это наиболее эффективно.
require_once($_SERVER['DOCUMENT_ROOT'].'/lib/phpmailer/class.phpmailer.php');
Структура управления классом
Далее, мы определяем структуру управления классом и даем ему имя при расширении класса PHPMailer.
class FreakMailer extends PHPMailer {
Переменные класса
Идем дальше. Теперь мы определяем внутренние переменные. Большинство из них установлены поумолчанию в NULL, чтобы позже мы могли их переопределить, если есть необходимость заменить значения, установленные в config.php.
var $priority = 3; var $to_name; var $to_email; var $From = null; var $FromName = null; var $Sender = null;
Давайте рассмотрим эти переменные:
- $priority – это устанавливает приоритет почты поумолчанию: 1 – высоко, 3 – нормально, 5 – низко.
- $to_name – Имя человека, которому вы посылаете сообщение.
- $to_email – адрес этого человека.
- $From – адрес, с которого вы хотите послать письмо.
- $FromName – имя отправителя.
После определения переменных, мы с вами можем обсудить функцию FreakMailer().
Функция FreakMailer()
Эта функция, в основном, настраивает начальные значения для класса PHPMailer, чтобы посылать почту.
Сначала мы вызываем массив $site из файла config.php, чтобы иметь возможность использовать его в пределах данной функции и класса. Чтобы сделать это есть два способа: передать массив при вызове класса или сделать массив глобальным. Последний способ самый легкий и он работает, поэтому его и используем!
function FreakMailer() { global $site; // Берем из файла config.php массив $site
Все дальнейшие действия – это, в основном, определение значений переменным класса PHPMailer. Если внутренняя переменная ($this->setting) не определена, мы берем значения из файла config.php. Я уже упоминал о том, что вы можете переопределить значения из config.php, здесь мы проверяем это.
if($site['smtp_mode'] == 'enabled') { $this->Host = $site['smtp_host']; $this->Port = $site['smtp_port']; if($site['smtp_username']) { $this->SMTPAuth = true; $this->Username = $site['smtp_username']; $this->Password = $site['smtp_password']; } $this->Mailer = "smtp"; } if(!$this->From) { $this->From = $site['from_email']; } if(!$this->FromName) { $this->FromName = $site['from_name']; } if(!$this->Sender) { $this->Sender = $site['from_email']; } $this->Priority = $this->priority; }
Самое главное, что вы должны понять, это то, что все возможности PHPMailer все еще присутствуют и могут использоваться, несмотря на то, что мы его расширили. Единственное, что мы сделали здесь – это создали расширение, которое заботится о том, чтобы нам не надо было каждый раз вводить одни и теже данные, когда мы хотим послать сообщение.
Теперь, когда мы достаточно имеем представление о классе расширения, давайте попробуем отправить почту!
Отправка электронной почты средствами PHPMailer
Предварительная работа сделана и теперь у нас есть все, чтобы посылать письма средствами PHPMailer.
Первоначальное испытание
Это испытание очень важно, потому что в рамках данной статьи мы будем постоянно возвращаться к приведенному здесь коду. Если данный код у вас не заработает, перечитайте этот материал сначала и снова попробуйте. Наш первый пример мы сохраним в файле mailtest.php, который положим в корень нашего проекта. Вот его содержимое:
// Читаем настройки config require_once($_SERVER['DOCUMENT_ROOT'].'/config.php'); // Подключаем класс FreakMailer require_once($_SERVER['DOCUMENT_ROOT'].'/lib/MailClass.inc'); // инициализируем класс $mailer = new FreakMailer(); // Устанавливаем тему письма $mailer->Subject = 'Это тест'; // Задаем тело письма $mailer->Body = 'Это тест моей почтовой системы!'; // Добавляем адрес в список получателей $mailer->AddAddress('foo@host.com', 'Eric Rosebrock'); if(!$mailer->Send()) { echo 'Не могу отослать письмо!'; } else { echo 'Письмо отослано!'; } $mailer->ClearAddresses(); $mailer->ClearAttachments();
Давайте разберем этот код для лучшего его понимания.
Сначала мы подключаем наш конфигурационный файл, чтобы иметь доступ к массиву $site.
Далее, подключаем класс FreakMailer.
Теперь необходимо инициализировать наш класс расширения, а также класс PHPMailer.
// Читаем настройки config require_once($_SERVER['DOCUMENT_ROOT'].'/config.php'); // Подключаем класс FreakMailer require_once($_SERVER['DOCUMENT_ROOT'].'/lib/MailClass.inc'); // инициализируем класс $mailer = new FreakMailer();
Теперь PHPMailer готов и мы идем дальше.
Задаем тему письма и его содержание.
// Устанавливаем тему письма $mailer->Subject = 'Это тест'; // Задаем тело письма $mailer->Body = 'Это тест моей почтовой системы!';
Если вы используете в качестве письма обычный текст, то необходимо разделять строки или . И вы должны использовать двойные кавычки при определении переменной $mailer->Body. Если вы используете одинарные кавычки, то перенос текста с одной строки на другую возможен с помощью клавиши .
Теперь необходимо добавить адрес получателя.
// Добавляем адрес в список получателей $mailer->AddAddress('foo@host.com', 'Eric Rosebrock');
Далее, посылаем сообщение и обрабатываем ошибки, если возникли.
В случае ошибки – вы увидите сообщение "Не могу отослать письмо!", в противном случае — "Письмо отослано!".
if(!$mailer->Send()) { echo 'Не могу отослать письмо!'; } else { echo 'Письмо отослано!'; }
Далее, мы очищаем список адресатов и список вложений.
$mailer->ClearAddresses(); $mailer->ClearAttachments();
Если вам только что пришло сообщение, которое вы отослали с помощью PHPMailer, – поздравляю!
Основные проблемы
Вот список некоторых (типичных) проблем, которые могут возникнуть у вас при отправлении почты при помощи PHPMailer (вероятнее всего, эти проблемы у вас возникли бы и при обычном отправлении писем):
- на вашей машине не установлено или не запущено ни одного SMTP сервера;
- неправильные настройки внутри PHP скрипта, перечитайте обучающий курс еще раз;
- Сервер Apache не разрешает релей через SMTP сервер на локальной машине (типичный случай);
- вы не правильно определили получателя письма.
Но, если у вас все заработало, давайте перейдем к отправке писем с определенными особенностями.
Использование дополнительных возможностей PHPMailer
Если вы уже здесь, но не читали при этом предыдущего материала – вернитесь и прочитайте, потому что здесь мы будем заниматься расширением базового примера.
PHPMailer имеет множество особенностей, например, добавление вложений, рассылка по списку адресатов и др. В этой части нашего материала мы с вами посмотрим, как это выглядит на практике.
Обработка адресов электронной почты
PHPMailer поддерживает много особенностей Адреса электронной почты, типа "Для" TO, "от" FROM и списков получателей, точная копия CC и Слепая точная копия BCC, Reply-TO и др. Давайте посмотрим, как использовать эти особенности.
Помните, что мы опираемся на основной пример, приведенный выше.
Добавление адреса отправителя (FROM)
В нашем основном примере адрес отправителя уже задан посредствам config.php и класса расширения, но вы в любой момент можете его переопределить. Например:
$mailer->FromName = 'Ваше Имя'; $mailer->From = 'You@yourdomain.com';
Если не определить FromName, то большинство почтовых клиентов в качестве имени подставят емаил.
Добавление адреса для ответа (Reply-To)
Поумолчанию, адрес для ответа совпадает с адресом, с которого вы отослали письмо (FROM). Однако вы можете определить разные адреса для ответа на ваше письмо:
$mailer->AddReplyTo('billing@yourdomain.com', 'Департаменту оплаты');
ЗАМЕЧАНИЕ:
Вы можете задать несколько адресов для ответа. Для этого необходимо продублировать приведенный выше код столько раз, сколько вы имеете адресов (не забудьте в примере менять адреса на нужные вам).
Добавление нескольких получателей
Этот метод позволяет вам добавить нескольких получателей для письма. Я не рекомендую этот способ для анонимных листов рассылки. Смотрите позже пример для списка рассылки.
Для добавления нескольких получателей вы должны повторить вызов функции AddAddress столько раз, скольким людям вы хотите отослать ваше сообщение. Далее, пример для трех адресатов. В данном примере адрес является обязательным, а имя адресата опциональным и может быть опущено.
$mailer->AddAddress('recipient1@domain.com', 'Первый человек'); $mailer->AddAddress('recipient2@domain.com', 'Второй человек'); $mailer->AddAddress('recipient3@domain.com', 'Третий человек');
ЗАМЕЧАНИЕ:
Не рекомендуем пользоваться этим методом для рассылки по списку адресатов! Каждый получатель вашего письма будет видеть ВЕСЬ список получателей, а, затем, сможет использовать его по своему усмотрению. Позже мы расскажем как правильно отсылать письма по списку адресатов.
Добавить получателей точной копии (CC)
Вы можете добавить получателей точной копии точно также, как и предыдущих примерах, используя функцию AddCC.
$mailer->AddCC('recipient1@domain.com', 'Первый человек'); // Если вам надо добавить более чем одного – просто повторяйте эту команду! $mailer->AddCC('recipient2@domain.com', 'Второй человек'); $mailer->AddCC('recipient3@domain.com', 'Третий человек');
Добавление получателей слепой точной копии (BCC)
Невидимых получателей или BCC можно добавить используя следущую функцию:
$mailer->AddBCC('recipient1@domain.com', 'Первый человек'); // Если вам надо добавить более чем одного BCC, просто продолжайте! $mailer->AddBCC('recipient2@domain.com', 'Второй человек'); $mailer->AddBCC('recipient3@domain.com', 'Третий человек');
Требование подтверждения прочтения
Если вы хотите запросить у человека, читающего ваше письмо, подтверждение о прочтении, подайте следующую команду:
$mailer->ConfirmReadingTo = 'you@youdomain.com';
Теперь, когда мы рассмотрели все адреса для отправки почты, давайте посмотрим, как посылать письма ввиде HTML!
Отправление писем ввиде HTML при помощи PHP и PHPMailer
Формирование HTML письма – это одна из самых сложных задач при отправке почты средствами PHP. Настройка MIME заголовков и построение HTML – нелегкая задача и требует дополнительных знаний и исследований. Однако, PHPMailer сделает вашу жизнь проще, далее, мы покажем как это реализуется.
Важное замечание относительно почты ввиде HTML
Прежде чем мы приступим к отправке таких писем, я хотел бы, чтобы вы поняли, что важно знать о том, каким образом должны подключаться изображения и стили CSS, и т.д. Простое правило состоит в том, чтобы хранить эти файлы на сервере, а в письме давать полные ссылки на них. Если вы сходите сума и добавляете все эти файлы к письму, то готовьтесь к головной боли. Например, тело моего письма выглядит примерно так:
www.sesmikcms.ru
function sendemail_to_all($fromemail, $fromname, $subject, $message, $data) {
date_default_timezone_set("Europe/Moscow"); // временная зона
require "PHPMailerAutoload.php"; // подключили скрипт
$mail = new PHPMailer(); // инициализация класса
file_exists("/language/phpmailer.lang-ru.php") ? $mail->SetLanguage("ru", "/language/") : $mail->SetLanguage("en", "/language/"); // языковой пакет
$mail->isSMTP(); // указали, что работаем по протоколу смтп
$mail->Host = "smtp.yordomain.ru"; // хост
$mail->Port = "25"; // порт
$mail->SMTPAuth = true; // аутентификация включена
$mail->Username = "name@yourdomain.ru"; // реальный ящик, желательно совпадающий с вашим доменным именем
$mail->Password = "123456789"; // пароль от ящика
$mail->CharSet = "UTF-8"; // кодировка
$mail->setFrom($fromemail, $fromname); // от кого
$mail->addReplyTo($fromemail, $fromname); // кому ответить
$mail->Subject = $subject; // тема письма (заголовок)
$plain = $mail->html2text($message); // тело альтернативного письма
$mail->isHTML(true);
$img_path = "/images/mylogo.png"; // адрес логотипа
$img_cid = md5($img_path); // сид логотипа
$img_name = "mylogo"; // имя логотипа
$mail->addEmbeddedImage($img_path, $img_cid, $img_name); // добавили в тело письма логотип
$body = "<!DOCTYPE html>"; // создаем тело письма
$body .= "<html><head>"; // структуру я минимизирую, шаблонов в сети много, либо создайте свой
$body .= "<meta charset='UTF-8' />";
$body .= "<title>".$subject."</title>";
$body .= "</head><body>";
$body .= "<table><tr><td>";
$body .= "<table style='width:600px'><tr><td>";
$body .= "<a href='http://www.meweb.ru/' title='MeWEB' target='_blank'><img src='cid:".$img_cid."' alt='MeWEB' /></a></td>"; // указали место, где будет отображен логотип
$body .= "<td>";
$body .= "<a href='http://www.meweb.ru/' title='MeWEB' target='_blank'>MeWEB</a><br /><br /><a href='mailto:".$fromemail."'>".$fromemail."</a></td></tr>";
$body .= "<tr><td colspan='2'> </td></tr>";
$body .= "<tr><td colspan='2'><h3 syle='text-align:center'>Здравствуйте, {USER_NAME} !</h3>".nl2br($message)."<br /><br />Чтобы отписаться от рассылки, перейдите по ссылке <a href='http://www.meweb.ru/mailer/unsubscribe.php?delete={USER_ID}' target='_blank'>Отписаться</a></td></tr>"; // вывели в тело имя пользователя и само сообщение с ссылкой для отписки
$body .= "<tr><td colspan='2'><em>All rights reserved | Copyright © <a href='http://www.meweb.ru/' title='MeWEB' target='_blank'>MeWEB</a> ".date("Y")."</em></td></tr>";
$body .= "</table></td></tr></table>";
$body .= "</body></html>";
$mail->msgHTML($body); // формируем тело
$mail->AltBody = $plain; // альтернативное тело письма
$i = 0;
foreach ($data as $row) { // проход по массиву из бд
unset($user); // вначале каждый раз очищаем переменную
$user = $row['user_id']; // уникальный id пользователя
$mail->addCustomHeader("Precedence", "bulk"); // добавили заголовок, чтобы дать понять почтовым сервисам, что это рассылка
$mail->AddCustomHeader("List-Unsubscribe", "<http://www.meweb.ru/mailer/unsubscribe.php?delete=".$user.">"); // добавили заголовок с ссылкой для отписки от рассылки
$mail->addAddress($row['user_email'], $row['user_name']); // добавили адрес и имя получателя
$mail->Body = str_replace(array("{USER_NAME}", "{USER_ID}"), array($row['user_name'], $user), $body); // вставляем в сообщение имя пользователя и уникальный id для ссылки
$mail->AltBody = str_replace(array("{USER_NAME}", "{USER_ID}"), array($row['user_name'], $user), $plain); // аналогично для альтернативного сообщения
if (!$mail->send()) { // если письмо не отправлено
$return[] = "ierror | ".$row['user_name']." | ".str_replace("@", "@", $row['user_email'])." ".$mail->ErrorInfo." | ".date("d-m-Y в H:i:s"); // возвращаем массив с ошибкой
break; // останавливаем перебор массива
} else { // если отправка прошла удачно
$return[] = "isuccess | ".$row['user_name']." | ".str_replace("@", "@", $row['user_email'])." | ".date("d-m-Y в H:i:s"); // возвращаем массив с отчетом
($i % 2 == 0) ? sleep(0.2) : sleep(0.4); // делаем паузу при рассылке между сообщениями
}
$mail->clearAddresses(); // в цикле чистим адрес, чтобы при новом проходе добавить другой
$mail->clearCustomHeaders(); // чистим в цикле заголовки, чтобы при новом проходе добавить новые
$i++;
}
$mail->clearAttachments();
$mail->clearReplyTos(); // очищаем
return $return; // функция возвращает нам результат в массиве
}
www.meweb.ru