Відправлення листа з PHP використовуючи SMTP (c вкладенням). Відправка пошти через SMTP з локального сервера Написати листа php smtp

Відправлення листа з PHP використовуючи SMTP (c вкладенням). Відправка пошти через SMTP з локального сервера Написати листа php smtp

2019-08-05

Вітаю Вас, шановний відвідувач!

Прошу вибачити мене за затримку в оновленні блогу. Але цьому є цілком зрозуміле пояснення. Як-не-як, літо, дача, гості, ліс, вода і багато іншого, що не дозволило мені зайнятися питаннями створення сайту. Але ось зараз трохи звільнився, гості роз'їхалися, і думаю, що тепер точно зможу цього приділити належну увагу.

Отже, після того, як в останній статті ми підключили пошту свого домену до одного з поштових сервісів, тепер подивимося, як можна відправляти email з сайту. Причому так, щоб наші листи не потрапляли в СПАМ, а надійно, з високим ступенем ймовірності, доставлялися до наших адресатів.

Взагалі, для відправки листів в PHP існує вбудована функція mail (). Але слід зазначити, що незважаючи на простоту такого способу (в цьому випадку для відправки листів досить вказати всього один рядок коду з певними параметрами), застосування такого варіанту має істотний недолік, пов'язаний з проблемою спаму.

Справа в тому, що фільтри антиспаму поштових серверів на боці одержувача не дуже шанують листи, відправлені через функцію mail (). І в більшості випадків такі повідомлення фільтруються, або взагалі віддалятися, не доходячи до адресата.

І для того, щоб максимально виключити такі випадки, зазвичай застосовують інший варіант, при якому відправлення листів здійснюється, як ніби це робиться стороннім поштовим сервісом.

Такий спосіб називається відправкою пошти через SMTP з авторизацією. Який ми сьогодні і розглянемо на прикладі відправки форми зворотного зв'язку. Причому для цього будемо використовувати досить відому і популярну бібліотеку PHPMailer, що дозволяє досить просто організувати відправку листів через SMTP.

  • Як ми будемо відправляти листи зворотного зв'язку
  • Створюємо форму зворотного зв'язку
  • Встановлюємо бібліотеку PHPMailer
  • Формуємо скрипт відправки пошти через SMTP
  • Перевіряємо відправку email
  • Вихідні файли сайту

Як ми будемо відправляти листи зворотного зв'язку

Перед тим, як приступити до практичної роботи по відправці листів зворотного зв'язку, спочатку визначимося, як ми це будемо це робити.

Форма зворотнього зв'язку призначена для того, щоб користувач для зв'язку з адміністратором сайту міг передати своє повідомлення. Зазвичай, така форма складається з декількох полів і кнопки "Відправити".

В принципі, для відправки email досить використовувати всього лише кілька полів, які дають достатню інформацію про користувача і зміст повідомлення, такі як:

  • "Ім'я" - для введення імені відправника повідомлення;
  • "E-mail" - для адреси електронної пошти відправника;
  • "Тема повідомлення";
  • "Текст повідомлення".

Хоча можна додати і інші. Наприклад, номер телефону, якщо, дійсно, в цьому є необхідність.

У нашому випадку такі листи будуть відправлятися на адресу адміністратора сайту з реального поштової скриньки з авторизацією на те поштовому сервісі, до якого підключений наш домен.

Так як в попередній статті ми зупинилися на перевірці підключення доменної пошти до сервісу Яндекс.Пошта, то і відправляти пошту будемо для цього варіанта. Хоча це не принципово. Нижче будуть відзначені ті опції, при зміні яких можна буде відправляти email через поштовий сервер Mail.ru.

Як реальний поштової скриньки, з якої будуть відправлятися листи, будемо використовувати аккаунт новоствореного користувача доменної пошти, скажімо з адресою [Email protected] А відправляти ці листи будемо на поштову скриньку адміністратора [Email protected], Який раніше ми створили в попередній статті.

Таким чином відправником листи з форми зворотного зв'язку буде поштову скриньку [Email protected], А одержувачем - [Email protected] При цьому вся інформація про користувача, який відправив повідомлення з його змістом буде передаватися в тілі відправленого листа.

Створюємо форму зворотного зв'язку

Після того, як ми визначилися з самим порядком відправки листів, тепер створимо форму зворотного зв'язку, за допомогою якої будемо це робити.

