Офис НП AMWAY в Ярославле
Купить продукцию Амвей в Ярославле
На карте Купить AMWAY в ЯрославлеПриобрести высококачественную продукцию Амвей в Ярославле, получить консультации по бизнесу, заказать продукцию или получить заказ:
Адрес: улица Валентины Терешковой, дом 1 (Вход со двора)
Телефон: +7 (920) 112-00-91
Email: matyxho@mail.ru
Сайт: https://www.amway.ru/user/lebedem
Визитка: http://yar.meweb.ru
Иерархия статей
Статьи » Программирование » PHPMailer: установка, подключение, настройка скрипта
Сниппет
Весьма качественный и полезный скрипт для рассылки (отправки) email сообщений с вашего сайта. Приведу пару примеров его настройки: отправка письма с вложением и массовая рассылка с вложением.
PHPMailer: установка, подключение, настройка скрипта
Опубликовал  Pisatel Добавлено  27-04-2015 15:31 27 Апрель 2015 15:31:14 17946  Прочтений 17946 Прочтений  7 Комментариев 7 Комментариев
Обновлено: 27-04-2015 15:53 Обновлено: 27 апреля 2015 15:53:29  printer
В статье расскажу об установке и настройке скрипта для отправки email сообщений PHPMailer, скачать который можно здесь: https://github.co.../PHPMailer. Нам потребуются файлы и директории:
  • /language/
  • PhpMailerAutoload.php
  • class.phpmailer.php
  • class.smtp.php
  • class.pop3.php
Итак, создадим папку, например, /mailer/, и все файлы скрипта загрузим в нее. Ну а далее я приведу пару примеров функции для отправки письма (писем). Не буду останавливаться на письмах в стандарте text, все наши письма будут в стандарте html. Итак, начнем с самого простого: функция для отправки письма с изображением (логотип сайта), но без аутентификации smtp:

Код: PHP
        function sendemail($fromemail, $fromname, $toemail, $toname, $subject, $message) {

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->isMAIL(); // указали, что не смтп

$mail->CharSet = "UTF-8"; // кодировка заголовков

$mail->setFrom($fromemail, $fromname); // от кого

$mail->addReplyTo($fromemail, $fromname); // адрес и имя для ответа

$mail->Subject = $subject; // заголовок письма (тема сообщения)

$plain = $mail->html2text($message); // создаем текстовую версию для устройств, не поддерживающих html

$mail->isHTML(true); // указали, что сообщение в стандарте html

$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'>&nbsp;</td></tr>";

$body .= "<tr><td colspan='2'><h3 syle='text-align:center'>".$subject."</h3>".nl2br($message)."</td></tr>"; // вывели в тело тему письма и само письмо

$body .= "<tr><td colspan='2'><em>All rights reserved | Copyright &copy; <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; // альтернативное тело письма

$mail->addAddress($toemail, $toname); // добавляем получателя и отправляем

if (!$mail->send()) { // если произошла ошибка при отправке

$return = $toname." | ".str_replace("@", "&#64;", $toemail)." ".$mail->ErrorInfo." | ".date("d-m-Y в H:i:s"); // возвращаем сообщение об ошибке

} else {

$return = $toname." | ".str_replace("@", "&#64;", $toemail)." | ".date("d-m-Y в H:i:s");

} // если сообщение отправлено удачно- возвращаем время отправки

$mail->clearAddresses();

$mail->clearCustomHeaders();

$mail->clearAttachments();

$mail->clearReplyTos(); // чистим все заголовки

return $return;

}




Пример использования функции. Назовем наш файл с функцией sendemail.php и кинем в нашу папку /mailer/:

Код: PHP
    require_once "mailer/sendemail.php";

$sending = sendemail("от_кого@домен.ру", "Ваше_имя", "кому@домен.ру", "Имя_кому", "Тема_письма", "Сообщение");

echo "<div>".$sending."</div>";




Как видим, в принципе, ничего сложного нет. Функция вернет нам результат отправки.

Ну а в следующем примере я чуть усложню задачу: мы будем использовать SMTP и отправим письма сразу нескольким пользователям, но это будут не копии (скрытые копии) CC и BCC, а именно рассылка. То есть, фактически, ниже будет небольшой скрипт спамера))) Имена и email мы будем брать из бд. В заголовках письма и в самом письме будем посылать ссылку для отписки, чтобы меньше было шансов попасть в спам-лист почтовых сервисов. Для этого нужно будет создать страницу, перейдя на которую пользователь сразу автоматически отпишется от рассылки. Например, страница будет называться unsubscribe.php, а в качестве идентификатора пользователя мы будем передавать его уникальный id, под которым он существует в нашей бд. Что ж, начнем:

Код: PHP
     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'>&nbsp;</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 &copy; <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("@", "&#64", $row['user_email'])." ".$mail->ErrorInfo." | ".date("d-m-Y в H:i:s"); // возвращаем массив с ошибкой

break; // останавливаем перебор массива

} else { // если отправка прошла удачно

$return[] = "isuccess | ".$row['user_name']." | ".str_replace("@", "&#64", $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; // функция возвращает нам результат в массиве

}




Далее — пример использования функции. Поместим ее в нашу папку /mailer/ в файл с именем sendemail_to_all.php. Априори подразумевается, что бд с пользователями (id, name, email) у вас уже существует и все подключения к ней выполнены. Поехали:

Код: PHP
    require "mailer/sendemail_to_all.php"; // подключили нашу функцию

$result = mysqli_query($db, "SELECT user_id, user_name, user_email FROM myusers"); // сделали выборку из базы

if (mysqli_num_rows($result)) { // если результат больше 0

while($arrs = mysqli_fetch_assoc($result)) { // запускаем цикл

$data[] = $arrs; // и формируем массив с данными пользователей

}

$sending = sendemail_to_all("mymail@mydomain.ru", "MyName", $subject, $message, $data); // отправляем письмо всем и записываем результат в переменную в виде массива, который отдаст функция

} else { иначе, если пользователей 0

$sending = "<div style='text-align:center'>База пуста!</div>"; // задаем переменную с сообщением

}

$onw = "";

$c = 0;

if (is_array($sending)) { // если переменная является массивом

foreach($sending as $wmess) { // проходим циклом

$m = explode(" | ", $wmess); // разбиваем строку по разделителю, превращая в массив, чтобы удобнее обращаться к элементам

$onw .= "<div>".((strpos($m[0], "isuccess") !== false) ? "<span style='color:green'>Отправлено: </span>" : "<span style='color:red'>Ошибка: </span>")." Имя: ".$m[1]." Email: ".$m[2]." Время: ".$m[3]."</div>";

$c++;

}

$all = $c; // счетчик

} else {

$onw .= $sending;

$all = 0;

}

echo $onw; // выводим результат

echo "Всего отправлено: ".$all;




Конечно, вышеприведенный скрипт не претендует на самое элегантное решение, однако он вполне работоспособен и неплохо справляется со своей непосредственной задачей — отправкой email сообщений группе пользователей.

Страницу для отписки, думаю, состряпаете сами, если возникнут вопросы или трудности — пишем в комментариях.

На этом заканчиваю. Основной целью данной статьи была необходимость показать, как работает скрипт PHPMailer. Это, конечно, далеко не все его возможности, и если будет время, как–нибудь мы еще поговорим о нем. Удачи всем и всего самого доброго.
Понравилась статья?
Метки для данной статьи
Похожие статьи
Поделиться:   
Комментарии
#1 | мик 28 октября 2017 15:49:11
No Avatar
Гость
ни*** не понял ....Агрессивный

пойду гетхаб транслятором лучше переведу почитаю
#2 | Pisatel 28 октября 2017 23:59:47
Avatar
Отсутствует
Супер Администратор
Активный
С 03. февраля 2013
мик, не знаю, как еще доступнее написАть.
Я не европеец. И не азиат. Я русский. Я россиянин. Я за истинные семейные христианские ценности. И это - моя национальная идея.
#3 | Jamshid 14 января 2018 19:16:56
No Avatar
Гость
Привет! все хостинге порт так бывает 25
#4 | Pisatel 23 января 2018 17:59:27
Avatar
Отсутствует
Супер Администратор
Активный
С 03. февраля 2013
Jamshid, здравствуй. Это вопрос или утверждение?
Я не европеец. И не азиат. Я русский. Я россиянин. Я за истинные семейные христианские ценности. И это - моя национальная идея.
#5 | German 20 февраля 2018 20:17:43
No Avatar
Гость
Короче спамкреэйтер вышел из этого скрипта. Все написал как в статье, подключил базу и SMTP отправил непонятное количество писем (около 32к). При этом скрипт ошибок не выдал. К слову нужно было отправить 950 писем. Но это не все. Он шлет по одному письму только в первую итерацию массива. Если вдруг произошел break то он шлет уже по два письма каждому. У меня дошло до 290 писем каждому. Кроме, дробный seep может существовать? В целом задумка не плохая, но давайте до ума доводить.
#6 | Pisatel 19 апреля 2018 19:58:26
Avatar
Отсутствует
Супер Администратор
Активный
С 03. февраля 2013
German, задумка неплохая, но это дела давно минувших дней)))
Я не европеец. И не азиат. Я русский. Я россиянин. Я за истинные семейные христианские ценности. И это - моя национальная идея.
#7 | Georggab 27 апреля 2018 13:40:41
No Avatar
Гость
В случае, когда у клиента появилась необходимость приобретения песка или щебня и его доставки http://www.gravel-sand.ru к строительному объекту, наша компания окажет эти услуги по вполне разумной цене. Поскольку, несомненно, при выборе поставщика нерудных материалов главным из того, на что обращает внимание покупатель, является именно стоимость услуг. Ответственный подход к выполнению работы позволяет гарантировать, что заказанные материалы окажутся на вашем строительном объекте вовремя. Более подробную информацию об условиях сотрудничества можно получить, позвонив в отдел продаж компании.
c.radikal.ru/c28/1804/08/26d530685566.jpg
Добавить комментарий
Имя:

Проверочный код:
Последние активные темы форума
  Темы Просмотров Ответов Последние сообщения
folder Вопрос по переделке bb-кода
PHP, MySQL
1563 5 Pisatel
26. мая 2017
folder Вопросы по Ajax форме обратной связи
CMS PHP Fusion
7453 48 Ditrin
19. февраля 2017
folder BBCode YouTube Video Colorbox mod
CMS PHP Fusion
6466 2 Pisatel
10. декабря 2016
folder Как лучше создать собственную страницу?
CMS PHP Fusion
4584 17 Pisatel
11. мая 2016
folder Небольшие вопросы по скриптам магазина и катало...
PHP, MySQL
41715 80 Pisatel
11. января 2016
folder BBCode Code mod
CMS PHP Fusion
3072 0 Pisatel
31. августа 2015
folder Ajax Like Dislike Article Panel
CMS PHP Fusion
5883 16 Pisatel
07. июля 2015
folder Хлебные крошки / BreadCrumbs SEO Panel
CMS PHP Fusion
6493 17 Pisatel
04. июля 2015
folder Abbr Description BBCode
CMS PHP Fusion
2290 0 Pisatel
15. июня 2015
folder Плагин Email рассылки Mail To All by Pisatel
CMS PHP Fusion
9151 32 Pisatel
26. апреля 2015
folder Подозрительный трафик и прочие страшилки
Всякая хрень
3942 2 Ditrin
23. апреля 2015
folder Мод Newsletter - рассылка писем пользователям с...
CMS PHP Fusion
5626 13 Pisatel
10. апреля 2015
folder Мод отправки писем PHPMailer для PHP-Fusion
CMS PHP Fusion
28353 113 Ditrin
06. апреля 2015
folder Появление неизвестного файла subscriptions.php
CMS PHP Fusion
2784 2 Pisatel
06. апреля 2015
folder Autoban on IP
CMS PHP Fusion
11397 13 Pisatel
03. апреля 2015