×
Закрытие
×

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

  • Создаем сайт для работы в Интернете

    1. Причины создания пошаговой инструкции по разработке самописного сайта
    2. Тема создаваемого сайта
    3. В чем будет заключаться монетизация
    4. Функционал
    5. Этапы создания
    6. Текущее состояние создаваемого сайта

    Здравствуйте уважаемый посетитель!

    Наверное, многие задаются вопросом, как можно самому создать сайт для работы в Интернете или просто для реализации своих интеллектуальных способностей.

    Причем чтобы такой сайт был создан не в стандартном исполнении на основе какой-нибудь бесплатной СMS, а заточенный под себя, с возможностью обеспечить ему должную безопасность и реализовать все свои индивидуальные потребности.

    Данный сборник статей и предназначен для того, чтобы показать на реальном примере, как можно самому с нуля создать интернет-ресурс, который в последствии можно использовать в качестве инструмента для своей работы.

    При этом в материалах сборника приводится не только подробное описание каждого этапа создаваемого самописного сайта, но и бесплатно предоставляются все исходные коды с соответствующими таблицами базы данных. Что существенно упрощает использования предоставляемого шаблона сайта под свои конкретные задачи.

    Следует к этому добавить, что при желании, после получения необходимых знаний и навыков в вопросах сайтостроения, вполне возможно заняться и созданием сайтов на заказ. Тем более, что эта работа очень интересна и достаточно хорошо оплачиваемая. И что немаловажно, ее можно выполнять удалено, занимаясь в любое время не выходя из дома. Для этого нужно всего лишь одно условие - подключение к сети Интернет, что в наше время не является какой-либо проблемой.

    И надеюсь, что данный материал позволит многим желающим не только создать свой сайт для работы в сети Интернет, но и поможет овладеть необходимой компетенцией для занятия профессиональным веб-программированием.

Самописный сайт своими руками!

Текущее состояние создаваемого сайта

Здесь можно посмотреть текущее состояние самописного сайта, который создается для работы в Интернете в рамках цикла статей Как сделать сайт.

Где в дополнительных материалах можно бесплатно скачать исходные файлы сайта с таблицами MySQL.

Вы здесь: Главная → Сборник статей → Работа с почтой → Отправляем почту через SMTP


Автор: / Дата:

Отправка почты через SMTP

Отправляем почту через SMTP

Здравствуйте уважаемый посетитель!

Прошу извинить меня за задержку в обновлении блога. Но этому есть вполне понятное объяснение. Как-никак, лето, дача, гости, лес, вода и много другое, что не позволило мне заняться вопросами создания сайта. Но вот сейчас немного освободился, гости разъехались, и думаю, что теперь точно смогу этому уделить должное внимание.

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

Вообще, для отправки писем в PHP существует встроенная функция mail(). Но следует отметить, что несмотря на простоту такого способа (в этом случае для отправки писем достаточно указать всего одну строку кода с определенными параметрами), применение такого варианта имеет существенный недостаток, связанный с проблемой СПАМа.

Дело в том, что фильтры антиСПАМа почтовых серверов на стороне получателя не очень жалуют письма, отправленные через функцию mail(). И в большинстве случаев такие сообщения фильтруются, либо вообще удаляться, не доходя до адресата.

И для того, чтобы максимально исключить такие случаи, обычно применяют другой вариант, при котором отправка писем осуществляется, как будто это делается сторонним почтовым сервисом.

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

Содержание


  • Как мы будем отправлять письма обратной связи
  • Создаем форму обратной связи
  • Устанавливаем библиотеку PHPMailer
  • Формируем скрипт отправки почты через SMTP
  • Проверяем отправку email
  • Исходные файлы сайта

Как мы будем отправлять письма обратной связи


Перед тем, как приступить к практической работе по отправке писем обратной связи, сначала определимся, как мы это будем это делать.

Форма обратной связи предназначена для того, чтобы пользователь для связи с администратором сайта мог передать свое сообщение. Обычно, такая форма состоит из нескольких полей и кнопки "Отправить".

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

  • "Имя" — для ввода имени отправителя сообщения;
  • "E-mail" — для адреса электронной почты отправителя;
  • "Тема сообщения";
  • "Текст сообщения".

Хотя можно добавить и другие. Например, номер телефона, если, действительно, в этом есть необходимость.

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

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

В качестве реального почтового ящика, с которого будут отправляться письма, будем использовать аккаунт вновь созданного пользователя доменной почты, скажем с адресом feedback@avtobezugona.ru. А отправлять эти письма будем на почтовый ящик администратора admin@avtobezugona.ru, который ранее мы создали в предыдущей статье.

Таким образом отправителем письма из формы обратной связи будет являться почтовый ящик feedback@avtobezugona.ru., а получателем - admin@avtobezugona.ru. При этом вся информация о пользователе, отправившем сообщение с его содержанием будет передаваться в теле отправленного письма.

Создаем форму обратной связи


После того, как мы определились с самим порядком отправки писем, теперь создадим форму обратной связи, с помощью которой будем это делать.

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

  1. <div class="article">

  2. <h1>Контакты</h1>

  3. <h2>Обратная связь</h2>

  4. <hr>

  5. <form name="contact" action="#" method="post">

  6. <h3>Форма обратной связи</h3>

  7. <p>По всем вопросам, обращениям и деловым предложениям Вы можете связаться через приведенную ниже форму обратной связи.</p>

  8. <div class="contact-block">

  9. <div class="contact-input">

  10. <label for="contact-name">Имя:</label>

  11. <input type="text" id="contact-name" name="contact-name" title="Имя должно быть на русском и содержать не менее 3 символов" pattern="[A-Za-zА-Яа-яЁё]{3,}" required>

  12. </div>

  13. <div class="empty-contact"></div>

  14. <div class="contact-input">

  15. <label for="contact-email">E-mail:</label>

  16. <input type="email" id="contact-email" name="contact-email" required>

  17. </div>

  18. </div>

  19. <div class="contact-subject">

  20. <label for="contact-subject">Тема сообщения:</label>

  21. <div><textarea id="contact-subject" name="contact-subject" required></textarea><div>

  22. </div>

  23. <div class="contact-comment">

  24. <label for="contact-comment">Текст сообщения:</label>

  25. <div><textarea id="contact-comment" name="contact-comment" required></textarea><div>

  26. </div>

  27. <div class="contact-button">

  28. <input type="submit" name="contact-button" value="Отправить">

  29. </div>

  30. </form>

  31. </div>

Рис.1 HTML-код формы обратной связи

Ранее в разделе Работа с формами HTML достаточно подробно рассматривалось использование различных элементов форм. Поэтому, повторяться и останавливаться на этом не будем. Если у кого-то по этой части возникнут вопросы, то можно вернуться к данному разделу и ознакомиться с соответствующими статьями.

Здесь лишь можно отметить, что внешний вид данной формы оформлен с помощью свойств CSS, расположенных в строках 784÷825 таблицы стилей CSS, которая находится в файле main.css каталога styles (исходные файлы сайта можно скачать в прилагаемых дополнительных материалах).

Как в итоге выглядит приведенная здесь форма обратной связи, можно посмотреть на следующем скриншоте.

Вид формы обратной связи

Рис.2 Вид формы обратной связи

Таким образом нужная форма создана. И теперь можно перейти к вопросам обработки и отправки данных в виде почтового сообщения.

Устанавливаем библиотеку PHPMailer


Как ранее отмечалось, для отправки почты мы будем использовать библиотеку PHPMailer, которая позволит существенно упростить отправку email через протокол SMTP с авторизацией на стороннем почтовом сервисе.

Для ее установки требуется скачать необходимые файлы. Это можно сделать с веб-сервиса GitHub, используя для этого Composer (пакетный менеджер зависимостей для PHP). Либо просто, скачать необходимые файлы обычным образом.

скриншот 73

Ниже показана страница веб-сервиса GitHub, где отмечена ссылка на обычное скачивание библиотеки PHPMailer.

Для увеличения / уменьшения размера изображения кликните по картинке
Страница веб-сервиса GitHub для скачивания библиотеки PHPMailer

Рис.3 Страница веб-сервиса GitHub для скачивания библиотеки PHPMailer

Кроме этого, последнюю версию 6.0.7, которая была сохранена на момент написания данной статьи, можно скачать из прилагаемых материалов здесь.

В любом случае полученный архивный файл следует распаковать, после чего извлеченную папку PHPMailer-master со всем содержимом поместить в корень сайта. При этом, для простоты, можно ее переименовать в PHPMailer. Ниже показано содержимое папки PHPMailer, помещенной в корневой каталог сайта.

Для увеличения / уменьшения размера изображения кликните по картинке
Содержимое паки PHPMailer, помещенной в корневой каталог сайта

Рис.4 Содержимое паки PHPMailer, помещенной в корневой каталог сайта.

Таким образом мы установили библиотеку PHPMailer. После чего можем заняться формированием скрипта, с помощью которого будем отправлять с нашего сайта почтовые сообщения.

Формируем скрипт отправки почты через SMTP


Для составления скрипта вполне достаточно воспользоваться рекомендациями по применению PHPMailer, приведенными на странице GitHub, которую ранее мы использовали для скачивания библиотеки.

В них, в частности указывается, что в начале скрипта требуется импортировать классы PHPMailer в глобальное пространство имен. И даны конкретные строки соответствующего кода. А также приведены примеры использования свойств и методов PHPMailer, в том числе и для варианта отправки почты через SMTP.

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

скриншот 74

Ниже приведен код скрипта отправки почты из формы обратной связи через SMTP с авторизацией. Где все строки, относящиеся к PHPMailer, даны с пояснения и выделены светлым фоном.

Остальная часть, включая фрагменты, касающиеся получения и обработки данных из формы, которые нам ранее уже приходилось использовать в других обработчиках, обозначены темным фоном. Достаточно подробно о них говорилось ранее в статье, посвященной, как раз, вопросам получения и проверке данных из формы в PHP. Где также рассказывалось об универсальной пользовательской функции проверки и обработки данных формы check_symbol().

Данный скрипт разместим в том же файле kontakty.php, в котором ранее мы сформировали форму обратной связи.

  1. <?php

  2. //----Скрипт отправки почты через SMTP с использованием PHPMailer----

  3. //Импорт классов PHPMailer в глобальное пространство имен. Они должны быть в верхней части скрипта, а не внутри функции

  4. use PHPMailer\PHPMailer\PHPMailer;

  5. use PHPMailer\PHPMailer\Exception;

  6. if (!empty($_POST["contact-button"])) {

  7. $name = $_POST["contact-name"];

  8. $name = check_symbol($name, "Имя", "1", "/^[A-ZА-ЯЁ]+\z/iu");

  9. $email = $_POST["contact-email"];

  10. $email = check_symbol($email, "E-mail", "1", "/^[A-Z0-9._%+-]+@([A-Z0-9-]+\.)+[A-Z]{2,6}\z/i");

  11. $subject = $_POST["contact-subject"];

  12. $subject = check_symbol($subject, "Тема сообщения", "1", "0");

  13. $comment = $_POST["contact-comment"];

  14. $comment = check_symbol($comment, "Текст сообщения", "1", "0");

  15. if (!empty($GLOBALS['alert'])) {

  16. $alert = 'Данные из формы не отправлены. Обнаружены следующие ошибки: \n'.$alert;

  17. include "alert.php";

  18. }

  19. else {

  20. //Подключение библиотеки

  21. require 'PHPMailer/src/PHPMailer.php';

  22. require 'PHPMailer/src/Exception.php';

  23. require 'PHPMailer/src/SMTP.php';

  24. $mail = new PHPMailer(); //Инициализация класса

  25. $from = 'feedback@avtobezugona.ru'; //Адрес почты, с которой идет отправка письма

  26. $to = 'admin@avtobezugona.ru'; //Адрес получателя

  27. $mail -> isSMTP(); //Применение протокола SMTP

  28. $mail -> Host = 'smtp.yandex.ru';//Адрес почтового сервера

  29. $mail -> SMTPAuth = true; //Включение режима авторизации

  30. $mail -> Username = 'feedback@avtobezugona.ru'; //Логин от доменной почты, подключенной к стороннему почтовому сервису (в данном случае в Яндекс.Почта)

  31. $mail -> Password = '27MrDon89'; //Пароль от доменной почты

  32. $mail -> SMTPSecure = 'ssl'; //Протокол шифрования

  33. $mail -> Port = '465'; //Порт сервера SMTP

  34. $mail -> CharSet = 'UTF-8'; //Кодировка

  35. $mail -> setFrom($from, 'Администратор'); //Адрес и имя отправителя

  36. $mail -> addAddress($to, 'Администратор'); //Адрес и имя получателя

  37. $mail -> isHTML (true); //Установка формата электронной почты в HTML

  38. $mail -> Subject = 'Отправлена форма обратной связи'; //Тема письма (заголовок)

  39. $mail -> Body = "

  40. <html>

  41. <body>

  42. <p>Имя отправителя: $name</p>

  43. <p>Адрес отправителя: $email</p>

  44. <p>Тема сообщения: $subject</p>

  45. <p>Содержание сообщения: $comment</p>

  46. </body>

  47. </html>

  48. "; //Содержимое письма

  49. $mail -> AltBody = 'Текст альтернативного письма'; //Альтернативное письмо в случае, если почтовый клиент не поддерживает формат HTML

  50. $mail -> SMTPDebug = 0; //Включение отладки SMTP: 0 - выкл (для штатного использования), 1 = сообщения клиента, 2 - сообщения клиента и сервера

  51. if ($mail -> send()) {

  52. $alert = 'Сообщение отправлено'; //Вывод сообщения в диалоговом окне браузера об успешной отправке письма

  53. }

  54. else {

  55. $alert = 'Ошибка, письмо не может быть отправлено: '.$mail -> ErrorInfo; //Вывод сообщения об ошибке

  56. }

  57. include "alert.php";

  58. }

  59. }

  60. ?>

Рис.5 Скрипт для отправки email через SMTP с авторизацией

Как видно, все строки, относящиеся непосредственно к отправке почтового сообщения, в которых заданы необходимые методы и свойства, сопровождаются комментариями. Поэтому не имеет смысла повторяться, а можно остановиться только на некоторых из них, действительно, требующих дополнительные пояснения, а именно:

1. В связи с тем, что письмо оправляется со стороннего почтового сервиса, то здесь применены настройки, соответствующие конкретному SMTP серверу. В данном случае, для варианта использования сервера Яндекс.Почта применены следующие значения свойств:

  • Свойство Host (поз.28) - Адрес почтового сервера со значением smtp.yandex.ru;
  • Свойство SMTPSecure (поз.32) - Протокол шифрования (ssl);
  • Свойство Port (поз.33) - Порт сервера SMTP (465).

Эти значения свойств были взяты со страницы Яндекс.Помощь, приведенной на следующем скриншоте.

Настройки SMTP сервера Яндекс.Почты

Рис.6 Настройки SMTP сервера Яндекс.Почты

Но такую информацию можно получить и из других ресурсов. Для этого достаточно в поисковике ввести соответствующий запрос, например: "smtp сервер яндекс". Где можно найти большое количество ссылок по этому вопросу.

Аналогичным образом значения настроек можно получить и по другим SMTP серверам. Ниже показан скриншот страницы Помощи Mail.ru, где отображены настройки SMTP сервера почтового сервиса Mail.ru.

Настройки SMTP сервера Mail.ru

Рис.7 Настройки SMTP сервера Mail.ru

И таким образом, в случае использования в качестве стороннего SMTP сервера Mail.ru, должны быть применены следующие значения свойств класса PHPMailer:

  • Свойство Host (поз.28) - Адрес почтового сервера (smtp.mail.ru);
  • Свойство SMTPSecure (поз.32) - Протокол шифрования (ssl);
  • Свойство Port (поз.33) - Порт сервера SMTP (465).

Подобный подход следует применять и для других почтовых сервисов.

2. В свойстве Username (поз.30) необходимо указывать полный адрес почтового ящика доменной почты. В данном случае в качестве логина от почтового ящика, с которой идет отправка писем, используется "feedback@avtobezugona.ru".

Однако, если для отправки писем использовать учетную запись не доменной почты, а адрес, относящийся непосредственно к почтовому сервису, например "feedback@yandex.ru", то тогда логином должна является только часть адреса до знака "@". В этом случае логин имел бы значение "feedback".

3. В PHPMailer предусмотрено свойство SMTPDebug (поз.50), которое позволяет отображать на экране браузера различный уровень ошибок. Такая возможность значительно упрощает нахождение проблем при отладке скрипта.

Обычно, в штатном режиме, при установленном значении 0, вывод подробной информации об ошибке отключен. Но при возникновении проблем с отправкой почты, либо при отладке, для вывода более содержательной информации об ошибке, возможно использовать другие значения.

Для того, чтобы посмотреть, как это выглядит на практике, временно внесем в настройки какую-нибудь ошибку. Например, в пароль от доменной почты (свойство Password, поз.31). А также для вывода подробной информации об ошибке, временно установим в свойстве SMTPDebug (поз.50) значение 1. После, когда все будет отлажено и проверено, отключим режим отладки SMTP, заменив 1 на 0.

В завершающей части скрипта, после указания всех необходимых свойств и методов, для отправки письма применен метод send()) (поз.51). И если письмо будет отправлено, и метод send() для объекта $mail вернет true, то в диалоговом окне браузера через переменную $alert будет выведено сообщение об успешной отправке почты (поз.52).

В случае же, если почта по каким-либо причинам не смогла быть отправлена, и соответственно, метод не смог вернуть истину, то такое состояние будет сопровождаться соответствующим сообщением об ошибке (поз.55).

Проверяем отправку email


После того, как мы составили скрипт отправки почты, естественно, нужно посмотреть на результат нашего "творчества". Все ли мы здесь учли, и не наделали ли каких-либо ошибок.

Для этого попробуем, как и было задумано, отправить из формы обратной связи сообщение от пользователя администратору сайта. Ниже показан скриншот формы обратной связи с заполненными полями до ее отправки.

Заполненная форма обратной связи

Рис.8 Заполненная форма обратной связи

А здесь показан результат отправки формы.

Ошибка при отправке почты

Рис.9 Ошибка при отправке почты

Где, из сообщения в диалоговом окне браузера видно, что письмо не может быть отправлено в связи с проблемой соединения по SMTP.

Но, так как сейчас свойству SMTPDebug (поз.50) присвоено значение 1, то мы сможем посмотреть подробную информацию о возникшей ошибки и выяснить причину ее возникновения.

На следующем скриншоте видно, что при попытке соединения обнаружена ошибка аутентификации, означающая использование неправильного логина или пароля.

Вывод подробной информации об ошибке

Рис.10 Вывод подробной информации об ошибке

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

Успешная отправка почты

Рис.11 Успешная отправка почты

На этот раз, как будто, все прошло удачно, и мы получили сообщение об успешной отправке почты. По всей видимости, кроме заведомо введенной временной ошибки в пароль от доменной почты, никаких других оплошностей мы не допустили.

Но для того, чтобы убедиться, что письмо действительно было доставлено до адресата, войдем в почту с адресом admin@avtobezugona.ru и посмотрим на результат.

Успешная отправка почты

Рис.12 Полученное письмо из формы обратной

Как видно, письмо с адреса feedback@avtobezugona.ru, с которого мы отправляли почтовое сообщение с именем "Обратная связь" до администратора сайта благополучно дошло. При этом в теле письма имеется все то содержимое, которое мы формировали в скрипте с использованием данных, полученных из формы обратной связи, а именно:

  • Имя отправителя: Николай;
  • Адрес отправителя: ny.grish@gmail.com;
  • Тема сообщения: Проверка отправки почты;
  • Содержание сообщения: Тестовое сообщение.

Теперь, после успешной проверки отправки почты можно будет отключить режим отладки SMTP, назначив свойству SMTPDebug (поз.50) значение 0.

Таким образом мы выполнили задачу по созданию инструмента отправки почты через SMTP с авторизацией с использованием стороннего почтового сервера.

И далее, при необходимости отправлять почтовые сообщения из других функциональных узлов сайта, можно будет без каких-либо сложностей использовать представленный здесь PHP-скрипт.

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

Исходные файлы сайта


Знак папкиИсходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

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

При этом, временно сформированные в данной статье PHP-скрипты, размещенные в файле "main.php" папки "articles" корневого каталога, закомментированы. Для проверки рассмотренных здесь примеров, следует раскомментировать соответствующие фрагменты кода.

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

С уважением, Николай Гришин


Комментарии


Если у Вас возникли вопросы, или есть какие-либо пожелания по представлению материала, либо заметили какие-нибудь ошибки, а быть может просто хотите выразить свое мнение, пожалуйста, оставьте свои комментарии. Такая обратная связь очень важна для возможности учета мнения посетителей.

Буду Вам за это очень признателен!

comments powered by HyperComments