Офис НП AMWAY в Ярославле
Купить продукцию Амвей в Ярославле, офис 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 Pisatel Добавлено  27-04-2015 15:31 27 Апрель 2015 15:31:14 100850  Прочтений 100850 Прочтений
Обновлено: 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
        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
1
2
3
require_once "mailer/sendemail.php";
$sending = sendemail("от_кого@домен.ру", "Ваше_имя", "кому@домен.ру", "Имя_кому", "Тема_письма", "Сообщение");
echo "<div>".$sending."</div>";


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

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

Код: PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
     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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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. Это, конечно, далеко не все его возможности, и если будет время, как–нибудь мы еще поговорим о нем. Удачи всем и всего самого доброго.
Понравилась статья?
Метки для данной статьи
Похожие статьи
Поделиться:   
Последние активные темы форума
  Темы Просмотров Ответов Последние сообщения