Не так давно знадобилося написати невеликий скрипт для власних потреб. Про нього сьогодні ми і поговоримо. Мова програмування — 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.=”
“; else $report.=”
“;
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=<<
Поштові адреси
Текст листа
$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.
Можна вставити себе останнім у списку, щоб проконтролювати відправку. Раптом щось станеться з файлом
Сподіваюся, ця стаття допоможе вам в освоєнні мови програмування PHP.
E-mail: [email protected]
Проект webformyself.com — Як створити свій сайт. Основи самостійного сайтобудування
P. S. Хочете опублікувати цікавий тематичний матеріал і заробити? Якщо відповідь «Так», то тисніть сюди.