В PHP достаточно популярно использовать скрипты которые автоматизируют процесс отправки писем. В данной статье мы рассмотрим простой скрипт который выполняем отправку писем на почту получателей по средствам SMTP(Simple Mail Transfer Protocol ). Было бы слишком просто ограничится только этим функционалом, скрипт поддерживает и вложения то есть, вы сможете прикрепить pdf, txt или doc файл в своем письме.

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

Скрипт работает с классом km_smtp_class.php, класс хорош тем, что поддерживает разные протоколы SSL и TLS которые предоставляют защищенную передачу данных.

Вот и сам скрипт:

"smtp.mail.ru", "SMTP_port" => "25", "SMTP_email" => "[email protected]", "SMTP_pass" => "1111111", "SMTP_type" => "null"); // Email получателя $Receiver = "[email protected]"; // Тема сообщения $Subject = "Отправляем письмо из PHP"; // Текст сообщения (в HTML) $Text = "Привет!
Сообщение отправлено из скрипта Mowshon Сайт: http://сайт"; // Вложение в письме - адрес к файлу $Attachment = ""; /* $mail = new KM_Mailer(сервер, порт, пользователь, пароль, тип); */ /* Тип может быть: null, tls или ssl */ $mail = new KM_Mailer($SenderConfig["SMTP_server"], $SenderConfig["SMTP_port"], $SenderConfig["SMTP_email"], $SenderConfig["SMTP_pass"], $SenderConfig["SMTP_type"]); if($mail->isLogin) { // Прикрепить файл if($Attachment) {$mail->addAttachment($Attachment);} // Добавить ещё получателей $mail->addRecipient("[email protected]"); $mail->addRecipient("[email protected]"); /* $mail->send(От, Для, Тема, Текст, Заголовок = опционально) */ $SendMail = $mail->send($SenderConfig["SMTP_email"], $Receiver, $Subject, $Text); // Очищаем список получателей $mail->clearRecipients(); $mail->clearCC(); $mail->clearBCC(); $mail->clearAttachments(); } else { echo "Возникла ошибка во время подключения к SMTP-серверу"; } ?>

Настройка скрипта лежим в основном на массиве $SenderConfig , тут мы должны указать SMTP:сервер, порт, логин и пароль от электронной почты. Опишем каждый ключ массива:

SMTP_server - адрес SMTP сервера (индивидуальный адрес для разных почт)

Почта Mail.ru : smtp.mail.ru порт: 25, 587 и 465 (с шифрованием SSL)

Почта Yandex : smtp.yandex.ru порт: 25, 587 465 (SSL порт)

Почта Rambler : mail.rambler.ru порт: 25, 587 465 (SSL порт)

Почта Yahoo : smtp.mail.yahoo.com SSL-порт: 465

(Если понадобится адрес smtp серверов которые нет в списке - пишите в комментариях)

SMTP_port - Мы его сверху уже описали для каждого smtp сервера.

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

SMTP_pass - Пароль от электронной почты которая была указана как значение в ключе SMTP_email


SMTP_type - По умолчанию NULL. Протокол по которому будут отправлены письма. Протоколы: SSL и TLS

Вложения в письмо можно добавить просо указывая полный адрес к файлу в переменную $Attachment (/var/patch/to/file/File.pdf)

Если будут вопросы пишите их в комментариях ниже.

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

Почему отправка через SMTP а не mail()

У меня ответ довольно простой — какое-то время через мой сервер вирусяки отправляли тонны писем, что привело в БАНу моего IP-адреса у многих почтовиков, в частности у gmail.com, а в связи с этим пользователи могли получать письма, поэтому пришлось искать альтернативу, и я ее нашел — это SMTP

Возможно, вас заинтересует, чем же мой скрипт лучше других, которые валяются на просторах?! Отвечу

  1. Он работает с почтой yandex, rambler, mail (gmail победить не смог)
  2. Понятный код. Чтобы его настроить достаточно поменять несколько строчек
  3. Отправляет письма в HTML формате

Вот достоинства моего скрипта, коих я не нашел каком-либо в интернете, но из каждого я взял все необходимо. И так, давайте рассмотрим код.

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

С помощью данного ключа вы сможете управлять своим объявлением.