Нижче показаний HTML-код такої форми, який ми розмістимо на сторінці "Контакти" (файл kontakty.php в каталозі articles).

    "Article" >

    Контакти

    Зворотній зв'язок

    "Contact" action \u003d "#" method \u003d "Post" >

    Форма зворотного зв'язку

    З усіх питань, зверненнями та ділових пропозицій Ви можете зв'язатися через наведену нижче форму зворотного зв'язку.

    "Contact-block" >

    "Contact-input" >

    "Text" id \u003d "Contact-name" name \u003d "Contact-name" title \u003d "Ім'я повинно бути російською і містити не менше 3 символів" pattern \u003d "{3,}" required\u003e

  1. "Empty-contact" >

    "Contact-input" >

    "Email" id \u003d "Contact-email" name \u003d "Contact-email" required\u003e

  2. "Contact-subject" >

  3. "Contact-comment" >

  4. "Contact-button" >

    "Submit" name \u003d "Contact-button" value \u003d "Надіслати" >

Рис.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 \u003d $ _POST [ "contact-name"];

    $ Name \u003d check_symbol ($ name, "Ім'я", "1", "/ ^ + \\ z / iu");

    $ Email \u003d $ _POST [ "contact-email"];

    $ Email \u003d check_symbol ($ email, "E-mail", "1", "/^[Email protected](+ \\.) + (2,6) \\ z / i ");

    $ Subject \u003d $ _POST [ "contact-subject"];

    $ Subject \u003d check_symbol ($ subject, "Тема повідомлення", "1", "0");

    $ Comment \u003d $ _POST [ "contact-comment"];

    $ Comment \u003d check_symbol ($ comment, "Текст повідомлення", "1" , "0" );

    if (!empty ($ GLOBALS [ "alert"])) (

    $ Alert \u003d "Дані з форми не відправлені. Виявлено наступні помилки: \\ n". $ Alert;

    include "Alert.php";

    else {

    // Підключення бібліотеки

    require "PHPMailer / src / PHPMailer.php";

    require "PHPMailer / src / Exception.php";

    require "PHPMailer / src / SMTP.php";

    $ Mail \u003d new PHPMailer (); // Ініціалізація класу

    $ From \u003d " [Email protected]" ; // Адреса пошти, з якої йде відправка листа

    $ To \u003d " [Email protected]" ; //Адреса одержувача

    $ Mail -\u003e isSMTP (); // Застосування протоколу SMTP

    $ Mail -\u003e Host \u003d "smtp.yandex.ru"; // Адреса поштового сервера

    $ Mail -\u003e SMTPAuth \u003d true ; // Функція переходу в режим авторизації

    $ Mail -\u003e Username \u003d " [Email protected]" ; // Логін від доменної пошти, підключеної до стороннього поштового сервісу (в даному випадку в Яндекс.Почта)

    $ Mail -\u003e Password \u003d "27MrDon89"; // Пароль від доменної пошти

    $ Mail -\u003e SMTPSecure \u003d "ssl"; // Протокол шифрування

    $ Mail -\u003e Port \u003d "465"; // Порт сервера SMTP

    $ Mail -\u003e CharSet \u003d "UTF-8"; // Кодування

    $ Mail -\u003e setFrom ($ from, "Адміністратор"); // Адреса та ім'я відправника

    $ Mail -\u003e addAddress ($ to, "Адміністратор"); // Адреса та ім'я одержувача

    $ Mail -\u003e isHTML ( true ); // Установка формату електронної пошти в HTML

    $ Mail -\u003e Subject \u003d "Відправлена \u200b\u200bформа зворотного зв'язку"; // Тема листа (заголовок)

    $ Mail -\u003e Body \u003d "

    Ім'я відправника: $ name

    Адреса відправника: $ email

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

    Зміст повідомлення: $ comment

    " ; // Вміст листа

    $ Mail -\u003e AltBody \u003d "Текст альтернативного письма"; // Альтернативне лист в разі, якщо поштовий клієнт не підтримує формат HTML

    $ Mail -\u003e SMTPDebug \u003d 0; // Включення налагодження SMTP: 0 - викл (для штатного використання), 1 \u003d повідомлення клієнта, 2 - повідомлення клієнта і сервера

    if ($ Mail -\u003e send ()) (

    $ Alert \u003d "Повідомлення надіслано"; // Висновок повідомлення в діалоговому вікні браузера про успішну відправку листа

    else {

    $ Alert \u003d "Помилка, лист не може бути відправлено:". $ Mail -\u003e ErrorInfo; // Виведення повідомлення про помилку

    include "Alert.php";

Рис.5 Скрипт для відправки email через 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, то ми зможемо подивитися детальну інформацію про виниклу помилки і з'ясувати причину її виникнення.

На наступному скріншоті видно, що у випадку встановлення виявлена \u200b\u200bпомилка аутентифікації, що означає використання неправильного логіна або пароля.

Після усунення невідповідності пароля (раніше використовувався неправильний пароль для можливості перевірки виведення додаткової інформації про помилку), знову спробуємо відправити пошту.

На цей раз, як ніби, все пройшло вдало, і ми отримали повідомлення про успішну відправку пошти. По всій видимості, крім свідомо введеною тимчасовою помилки в пароль від доменної пошти, ніяких інших помилок ми не допустили.

Але для того, щоб переконатися, що лист дійсно було доставлено до адресата, увійдемо в пошту з адресою [Email protected] і подивимося на результат.

Як видно, лист з адреси [Email protected], З якого ми відправляли поштове повідомлення з ім'ям "Зворотній зв'язок" до адміністратора сайту благополучно дійшла. При цьому в тілі листа є все те вміст, яке ми формували в скрипті з використанням даних, отриманих з форми зворотного зв'язку, а саме:

  • Ім'я відправника: Микола;
  • Адреса відправника: [Email protected];
  • Тема повідомлення: Перевірка відправки пошти;
  • Зміст повідомлення: Тестове повідомлення.

Тепер, після успішної перевірки відправки пошти можна буде відключити режим налагодження SMTP, призначивши властивості SMTPDebug (Поз.50) значення 0.

Таким чином ми виконали завдання зі створення інструменту відправки пошти через SMTP з авторизацією з використанням стороннього поштового сервера.

Наприклад, в наступній статті ми подивимося, як відправляти підтверджуючі листи для відновлення даних облікового запису зареєстрованого користувача.

Вихідні файли сайту

Вихідні файли сайту з оновленнями, які були зроблені в даній статті, можна скачати з доданих додаткових матеріалів:

  • Файли каталогу www
  • Таблиці бази даних MySQL

У деяких випадках з метою тестування або діагностики роботи пошти, поштової адміністратору потрібно перевірити відправку листів через свої сервера Exchange (і не тільки) з певних хостів. У тому випадку, якщо сервер не вимагає авторизації (open-relay сервер), відправити пошту можна. Однак в більшості випадків поштові сервера для відправки пошти вимагають авторизації. У цьому прикладі ми покажемо, як в консолі telnet виконати аутентифікацію типу AUTH LOGIN на SMTP сервері і відправити лист.

AUTH LOGIN - в термінології Exchange - це базова аутентифікація, коли ім'я і пароль користувача передаються по мережі в закодованому за алгоритмом base64 вигляді. На більшості внутрішніх серверах Exchange адміністраторів не відключають BasicAuthentication. Перевірити її підтримку можна в налаштуваннях приймає коннектора.

Примітка. Звертаємо вашу увагу що зловмисник при доступі до каналу зв'язку може легко перехопити і розшифрувати закодовані за Base64 облікові дані користувача. Тому цей спосіб авторизації рекомендується використовувати виключно в приватних корпоративних мережах.

Для авторизації на поштовому сервер з за допомогою AUTH LOGIN, нам потрібно перетворити ім'я і пароль користувача, з-під якого буде відправлятися лист в формат Base64. Це можна зробити за допомогою скриптів або онлайн сервісів. Я скористатися сайтом https://www.base64encode.org/.

Ім'я користувача: [Email protected] contoso.com, В кодуванні Base64 вийшло: dGVzdHVzZXJAY29udG9zby5jb20 \u003d

пароль: $ up3RsTr)ng - в Base64 JHVwM1JzVHIpbmc \u003d

Тепер в командою рядку за допомогою 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 \u003d

Сервер повинен відповісти:

334 UGFzc3dvcmQ6.

Тепер пора вставити пароль в форматі Base64:
JHVwM1JzVHIpbmc \u003d

Якщо ім'я і пароль користувача вірні, сервер відповість.
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: Test BASE SMTP 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.

На цьому все, тестовий лист має успішно доставила в ящик одержувача.

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

Чому відправка через SMTP а не mail ()

У мене відповідь досить простий - якийсь час через мій сервер вірусякі відправляли тонни листів, що призвело в Бану мого IP-адреси у багатьох поштовиків, зокрема у gmail.com, а в зв'язку з цим користувачі могли отримувати листи, тому довелося шукати альтернативу, і я її знайшов - це SMTP

Можливо, вас зацікавить, чому ж мій скрипт краще за інших, які валяються на просторах ?! відповім

  1. Він працює з поштою yandex, rambler, mail (gmail перемогти не зміг)
  2. Зрозумілий код. Щоб його налаштувати досить поміняти кілька рядків
  3. Відправляє листи в HTML форматі

Ось гідності мого скрипта, яких я не знайшов будь-якому в інтернеті, але з кожного я взяв все необхідне. І так, давайте розглянемо код.

Function smtpmail ($ mail_to, $ subject, $ message, $ service \u003d "yandex") ($ config [ "smtp_charset"] \u003d "windows-1251"; // кодування повідомлень. (Або UTF-8, ітд) $ config [ "smtp_from"] \u003d "mashintop.ru"; // Ваше ім'я - або ім'я Вашого сайту. Буде показувати при прочитанні в поле "Від кого" $ config [ "smtp_debug"] \u003d false; // Якщо Ви хочете бачити повідомлення помилок, вкажіть true замість false $ config [ "smtp_port"] \u003d "25"; // Порт роботи. Не міняйте, якщо не впевнені. if ($ service \u003d\u003d "yandex") ($ config [ "smtp_searcher"] \u003d "yandex. ru "; $ config [" smtp_email "] \u003d" [Email protected]"; $ Config [" smtp_username "] \u003d" mashintop "; // Змініть на ім'я своєї поштової скриньки. $ Config [" smtp_host "] \u003d" smtp.yandex.ru "; // сервер для відправки пошти $ config [" smtp_password "] \u003d" moi_parol "; // Змініть пароль) elseif ($ service \u003d\u003d" rambler ") ($ config [" smtp_searcher "] \u003d" rambler.ru "; $ config [" smtp_email "] \u003d" [Email protected]"; $ Config [" smtp_username "] \u003d" mashintop "; // Змініть на ім'я своєї поштової скриньки. $ Config [" smtp_host "] \u003d" smtp.rambler.ru "; // сервер для відправки пошти $ config [" smtp_password "] \u003d" moi_parol "; // Змініть пароль) elseif ($ service \u003d\u003d" mail ") ($ config [" smtp_searcher "] \u003d" mail.ru "; $ config [" smtp_email "] \u003d" [Email protected]"; $ Config [" smtp_username "] \u003d" mashintop "; // Змініть на ім'я своєї поштової скриньки. $ Config [" smtp_host "] \u003d" smtp.mail.ru "; // сервер для відправки пошти $ config [" smtp_password "] \u003d" moi_parol "; // Змініть пароль) elseif ($ service \u003d\u003d" gmail ") ($ config [" smtp_searcher "] \u003d" gmail.com "; $ config [" smtp_email "] \u003d" [Email protected]"; $ Config [" smtp_username "] \u003d" alexeybertram "; // Змініть на ім'я своєї поштової скриньки. $ Config [" smtp_host "] \u003d" smtp.gmail.com "; // сервер для відправки пошти $ config [" smtp_password "] \u003d" moi_parol "; // Змініть пароль) $ header \u003d" Date: ".date (" D, j MYG: i: s ")." + 0700rn "; $ header. \u003d" From: \u003d? Windows-1251? Q? ". Str_replace (" + "," _ ", str_replace ("% "," \u003d ", urlencode (" ". $ Config [" smtp_from "]." ")))."? \u003d<".$config["smtp_email"].">rn "; $ header. \u003d" X-Mailer: The Bat! (V3.99.3) Professionalrn "; $ header. \u003d" Reply-To: \u003d? Windows-1251? Q? ". Str_replace (" + "," _ ", str_replace ("% "," \u003d ", urlencode (" ". $ config [" smtp_from "]." ")))."? \u003d<".$config["smtp_email"].">rn "; $ header. \u003d" X-Priority: 3 (Normal) rn "; $ header. \u003d" Message-ID:<172562218.".date("YmjHis")."@".$config["smtp_searcher"].">rn "; $ header. \u003d" To: \u003d? windows-1251? Q? ". str_replace (" + "," _ ", str_replace ("% "," \u003d ", urlencode (" ")))."? \u003d<$mail_to>rn "; $ header. \u003d" Subject: \u003d? windows-1251? Q? ". str_replace (" + "," _ ", str_replace ("% "," \u003d ", urlencode (" ". $ subject." " ))). "? \u003d rn"; $ header. \u003d "MIME-Version: 1.0rn"; $ header. \u003d "Content-Type: text / html; charset \u003d windows-1251rn "; $ header. \u003d" Content-Transfer-Encoding: 8bitrn "; $ smtp_conn \u003d fsockopen (" ". $ config [" smtp_host "]." ", $ config [" smtp_port "], $ errno , $ errstr, 10); if (! $ smtp_conn) (print "з'єднання з серверів не минуло"; fclose ($ smtp_conn); exit;) $ data \u003d get_data ($ smtp_conn); fputs ($ smtp_conn, "EHLO". $ config [ "smtp_searcher"]. "rn"); $ code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 250) (print "помилка Привітальні EHLO"; fclose ($ smtp_conn) ; exit;) fputs ($ smtp_conn, "AUTH LOGINrn"); $ code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 334) (print "сервер не дозволив почати авторизацію"; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, base64_encode ( "". $ config [ "smtp_username"]. ""). "rn"); $ code \u003d substr (get_data ($ smtp_conn), 0,3000) ; if ($ code! \u003d 334) (print "помилка доступу до такого користувачеві"; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, base64_encode ( "". $ config [ "smtp_password"]. ""). "rn"); $ code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 235) (print "неправильний п Арола "; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, "MAIL FROM:". $ config [ "smtp_email"]. "rn"); $ Code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 250) (print "сервер відмовив в команді MAIL FROM"; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, "RCPT TO:". $ mail_to. "rn"); $ Code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 250 AND $ code! \u003d 251) (print "Сервер не прийняв команду RCPT TO"; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, "DATArn"); $ Code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 354) (print "сервер не прийняв DATA"; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, $ header. "rn". $ message. "rn.rn"); $ Code \u003d substr (get_data ($ smtp_conn), 0,3000); if ($ code! \u003d 250) (print "помилка відправлення листа"; fclose ($ smtp_conn); exit;) fputs ($ smtp_conn, "QUITrn"); fclose ($ smtp_conn); ) Function get_data ($ smtp_conn) ($ data \u003d ""; while ($ str \u003d fgets ($ smtp_conn, 515)) ($ data. \u003d $ Str; if (substr ($ str, 3,1) \u003d\u003d "" ) (break;)) return $ data;) $ text_email \u003d " Ви тільки що додали оголошення на сайті mashintop.ru. Подивитися його можна тут
Ваш ключ: ". $ Key."

За допомогою даного ключа ви зможете управляти своїм оголошенням.

"; $ Text_email. \u003d" "; Smtpmail (" [Email protected]"," Ключ від оголошення на mashintop.ru ", $ text_email," yandex "); // використовуємо яндекс smtpmail (" [Email protected]"," Ключ від оголошення на mashintop.ru ", $ text_email," mail "); // використовуємо майл smtpmail (" [Email protected]"," Ключ від оголошення на mashintop.ru ", $ text_email," rambler "); // використовуємо рамблер smtpmail (" [Email protected]"," Ключ від оголошення на mashintop.ru ", $ text_email," gmail "); // а ось gmail не працює :(

Ось і все, готовий скрипт у вас в руках, тільки скопіюйте, поміняйте значення масиву $ config і все буде відмінно працювати.

Тепер давайте розберемо деякі елементи, на які я б хотів загострити увагу.

Нарпімер, помилку, яку ми отримуємо при спробі відправити через SMTP гугл. Спочатку ми бачимо вот такой вот текст помилки:

Щоб побачити щось більш конкретне, давайте трохи видозмінимо код

Fputs ($ smtp_conn, "AUTH LOGINrn"); $ Code \u003d substr (get_data ($ smtp_conn), 0,3000); echo $ code; if ($ code! \u003d 334) (print "сервер не дозволив почати авторизацію"; fclose ($ smtp_conn); exit;)

І отримуємо в Ітогда цілком конкретну помилку

530 5.7.0 Must issue a STARTTLS command first. x4sm16408296lbn.2 - gsmtp

Що вона означає точно - я не знаю, але думаю, що пов'язано щось з защіщеннимнезащіщенним підключенням. Як від неї позбутися - поки не знаю, тому gmail залишився переможеним на даний момент.

Опції надсилання пошти через 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

  1. E-mail сайту: поштову скриньку на yandex.ru, наприклад: [Email protected]
  2. Захист SMTP: SSL
  3. Порт SMTP-сервера: 465
  4. Ім'я користувача SMTP: логін ящика на yandex.ru, наприклад: khasanov (без @ yandex.ru)
  5. SMTP-сервер: smtp.yandex.ru

Налаштування SMTP для Mail

  1. E-mail сайту: поштову скриньку на mail.ru, наприклад: [Email protected]
  2. Відправник листа: запис, яка буде відображатися у адресата в полі "Відправник"
  3. Відключити розсилку: вкл / викл. функції масової розсилки листів
  4. Авторизація на SMTP-сервері: Так
  5. Захист SMTP: SSL
  6. Порт SMTP-сервера: 465
  7. Ім'я користувача SMTP: поштову скриньку на mail.ru, наприклад: [Email protected]
  8. Пароль для SMTP: пароль від поштової скриньки
  9. SMTP-сервер: smtp.mail.ru

Налаштування SMTP для Gmail

  1. E-mail сайту: поштову скриньку на gmail.com, наприклад: [Email protected]
  2. Відправник листа: запис, яка буде відображатися у адресата в полі "Відправник"
  3. Відключити розсилку: вкл / викл. функції масової розсилки листів
  4. Авторизація на SMTP-сервері: Так
  5. Захист SMTP: SSL
  6. Порт SMTP-сервера: 465
  7. Ім'я користувача SMTP: поштову скриньку на gmail.com, наприклад: [Email protected]
  8. Пароль для SMTP: пароль від поштової скриньки
  9. SMTP-сервер: smtp.gmail.com

Налаштування SMTP для Rambler

  1. E-mail сайту: поштову скриньку на rambler.ru, наприклад: [Email protected]
  2. Відправник листа: запис, яка буде відображатися у адресата в полі "Відправник"

PHPMailer - дуже зручна і популярна бібліотека для відправки e-mail повідомлень з вашого сайту. У цій статті викладені основні настройки бібліотеки і наведені приклади коду для відправки повідомлень. PHPMailer має в своєму асортименті мабуть все, що можна побажати від роботи з поштою: відправка різними способами, через різні сервери в т.ч. через smtp, можливість шифрувати і підписувати ваші листи, щоб не потрапляли в спам і багато іншого.

Завантажити бібліотеку PHPMailer можна з https://github.com/PHPMailer/PHPMailer (кнопка "Clone or download").

Для початку розберу пару простих прикладів, щоб було зрозуміло, як відправляти листи за допомогою PHPMailer.

Відправлення листів через функцію mail () за допомогою PHPMailer

Якщо ви хочете відправляти листи зі свого хостингу через свій поштовий сервер, то все досить просто і буде виглядати приблизно так:

// Підключаємо бібліотеку PHPMailer use PHPMailer \\ PHPMailer \\ PHPMailer; require "PHPMailer / PHPMailer.php"; // Створюємо лист $ mail \u003d new PHPMailer (); $ Mail-\u003e setFrom ( " [Email protected]"," Іван Іванов "); // від кого (email і ім'я) $ mail-\u003e addAddress (" [Email protected]"," Вася Петров "); // кому (email і ім'я) $ mail-\u003e Subject \u003d" Тест "; // тема листа // html текст листа $ mail-\u003e msgHTML ("

Вітаю!

Це тестовий лист.

"); // Відправляємо if ($ mail-\u003e send ()) (echo" Лист відправлено! ";) Else (echo" Помилка: ". $ Mail-\u003e ErrorInfo;)

Як бачимо, все досить просто: підключаємо бібліотеку, заповнюємо від кого, кому, тему і текст письма і відправляємо. Відправка листів таким способом буде працювати тільки з поштових адрес вашого домену (якщо тільки вони не прив'язані до інших поштовикам).

Відправлення листів через SMTP за допомогою PHPMailer на прикладі Yandex і Google

Можна так само відправити лист через інший поштовик, наприклад, через Яндекс. Код буде виглядати приблизно так:

// Підключаємо бібліотеку PHPMailer use PHPMailer \\ PHPMailer \\ PHPMailer; use PHPMailer \\ PHPMailer \\ SMTP; require "PHPMailer / PHPMailer.php"; require "PHPMailer / SMTP.php"; // Створюємо лист $ mail \u003d new PHPMailer (); $ Mail-\u003e isSMTP (); // Відправка через SMTP $ mail-\u003e Host \u003d "smtp.yandex.ru"; // Адреса SMTP сервера $ mail-\u003e SMTPAuth \u003d true; // Enable SMTP authentication $ mail-\u003e Username \u003d "login"; // ваше ім'я користувача (без домена і @) $ mail-\u003e Password \u003d "password"; // ваш пароль $ mail-\u003e SMTPSecure \u003d "ssl"; // шифрування ssl $ mail-\u003e Port \u003d 465; // порт підключення $ mail-\u003e setFrom ( " [Email protected]"," Іван Іванов "); // від кого $ mail-\u003e addAddress (" [Email protected]"," Вася Петров "); // кому $ mail-\u003e Subject \u003d" Тест "; $ mail-\u003e msgHTML ("

Вітаю!

Це тестовий лист.

"); // Відправляємо if ($ mail-\u003e send ()) (echo" Лист відправлено! ";) Else (echo" Помилка: ". $ Mail-\u003e ErrorInfo;)

Відправлення листів через Google має один нюанс: потрібно в акаунті google дозволити доступ ненадійним додатків. Для цього потрібно зайти в свій аккаунт https://myaccount.google.com, перейти в безпеку, зайти в розділ "Ненадійні додатки, у яких є доступ до аккаунту" і там переключити в "Дозволено". На момент написання статті це сторінка https://myaccount.google.com/u/0/lesssecureapps.

$ Mail-\u003e Host \u003d "smtp.gmail.com"; // Адреса SMTP сервера $ mail-\u003e SMTPAuth \u003d true; // Enable SMTP authentication $ mail-\u003e Username \u003d "login"; // ваше ім'я користувача $ mail-\u003e Password \u003d "password"; // ваш пароль $ mail-\u003e SMTPSecure \u003d "ssl"; // шифрування ssl $ mail-\u003e Port \u003d 465; // порт підключення

Якщо перший раз запускаєте програму відправки через smtp, тоді бажано перед відправкою додатково використовувати $ Mail-\u003e SMTPDebug \u003d 1; щоб отримувати всі повідомлення клієнта і smtp-сервера, тобто на екран виведеться весь процес підключення, авторизації і т.д., що дуже корисно для налагодження вашої програми.

Відправлення листа з вкладенням за допомогою PHPMailer

Тут все досить просто, потрібно лише використовувати метод addAttachment. Наведу приклад, заодно продемонструвавши ще кілька додаткових можливостей:

// Підключаємо бібліотеку PHPMailer use PHPMailer \\ PHPMailer \\ PHPMailer; use PHPMailer \\ PHPMailer \\ Exception; require "PHPMailer / PHPMailer.php"; require "PHPMailer / Exception.php"; // Створюємо лист $ mail \u003d new PHPMailer; $ Mail-\u003e CharSet \u003d "UTF-8"; $ Mail-\u003e setFrom ( " [Email protected]"," Іван Іванов "); // від кого $ mail-\u003e addReplyTo (" [Email protected]"," Іван Іванов "); // зворотну адресу $ mail-\u003e addAddress (" [Email protected]"," Вася Петров "); // кому $ mail-\u003e Subject \u003d" Тест "; // тема $ mail-\u003e msgHTML (file_get_contents (" contents.html "), __DIR__); // отримуємо" тіло "листи з файлу $ mail-\u003e AltBody \u003d "лист звичайним текстом"; // лист звичайним текстом, якщо клієнт не підтримує html $ mail-\u003e addAttachment ( "my_file.txt"); // прикріплюємо один файл $ mail-\u003e addAttachment ( "phpmailer .jpg "); // прикріплюємо другий файл // Відправляємо if ($ mail-\u003e send ()) (echo" Лист відправлено! ";) else (echo" Помилка: ". $ mail-\u003e ErrorInfo;)

Адрес одержувачів можна додати кілька з допомогою addAddress. Або, якщо необхідно, можна навпаки, очистити всі адреси отримувачів методом clearAddresses (). Очистити всі вкладення можна за допомогою clearAttachments ().

Так само можна використовувати AddEmbeddedImage щоб додати в лист вкладення (зазвичай зображення), яке призначене для використання в html-коді і не буде доступний для скачування. Приклад використання картинки в листі, не доступної для скачування:

// Підключаємо бібліотеку PHPMailer use PHPMailer \\ PHPMailer \\ PHPMailer; require "PHPMailer / PHPMailer.php"; // Створюємо лист $ mail \u003d new PHPMailer; $ Mail-\u003e IsHTML (true); $ Mail-\u003e setFrom ( " [Email protected]"," Іван Іванов "); $ mail-\u003e addAddress (" [Email protected]"," Вася Петров "); $ mail-\u003e Subject \u003d" Test "; $ mail-\u003e AddEmbeddedImage (" phpmailer.jpg "," testImage "); $ mail-\u003e Body \u003d"

Зображення в html-коді

"; // Відправляємо $ mail-\u003e send ();

Таким чином, ви можете відправляти листи з зображеннями, Які є тільки в тілі листа, але їх не можна завантажити як вкладення. Ці зображення можна використовувати в будь-якому місці html-коду листи, потрібно лише вказувати замість url-адреси cid зображення, який ви використовували в AddEmbeddedImage.

Відправлення підписаного і зашифрованого листа через PHPMailer

За замовчуванням, PHPMailer шифрує всі надіслані листи. Відключити шифрування листи можна тільки при відправці листів через SMTP використавши код:

$ Mail-\u003e SMTPSecure \u003d false; $ Mail-\u003e SMTPAutoTLS \u003d false;

щоб підписати лист підписом DKIM, Необхідно виконати декілька дій:

  • Згенерувати приватний (private) і публічний (public) ключі для вашого домену
  • Додати DNS-запис для домену типу TXT з публічним ключем
  • Налаштувати DKIM підпис в PHPMailer перед відправкою листа

Тепер опишу кожен крок трохи докладніше.

Генерація приватного і публічного ключів

Якщо у вас Linux-хостинг і є доступ в Shell, то згенерувати файли ключів простіше простого, потрібно виконати всього 2 команди зі звичайними правами свого користувача:

Openssl genrsa -out test-private.pem тисяча двадцять чотири openssl rsa -in test-private.pem -out test-public.pem -pubout

відповідно, test-private.pem і test-public.pem - це приватний і публічний ключі. Зберегти їх потрібно в папці, яка буде не доступна відвідувачам сайту або кому-то ще крім вас.

Якщо немає можливості виконати команди в shell, тоді щоб згенерувати приватний (private) і публічний (public) ключі і зберегти їх у файли, можна скористатися наступним кодом:

$ Domain \u003d "test.ru"; // ваш домен $ privatekeyfile \u003d "test-private.pem"; // ім'я файлу, в який буде записаний приватний ключ $ publickeyfile \u003d "test-public.pem"; // ім'я файлу, в який буде записаний публічний ключ if (file_exists ($ privatekeyfile)) (echo "

Using existing keys

"; $ Privatekey \u003d file_get_contents ($ privatekeyfile); $ publickey \u003d file_get_contents ($ publickeyfile);) else (echo"

Create keys"; $ Pk \u003d openssl_pkey_new ([" digest_alg "\u003d\u003e" sha256 "," private_key_bits "\u003d\u003e 2048," private_key_type "\u003d\u003e OPENSSL_KEYTYPE_RSA,]); openssl_pkey_export_to_file ($ pk, $ privatekeyfile); $ pubKey \u003d openssl_pkey_get_details ($ pk ); $ publickey \u003d $ pubKey [ "key"]; file_put_contents ($ publickeyfile, $ publickey); $ privatekey \u003d file_get_contents ($ privatekeyfile);) echo "

Private key (keep this private!):

". $ Privatekey."
"; Echo"

Public key:

". $ Publickey."
";

Увага! Не забудьте переконатися, що папка, в яку будуть зберігатися файли, доступна для запису.

Додавання DNS-записи з публічним ключем

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

Потрібно додати DNS-запис наступного виду:

Ім'я записи: mail._domainkey.test.ru. (В кінці точка ".")

TTL: 3600 (Або яке буде по-замовчуванню)

Тип запису: TXT

значення: v \u003d DKIM1; h \u003d sha256; t \u003d s; p \u003d ВАШ_ПУБЛІЧНИЙ_КЛЮЧ

В імені записи test.ru потрібно замінити на ім'я вашого домену. Слова "ВАШ_ПУБЛІЧНИЙ_КЛЮЧ" ви замінюєте на текст, який ви отримали на попередньому кроці після "Public key", без "----- BEGIN PUBLIC KEY -----" і "----- END PUBLIC KEY --- - ", тільки сам ключ. При цьому всі рядки ключа потрібно з'єднати в одну довгу рядок, Щоб перекладів рядка не було.

Налаштування підпису DKIM в PHPMailer і відправлення листа

Тепер залишилося лише зробити кілька налаштувань PHPMailer перед відправкою листа і воно буде підписано. Думаю, на наведеному прикладі буде все зрозуміло:

// Підключаємо бібліотеку use PHPMailer \\ PHPMailer \\ PHPMailer; require "PHPMailer / PHPMailer.php"; // Створюємо лист $ mail \u003d new PHPMailer; $ Mail-\u003e CharSet \u003d "UTF-8"; $ Mail-\u003e setFrom ( " [Email protected]"); $ Mail-\u003e addAddress (" [Email protected]"); $ Mail-\u003e Subject \u003d" Це тест "; $ mail-\u003e msgHTML ("

це тест

"); // Налаштування DKIM підписи $ mail-\u003e DKIM_domain \u003d" test.ru "; $ mail-\u003e DKIM_private \u003d" test-private.pem "; $ mail-\u003e DKIM_selector \u003d" mail "; // Відправляємо $ mail- \u003e send ();

зрозуміло, test.ru ви повинні поміняти на ім'я свого домену, а test-private.pem на повний шлях і ім'я файлу приватного ключа, який був створений на етапі генерації ключів.

Тепер, ваші листи, що відправляються через PHPMailer будуть підписані підписом DKIM вашим приватним ключем.

 

 

Це цікаво: