Простий скрипт email розсилки

13

Не так давно знадобилося написати невеликий скрипт для власних потреб. Про нього сьогодні ми і поговоримо. Мова програмування — PHP. Приступимо.

Постановка задачі і вибір методів її розв’язування

Завдання: написати максимально швидко і просто скрипт для відправки e-mail повідомлення на n-ну кількість адрес. Справа в тому, що іноді потрібно надіслати листа декільком адресатам, але так, щоб вони один про одного не знали. Тобто, виключаємо тупе копіювання всіх адрес через кому в полі «Кому».

Завантажити вихідний код собі на комп’ютер!

Мова програмування — PHP.

Приступимо.

Чому PHP? Та тому що на PHP це зробити дуже просто і він стоїть на будь-якому хостингу (платний звичайно). Тим більше, скрипт не потрібно зберігати на комп’ютері, а краще залити на сервер і користуватися звідки завгодно. Навіть з мобільника.

Якщо говорити простою мовою, ми пишемо невеликий скрипт e-mail розсилки. Відразу ж у голові народжується подання роботи скрипта.

У нас є форма з полями:

Кому (одержувачів)

Тема повідомлення

Текст повідомлення

Адреса відправника (вибір з переліку)

Схема роботи: Вводимо дані і натискаємо «Відправити» → відбувається відправка листів → отримуємо звіт.

Є також кілька особливостей. Для відправки листів бажано використовувати невеликий тайм-аут, щоб наш сервер не порахували спаммером. Звіт бажано записати в невеликий текстовий файл. Потрібно захистити скрипт від несанкціонованого використання.

Пишемо скрипт

Тут я не буду описувати процес написання, а просто наведу максимально откомментированный код.

Ви не ввели тему листа‘;
} elseif (empty($emailer_mails) || $emailer_mails==»Поштові адрсе») {
// Якщо адрес немає…
$mail_msg=’Не вказано адреси одержувачів‘;
} elseif (empty($emailer_text) || $emailer_text==»Текст листа») {
// Якщо повідомлення пусте…
$mail_msg=’Ви не ввели текст листа‘;
} else { // Якщо всі поля заповнені вірно…
// Готуємо повідомлення про успішну відправку… Раптом у вас якийсь незвичайний браузер
$mail_msg=’Ваше повідомлення надіслано.
Натисніть тут, якщо ваш браузер не підтримує перенаправлення.’;
// Готуємо заголовки листа… Будемо відправляти листи у форматі HTML і кодуванні UTF-8
$headers=»MIME-Version: 1.0\r\n»;
$headers.=»Content-type: text/html; charset=utf-8\r\n»;
$headers.=»From: $emailer_yourmail»;
// Обробка листи. Потрібно видалити зайві пробіли і проставити переноси.
$emailer_text=preg_replace(«/ +/»,» «,$emailer_text); // множинні пробіли замінюються на одинарні
$emailer_text=preg_replace(«/(\r\n){3,}/»,»\r\n\r\n»,$emailer_text); // прибираємо зайві переноси (більше 1 рядка)
$emailer_text=str_replace(«\r\n»,»
«,$emailer_text); // ставимо переноси
// Отримуємо масив адрес. Як роздільник у нас використовується кома.
$emails=explode(«,», $emailer_mails);
$count_emails = count($emails); // Підрахунок кількості адрес
// Запускаємо цикл відправки повідомлень
for ($i=0; $i<=$count_emails-1; $i++) // Звіт починається в масиві з нуля, тому зменшуємо суму на одиницю
{
// Підставляємо адреси получаетелей і обрізаємо прогалини з обох сторін, якщо такі є
$email=trim($emails[$i]);
// Відправляємо лист і готуємо звіт по відправці
if($emails[$i]!=»») { // Перевірка на випадок потрапляння у масив порожнього значення
if(mail($email,$emailer_subj,$emailer_text,$headers)) $report.=»

  • Відправлено: «.$emails[$i].»
  • «; else $report.=»

  • Не відправлено: «.$emails[$i].»
  • «;
    sleep(5); // Робимо тайм-аут в 5 секунд
    }
    }
    // Запис звіту у файл. Файл буде згенеровано в тій же папці, під назвою log.txt. Перевірте налаштування прав папки.
    $log=fopen(«log.txt»,»w»);
    fwrite($log,$report);
    fclose($log);
    // Змінна $sent – ознака успішної відправки
    $sent=1;
    }
    } else { // Якщо в масиві POST порожньо, форма ще не передавалася
    // Готуємо запрошення
    $mail_msg=’Всі поля обов’язкові для заповнення.’;
    // Поля теми, адрес получаетелей і одержувачів, і тексту в цьому випадку повинні бути порожніми
    $emailer_text=$emailer_subj=$emailer_mails=$emailer_yourmail=»;
    }
    // Якщо $sent не існує, виводимо форму або звіт
    if (!isset($sent)) {
    // Якщо повідомлення надіслано виводимо звіт
    if(isset($_GET[‘messent’]))
    {echo $text=»Все окей. Повідомлення надіслано. Ще?

    Звіт: «;
    readfile(«log.txt»);
    echo»»;}
    else {
    // Або виводимо форму, якщо повідомлення ще не відправлене
    echo $text=<<$mail_msg

    Поштові адреси
    Текст листа
    $tmail1
    $tmail2
    $tmail3
    post;
    }
    }
    else { // якщо існує…
    // Посилаємо в заголовку редирект (303 Refresh) на цю ж адресу з додатковим параметром messent
    $ret_uri=$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];
    header(«Refresh: 0; URL=http://».$ret_uri.»?messent»);
    exit;
    }
    ?>

    Захист скрипта

    Створіть папку, де буде знаходитися скрипт, і покладіть туди файл .htaccess, з таким змістом. Ці кілька рядків обмежать доступ по IP адресою.

    Order Deny,Allow
    Deny from all
    Allow from ваш IP

    Або, якщо у вас не постійна IP адреса, можна додати пароль.

    if (!isset($_SERVER[‘PHP_AUTH_USER’])) {
    // посилаємо браузеру запит логіна/пароля
    header(«WWW-Authenticate: Basic realm=\»Enter login and password\»»);
    header(«HTTP/1.0 401 Unauthorized»);
    exit;
    } else {
    if($_SERVER[‘PHP_AUTH_USER’]!==’Ваш логін’ && $_SERVER[‘PHP_AUTH_PW’]!==’Ваш пароль’)
    {
    header(«WWW-Authenticate: Basic realm=\»Enter login and password\»»);
    header(«HTTP/1.0 401 Unauthorized»);
    exit(‘Введений невірний логін або пароль’);
    }
    else {
    //Сюди потрібно вставити тіло скрипта
    }

    Доробка скрипта

    Звичайно, можна нескінченно допрацьовувати цей скрипт, адже рішення написано «на коліні», проте свою функцію він виконує. Неодноразово користувався ним і збоїв не було.

    Наприклад, можна задавати список адрес отримувачів з текстового файлу (можна прямо вибирати адреси з тексту). Або зробити відправку з допомогою перезапуску роботи скрипта (щоб не було проблем з функцією set_time_limit () на будь-якому хостингу). Або писати докладні звіти і посилати їх на ваш e-mail.

    Можна вставити себе останнім у списку, щоб проконтролювати відправку. Раптом щось станеться з файлом Простий скрипт email розсилки

    Сподіваюся, ця стаття допоможе вам в освоєнні мови програмування PHP.

    E-mail: [email protected]

    Проект webformyself.com — Як створити свій сайт. Основи самостійного сайтобудування

    P. S. Хочете опублікувати цікавий тематичний матеріал і заробити? Якщо відповідь «Так», то тисніть сюди.