"; $text_email .= " "; 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 = substr(get_data($smtp_conn),0,3000); echo $code; if($code != 334) {print "сервер не разрешил начать авторизацию"; fclose($smtp_conn); exit;}

И получаем в итогде вполне конкретную ошибку

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

Что она означает точно — я не знаю, но полагаю, что связанно что-то с защищеннымнезащищенным подключением. Как от нее избавиться — пока не знаю, поэтому gmail остался не побежденным на данный момент.

Mail PHP

Именно эта функция реализована по умолчанию в качестве отправки Email. Данный функционал не требует стороннего сервера для пересылки Email. Для того чтобы проверить корректность данной функции достаточно создать в папке с сайтом файл test.php и разместить туда следующий код:

Где вместо "EMAIL ПОЛУЧАТЕЛЯ" введите Email, на который должно прийти письмо.

Поместите данный файл в корне вашего сайта.

Далее в адресной строке введите www.ВашДомен/test.php . В случае если на указанную почту пришло письмо, то Ваш хостинг корректно работает с функцией отправки писем "Mail PHP" . Не исключено что письмо попало в спам, так что его тоже необходимо проверить.

Если письмо пришло в непонятной кодировке, поменяйте строку: "Проверка отправки почты" на "Проверка отправки почты", "Content-type:text/html;charset=utf-8" .

И повторите отправку письма через адресную строку Вашего браузера.

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

Из недостатков данного метода стоит отметить не постоянность работы данного способа. Могут возникать перебои в отправки писем на стороне хостинга.

Главный же недостаток данного метода заключается в том, что все письма, пришедшие на email клиентов, не будут распознаваться почтовыми сервисами (gmail, mail.ru, yandex.ru) такими, что были отправлены напрямую с Вашего сайта.

Почтовый сервис Gmail отображает данные письма со знаком вопроса и подписью: "Системе Gmail не удалось подтвердить, что это письмо отправлено из домена ВашДомен Возможно, это спам”.

Чтобы избежать данной ситуации .

SMTP (Simple Mail Transfer Protocol)

SMTP - протокол передачи почты. В общей сложности для настройки передачи почты посредством данного протокола необходим сам SMTP сервер. Наиболее распространенный вариант использования корпоративной (доменной) почты yandex.ru в качестве SMTP сервера https://pdd.yandex.ru/ .

Прежде всего необходим аккаунт (почта) yandex , на основании которой будут созданы почты для Вашего домена: "order@ВашДомен" "info@ВашДомен"… Основной аккаунт нигде не будет виден и используется только лишь для того чтобы в дальнейшем на его основании создавать доменные почты.

После авторизации в своем личном аккаунте yandex создается доменная почта по ссылке https://pdd.yandex.ru/ . Именно эту доменную почту будут видеть пользователи в поле “Отправитель”

Поле "Отправитель" является обязательным при отправки писем посредством SMTP. Используя SMTP в качестве отправки писем, реализуется связка "Домен" - " Email" , тем самым письма распознаются почтовыми сервисами.


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

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 ="#" method ="post" >

    Форма обратной связи

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

    "contact-block" >

    "contact-input" >

    "text" id ="contact-name" name ="contact-name" title ="Имя должно быть на русском и содержать не менее 3 символов" pattern ="{3,}" required >

  1. "empty-contact" >

    "contact-input" >

    "email" id ="contact-email" name ="contact-email" required >

  2. "contact-subject" >

  3. "contact-comment" >

  4. "contact-button" >

    "submit" name ="contact-button" value ="Отправить" >

Рис.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 Скрипт для отправки 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, то мы сможем посмотреть подробную информацию о возникшей ошибки и выяснить причину ее возникновения.

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

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

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

Но для того, чтобы убедиться, что письмо действительно было доставлено до адресата, войдем в почту с адресом [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 администраторы не отключают Basic Authentication . Проверить ее поддержку можно в настройках принимающего коннектора.

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

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

Имя пользователя: testuser@ contoso. com , в кодировке Base64 получилось: dGVzdHVzZXJAY29udG9zby5jb20=

Пароль: $ up3 RsTr) ng — в Base64 JHVwM1 JzVHIpbmc=

Теперь в командой строке с помощью 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: 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.

На этом все, тестовое письмо должно успешно доставиться в ящик получателя.


Close