Рис.1 HTML-код форми зворотнього зв'язку
Як зрештою виглядає наведена тут форма зворотного зв'язку, можна подивитися на наступному скріншоті.
Таким чином, потрібна форма створена. І тепер можна перейти до питань обробки та надсилання даних у вигляді поштового повідомлення.
Встановлюємо бібліотеку PHPMailer
Як зазначалося раніше, для відправки пошти ми будемо використовувати бібліотеку PHPMailer, яка дозволить суттєво спростити відправку email через протокол SMTP з авторизацією на сторонньому поштовому сервісі.
Для її встановлення потрібно завантажити необхідні файли. Це можна зробити з веб-сервісу GitHub, використовуючи для цього Composer ( пакетний менеджерзалежностей для PHP). Або просто, завантажити необхідні файли звичайним чином.
скріншот 73
Нижче показано сторінку веб-сервісу GitHub, де зазначено посилання на звичайне завантаження бібліотеки PHPMailer.
Крім цього, останню версію 6.0.7, яка була збережена на момент написання цієї статті, можна завантажити з матеріалів, що додаються.
У будь-якому випадку отриманий архівний файл слід розпакувати, після чого витягнуту папку PHPMailer-master з усім вмістом помістити в корінь сайту. При цьому для простоти можна її перейменувати в PHPMailer. Нижче наведено вміст папки PHPMailer, розміщеної в кореневий каталог сайту.
Таким чином, ми встановили бібліотеку PHPMailer. Після чого можемо зайнятися формуванням скрипту, за допомогою якого надсилатимемо з нашого сайту поштові повідомлення.
Формуємо скрипт надсилання пошти через SMTP
Для складання скрипта цілком достатньо скористатися рекомендаціями щодо застосування PHPMailer, наведеними на сторінці GitHub, яку ми використовували для скачування бібліотеки.
У них, зокрема, зазначається, що на початку скрипту потрібно імпортувати класи PHPMailer у глобальний простір імен. І надано конкретні рядки відповідного коду. А також наведено приклади використання властивостей та методів PHPMailer, у тому числі і для варіанта надсилання пошти через SMTP.
Але якщо цього недостатньо, можна скористатися і документацій, у якій є опис всіх властивостей і методів цієї бібліотеки.
скріншот 74
Нижче наведено код скрипту надсилання пошти з форми зворотного зв'язку через авторизацію SMTP. Де всі рядки, що стосуються PHPMailer, дано з пояснення та виділено світлим тлом.
Решта, включаючи фрагменти, що стосуються отримання та обробки даних із форми, які нам раніше вже доводилося використовувати в інших обробниках, позначені темним тлом. Досить докладно про них йшлося раніше у статті, присвяченій саме питанням отримання та перевірки даних з форми в PHP. Де також розповідалося про універсальну користувальницьку функцію перевірки та обробки даних форми check_symbol().
Даний скрипт розмістимо в тому самому файлі kontakty.php, в якому ми сформували форму зворотного зв'язку.
//----Скрипт надсилання пошти через SMTP за допомогою PHPMailer----
//Імпорт класів PHPMailer до глобального простору імен. Вони мають бути у верхній частині скрипту, а не всередині функції
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
if
(!empty($_POST["contact-button" ])) (
$name = $_POST["contact-name"];
$name = check_symbol ($name, "Ім'я", "1", "/^+\z/iu");
$email = $_POST["contact-email" ];
$email = check_symbol ($email, "E-mail", "1", "/^+@(+\.)+(2,6)\z/i");
$subject = $_POST["contact-subject"];
$subject = check_symbol ($subject, "Тема повідомлення", "1", "0");
$comment = $_POST["contact-comment"];
$comment = check_symbol ($comment, "Текст повідомлення", "1"
, "0"
);
if
(!empty($GLOBALS["alert" ])) (
$alert = "Дані з форми не надіслано. Виявлено такі помилки: \n".$alert;
include"alert.php";
else
{
//Підключення бібліотеки
require"PHPMailer/src/PHPMailer.php";
require"PHPMailer/src/Exception.php";
require"PHPMailer/src/SMTP.php";
$mail = new PHPMailer(); //Ініціалізація класу
$from = " [email protected]"
; //Адреса пошти, з якої йде відправка листа
$to = " [email protected]"
; //Адреса одержувача
$mail -> isSMTP(); //Застосування протоколу SMTP
$mail -> Host = "smtp.yandex.ru"; //Адреса поштового сервера
$mail -> SMTPAuth = true
; //Включення режиму авторизації
$mail -> Username = " [email protected]"
; //Логін від доменної пошти, підключеної до стороннього поштового сервісу (в даному випадку в Яндекс.Пошта)
$mail -> Password = "27MrDon89"; //Пароль від доменної пошти
$mail -> SMTPSecure = "ssl"; //Протокол шифрування
$mail -> Port = "465"; // Порт сервера SMTP
$mail -> CharSet = "UTF-8"; //Кодування
$mail -> setFrom ($from, "Адміністратор"); //Адреса та ім'я відправника
$mail -> addAddress ($to, "Адміністратор"); //Адреса та ім'я одержувача
$mail -> isHTML ( true
); //Встановлення формату електронної пошти в HTML
$mail -> Subject = "Відправлено форму зворотного зв'язку"; //Тема листа (заголовок)
$mail -> Body = "
Ім'я відправника: $name
Адреса відправника: $email
Тема повідомлення: $subject
Зміст повідомлення: $comment
"
; //Вміст листа
$mail -> AltBody = "Текст альтернативного листа"; //Альтернативний лист у разі, якщо поштовий клієнт не підтримує HTML
$mail -> SMTPDebug = 0; //Включення налагодження SMTP: 0 - вимк (для штатного використання), 1 = повідомлення клієнта, 2 - повідомлення клієнта та сервера
if($mail -> send ()) (
$alert = "Повідомлено"; //Виведення повідомлення в діалоговому вікні браузера про успішне надсилання листа
else
{
$alert = "Помилка, лист може бути відправлено: ".$mail -> ErrorInfo ; //Виведення повідомлення про помилку
include"alert.php";
Рис.5 Скрипт для надсилання електронної пошти через SMTP з авторизацією
Як видно, всі рядки, які стосуються безпосередньо відправки поштового повідомлення, в яких задані необхідні методи та властивості, супроводжуються коментарями. Тому не має сенсу повторюватися, а можна зупинитися лише на деяких із них, які дійсно потребують додаткових пояснень, а саме:
1. У зв'язку з тим, що лист надсилається зі стороннього поштового сервісу, тут застосовані налаштування, що відповідають конкретному SMTP серверу. В даному випадку для варіанта використання сервера Яндекс.Пошта застосовані наступні значення властивостей:
- Властивість Host(поз.28) - адреса поштового сервера зі значенням smtp.yandex.ru;
- Властивість SMTPSecure
- Властивість Port
Ці значення властивостей були взяті зі сторінки Яндекс.Допомога, наведеної на наступному скріншоті.
Але таку інформацію можна отримати з інших ресурсів. Для цього достатньо в пошуковій системі ввести відповідний запит, наприклад: "smtp сервер яндекс". Де можна знайти велику кількість посилань щодо цього питання.
Аналогічно значення налаштувань можна отримати і по інших SMTP серверах. Нижче показаний скріншот сторінки Допомоги Mail.ru, де відображено налаштування SMTP сервера поштового сервісу Mail.ru.
І таким чином, у разі використання стороннього SMTP сервера Mail.ru, повинні бути застосовані наступні значення властивостей класу PHPMailer:
- Властивість Host(поз.28) – адреса поштового сервера (smtp.mail.ru);
- Властивість SMTPSecure(поз.32) - протокол шифрування (ssl);
- Властивість Port(Поз.33) - Порт сервера SMTP (465).
Подібний підхід слід застосовувати і для інших поштових сервісів.
2. У якості Username(поз.30) необхідно вказувати повну адресу поштової скриньки доменної пошти. В даному випадку як логін від поштової скриньки, з якою йде відправка листів, використовується " [email protected]".
Однак, якщо для надсилання листів використовувати обліковий запис не доменної пошти, а адресу безпосередньо до поштового сервісу, наприклад " [email protected]", то тоді логіном повинна бути лише частина адреси до знака "@". У цьому випадку логін мав би значення "feedback".
3. У PHPMailer передбачено властивість SMTPDebug(поз.50), що дозволяє відображати на екрані браузера різний рівень помилок. Така можливість значно полегшує знаходження проблем при налагодженні скрипту.
Зазвичай у штатному режимі, при встановленому значенні 0, виведення докладної інформації про помилку вимкнено. Але при виникненні проблем з надсиланням пошти або при налагодженні, для виведення більш змістовної інформації про помилку, можна використовувати інші значення.
Для того щоб подивитися, як це виглядає на практиці, тимчасово внесемо в налаштування якусь помилку. Наприклад, пароль від доменної пошти (властивість Password, Поз.31). А також для виведення докладної інформації про помилку, тимчасово встановимо у властивості SMTPDebug(поз.50) значення 1. Після, коли все буде налагоджено та перевірено, відключимо режим налагодження SMTP, замінивши 1 на 0.
У завершальній частині скрипта, після вказівки всіх необхідних властивостей та методів, для надсилання листа застосовано метод send()) (Поз.51). І якщо лист буде надіслано, і метод send()для об'єкту $mailповерне true, то у діалоговому вікні браузера через змінну $alertбуде виведено повідомлення про успішне надсилання пошти (поз.52).
У випадку ж, якщо пошта з якихось причин не змогла бути надіслана, і, відповідно, метод не зміг повернути істину, такий стан супроводжуватиметься відповідним повідомленням про помилку (поз.55).
Перевіряємо відправку email
Після того, як ми склали скрипт відправки пошти, звичайно, потрібно подивитися на результат нашої "творчості". Чи всі ми тут врахували, і чи не наробили жодних помилок.
Для цього спробуємо, як і було задумано, відправити з форми зворотного зв'язку повідомлення користувача адміністратору сайту. Нижче показаний скріншот форми зворотного зв'язку із заповненими полями до відправлення.
А тут показано результат відправлення форми.
Де, з повідомлення в діалоговому вікні браузера видно, що лист не може бути надіслано через проблему з'єднання по SMTP.
Але, оскільки зараз властивості SMTPDebug(поз.50) присвоєно значення 1, то ми зможемо переглянути докладну інформацію про помилку і з'ясувати причину її виникнення.
На наступному скріншоті видно, що під час спроби з'єднання виявлено помилку автентифікації, що означає використання неправильного логіну або пароля.
Після усунення невідповідності пароля (раніше використовувався неправильний пароль для можливості перевірки виведення додаткової інформації про помилку) знову спробуємо відправити пошту.
Цього разу, ніби все пройшло вдало, і ми отримали повідомлення про успішне відправлення пошти. Очевидно, крім свідомо введеної тимчасової помилки в пароль від доменної пошти, жодних інших помилок ми не припустилися.
Але для того, щоб переконатися, що листа дійсно було доставлено до адресата, увійдемо до пошти з адресою [email protected]та подивимося на результат.
Як видно, лист із адреси [email protected], з якого ми надсилали поштове повідомлення з ім'ям "Зворотній зв'язок", до адміністратора сайту благополучно дійшло. При цьому в тілі листа є весь той вміст, який ми формували в скрипті з використанням даних, отриманих з форми зворотного зв'язку, а саме:
- Ім'я відправника: Микола;
- Адреса відправника: [email protected];
- Тема повідомлення: Перевірка надсилання пошти;
- Зміст повідомлення: Тестове повідомлення.
Тепер після успішної перевірки надсилання пошти можна буде вимкнути режим налагодження SMTP, призначивши властивості SMTPDebug(Поз.50) значення 0.
Таким чином ми виконали завдання створити інструмент відправки пошти через SMTP з авторизацією з використанням стороннього поштового сервера.
Наприклад, у наступній статті ми подивимося, як надсилати підтверджуючі листи для відновлення даних облікового запису зареєстрованого користувача.
Вихідні файли сайту
Вихідні файли сайту з оновленнями, які були зроблені в даній статті, можна завантажити з додаткових матеріалів, що додаються:
- Файли каталогу www
- Таблиці бази даних MySQL
Щоб певний сайт мав можливість якісно та продуктивно працювати, до його створення варто підійти максимально відповідально та виважено. На особливу увагу заслуговує вибір системи, яка буде використовуватися при створенні інтернет-магазину. Справа в тому, що комерційна платформа, що спеціалізується на продажах товарів чи послуг, повинна дозволяти реалізувати весь необхідний функціонал і бути зручною у використанні як для адміністраторів, які займаються обслуговуванням та наповненням сайтів, так і для клієнтів інтернет-магазинів. Багато людей і компаній, які постають перед питанням підбору CMS, що підходять для себе, аналізують: що вибрати Magento або OkayCMS. Давайте порівняємо особливості та можливості даних движків для сайтів.
Працюючи над власним сайтом, людині чи компанії належить докласти великих зусиль - тільки у такому разі можна розраховувати на позитивні результати та отримання дійсно ефективного інструменту. Одним з основних питань, яке належить вирішити ще до того, як розпочинати створення сайту, буде те, як визначитися з найбільш відповідним варіантом CMS. Далі ми порівняємо дві CMS: Joomla або OkayCMS, звернемо увагу на особливості кожної з них.
Наявність власного сайту - одна з основних вимог для ефективного бізнесу, що успішно працює. Статистика однозначно свідчить на користь зростання кількості покупок різних товарів та замовлень послуг через Інтернет. Зважаючи на це, більшість комерційних компаній вже усвідомлюють необхідність наявності власного сайту. Втім, лише факту наявності інтернет ресурсу ще недостатньо, щоб розраховувати на його ефективність, рентабельність і очікувану для бізнесу користь.
Під час підготовки до створення власного сайту або відкриття інтернет-магазину, необхідно взяти до уваги та проаналізувати чимало питань, а також вирішити різноманітні завдання. Тільки в такому випадку можна розраховувати на те, що ваш проект принесе позитивні результати і зможе повною мірою виправдати очікування, що покладаються. Серед різних питань, пов'язаних з розробкою інтернет-магазину, на особливу увагу заслуговує питання вибору CMS. Щоб вам було простіше визначитися з оптимальним для себе двигуном, в рамках
Плануючи створення власного сайту для майбутнього інтернет-магазину, досить велика кількість людей і навіть компаній, що спеціалізуються на продажах, стають перед непростим і надзвичайно важливим вибором: на якій з існуючих CMS зупинитися. Якщо ви міркуєте про те, що вибрати: PrestaShop або OkayCMS, пропонуємо ознайомитися з цією статтею, в якій ми порівняємо ці дві системи для створення інтернет-сайтів, зокрема інтернет-магазинів.
У деяких випадках з метою тестування або діагностики роботи пошти поштовому адміністратору потрібно перевірити надсилання листів через свої сервери Exchange (і не тільки) з певних хостів. Якщо сервер не вимагає авторизації (open-relay сервер), відправити пошту можна . Однак у більшості випадків поштові сервери для надсилання пошти вимагають авторизації. У цьому прикладі ми покажемо, як у консолі telnet виконати автентифікацію типу AUTH LOGIN на сервері SMTP і надіслати листа.
AUTH LOGIN– у термінології Exchange – це базова автентифікація, коли ім'я та пароль користувача передаються через мережу в закодованому за алгоритмом base64вигляді. На більшості внутрішніх серверах Exchange адміністратори не відключають BasicAuthentication. Перевірити її підтримку можна в налаштуваннях приймаючого конектора.
Примітка. Звертаємо вашу увагу, що зловмисник при доступі до каналу зв'язку може легко перехопити і розшифрувати закодовані за Base64 облікові дані користувача. Тому цей спосіб авторизації рекомендується використовувати виключно у приватних корпоративних мережах.
Для авторизації на поштовому сервері за допомогою AUTH LOGIN, нам потрібно перетворити ім'я та пароль користувача, з-під якого буде надсилатися лист у формат Base64. Це можна зробити за допомогою скриптів чи онлайн сервісів. Я скористаюся сайтом https://www.base64encode.org/.
Ім'я користувача: testuser@contoso.com, у кодуванні Base64 вийшло: dGVzdHVzZXJAY29udG9zby5jb20=
Пароль: $
up3RsTr)ng- В Base64 JHVwM1JzVHIpbmc=
Тепер у командному рядку за допомогою Telnet підключаємося на 25(SMTP) порт нашого поштового сервера (введені команди я виділятиму синім кольорів):
telnet mail.contoso.com 25
Якщо це Exchange, він поверне щось на зразок;
Представимося:
ehlo sender.contoso.com
Сервер поверне список типів авторизацій та можливостей, що підтримуються. Як ви бачите базова авторизація (AUTH LOGIN) у списку є.
250-mail.contoso.com Hello
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH LOGIN
250-8BITMIME
250-BINARYMIME
250 CHUNKING
AUTH LOGIN
Сервер повинен відповісти:
334 VXNlcm5hbWU6
Тепер вставляємо ім'я користувача у форматі Base64, яке ми закодували раніше:
dGVzdHVzZXJAY29udG9zby5jb20=
Сервер повинен відповісти:
334 UGFzc3dvcmQ6.
Тепер настав час вставити пароль у форматі Base64:
JHVwM1JzVHIpbmc=
Якщо ім'я та пароль користувача вірні, сервер відповість.
235 2.7.0 Authentication successful
Якщо ні:
535 5.7.8 Error: authentication failed: UGFzc3dvcmQ6
Тепер можна заповнити стандартні поля листа:
mail from: [email protected]
250 2.1.0 Sender OK
rcpt to: [email protected]
250 2.1.5 Recipient OK
data
354 Start mail input; end with.
from: TestUserovich
to: TheAdmin< [email protected] >
Subject: BASE SMTP Test Authenticated via Telnet
This is test
.
250 2.6.0 Queued mail for delivery
QUIT
221 2.0.0 Closing connection.
Connection closed by foreign host.
На цьому все тестове лист має успішно доставитися в ящик одержувача.
Установки надсилання пошти через SMTP
Трапляються випадки, коли сайтобудівники стикаються з проблемою роботи електронної пошти сайту на CMS Joomla. Наприклад, при надсиланні листа через форму зворотного зв'язку можуть з'являтися помилки наступного типу: "Could not instantiate mail function"або "Неможливо викликати функцію mail". Також можливий варіант надсилання листа без появи помилок, проте в результаті він все одно не доходить до адресата.
Чому ж відбуваються ці проблеми з поштою? Щоб відповісти на це запитання, необхідно в панелі керування пройти наступним шляхом: "Система" - "Загальні налаштування" - вкладка "Сервер" - розділ "Налаштування пошти".
У CMS Joomla передбачено три механізми надсилання листів: PHP Mail, Sendmail та SMTP. За замовчуванням використовується PHP Mail, з яким часто й відбуваються проблеми, які, в основному, пов'язані з налаштуваннями хостингу.
Виходячи з вищевикладеного робимо висновок: або звертаємося за допомогою до хостинг-провайдера, або використовуємо спосіб надсилання листів Sendmail або SMTP. Зупинимося на використанні SMTP.
Установки надсилання пошти за допомогою SMTP
SMTP (англ. Simple Mail Transfer Protocol) - мережевий протокол, використовуваний передачі електронної пошти. Для використання SMTP необхідно коректно виставити установки певного поштового сервера, який буде використовуватися.
Щоб побачити налаштування SMTP, необхідно в "Спосіб надсилання" вибрати "SMTP". Розглянемо кожну настройку популярних поштових серверів: Yandex, Mail, Gmail, Rambler та Yahoo.
Налаштування SMTP для Yandex
- E-mail сайту: поштова скринька на yandex.ru, наприклад: [email protected]
- Захист SMTP: SSL
- Порт SMTP-сервера: 465
- Ім'я користувача SMTP: логін скриньки на yandex.ru, наприклад: khasanov (без @yandex.ru)
- SMTP-сервер: smtp.yandex.ru
Установки SMTP для Mail
- E-mail сайту: поштова скринька на mail.ru, наприклад: [email protected]
- Відправник листа: запис, який відображатиметься у адресата в полі "Відправник"
- Вимкнути розсилку: увімк./вимк. функції масового розсилання листів
- Авторизація на SMTP-сервері: Так
- Захист SMTP: SSL
- Порт SMTP-сервера: 465
- Ім'я користувача SMTP: поштова скринька на mail.ru, наприклад: [email protected]
- Пароль для SMTP: пароль від поштової скриньки
- SMTP-сервер: smtp.mail.ru
Установки SMTP для Gmail
- E-mail сайту: поштова скринька на gmail.com, наприклад: [email protected]
- Відправник листа: запис, який відображатиметься у адресата в полі "Відправник"
- Вимкнути розсилку: увімк./вимк. функції масового розсилання листів
- Авторизація на SMTP-сервері: Так
- Захист SMTP: SSL
- Порт SMTP-сервера: 465
- Ім'я користувача SMTP: поштова скринька на gmail.com, наприклад: [email protected]
- Пароль для SMTP: пароль від поштової скриньки
- SMTP-сервер: smtp.gmail.com
Налаштування SMTP для Rambler
- E-mail сайту: поштова скринька на rambler.ru, наприклад: [email protected]
- Відправник листа: запис, який відображатиметься у адресата в полі "Відправник"