Рис.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
Давно искал решение, чтобы отправлять письма пользователям не через функцию mail() в PHP, а через SMTP почтовых серверов. В интернете информации разнообразной не так много, а то что есть — работает не совсем так, либо вообще не работает. Поэтому я собрал все во едино и написал свой код, основываясь на уже готовые, которые представлены на сайтах.
Почему отправка через SMTP а не mail()
У меня ответ довольно простой — какое-то время через мой сервер вирусяки отправляли тонны писем, что привело в БАНу моего IP-адреса у многих почтовиков, в частности у gmail.com, а в связи с этим пользователи могли получать письма, поэтому пришлось искать альтернативу, и я ее нашел — это SMTP
Возможно, вас заинтересует, чем же мой скрипт лучше других, которые валяются на просторах?! Отвечу
- Он работает с почтой yandex, rambler, mail (gmail победить не смог)
- Понятный код. Чтобы его настроить достаточно поменять несколько строчек
- Отправляет письма в 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 остался не побежденным на данный момент.
Отправка почты через SMTP с локального сервера позволяет протестировать отправку сообщений с сайта находящемся на локальной машине, или проще говоря, локальном сервере. Для этого можно использовать любой почтовый сервис yandex, google или mail.ru.
Прежде всего, SMTP (Simple Mail Transfer Protocol) - это широко используемый сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP. И такими протоколами обладают все популярные почтовые сервисы.
С появлением локальных серверов, отпала необходимость выбора хостинг-провайдера для того чтобы проверить работоспособность отдельных скриптов или cms-систем, а тем более еще и платить за это. Гораздо проще все протестировать на компьютере, ну а затем можно и показать всем что «натворили».
Многие такие сервера имеют уже встроенное программное обеспечение и необходимый функционал по работе с почтой, нужно его только правильно настроить.
Для проверки работоспособности такой почты необходим самый минимум:
- В качестве локального сервера можно использовать Openserver.
- И простенький скрипт, шаблон которого можно взять чуть ниже.
- Почтовый сервер можно использовать любой.
Отправка почты php через SMTP-настройка скрипта
Шаблон простенького скрипта который можно скопировать чуть ниже, или скачать еще на сотнях подобных сайтов, необходимо отредактировать.
Для начала нужно поменять в шаблоне скрипта некоторые значения.
to
— меняем на почтовый адрес куда будет отправлено почтовое сообщение.
subject
— тема письма
message
— само сообщение, или тело письма.
Пример моего скрипта:
Можно конечно немного расширить функционал и сделать так, чтобы скрипт выдавал сообщение об отправки почты. Хоть на самом деле отправку производит именно SMTP-сервер, а скрипт лишь формирует сообщение.
Для примера можно написать так:
Все подставленные значения должны быть в кавычках, иначе скрипт выдаст ошибку. После этого можно сохранить скрипт в папку локального сервера.
Например: domains/send/index.php
и приступать к настройке отправки почты через SMTP opensrerver.
Почта будет приходить на любой адрес, который будет указан в скрипте вместо значения ‘to’
, но обрабатывать и отправлять эту почту будет именно тот SMTP, который будет указан в настройках openserver.
- Запускаем сервер
- Открываем модуль openserver с настройками в меню «почта»
- Заполняем все поля как показано на картинке, при этом, имя пользователя, e-mail отправителя и пароль подставляем от реального почтового ящика на яндексе.
Сохраняем настройки и после того, как сервер будет перезапущен, можно обратиться к самому скрипту. Из папки «Мои сайты», открыть папку «send» в которой и находится сохраненный ранее скрипт index.php.
Как только произойдет обращение к данному скрипту, в новом окне браузера появится информация о том, что скрипт отработал.
После этого стоит проверить свой почтовый ящик, адрес которого был указан в скрипте, пришло ли письмо.
Если его нет, значит что-то настроено не правильно, либо письмо попало в папку спам.
Все остальные настройки выглядят аналогично, но на всякий случай дополнительная информация не помешает.
Для того, чтобы настроить отправку почты через SMTP mail ru, необходимо просто заменить параметры яндекса на параметры mail ru.
А чтобы не перестраивать каждый раз локальные сервер, лучше всего настроить разные профили openserver. Как это сделать показано в видеоуроке .
В этом случае достаточно будет просто загрузить профиль и все настройки, которые были указаны для данного профиля будут доступны после перезапуска сервера. Очень удобная штука и работает очень просто.
Для каждого профиля (совсем не важно как он будет называться), должны быть сделаны свои настройки, если конечно планируется использование разных по своим параметрам скриптов, cms-систем и приложений.
Если нет, то можно обойтись и настройками по умолчанию.
Что касается SMTP mail ru, то здесь все эдентично.
Меняются данные яндекса на данные mail ru
Oтправка почты через smtp google
Для того, чтобы настроить отправку почты через SMTP гугла, стоит чуть постараться.
Во-первых, создание самого профиля в гугле сложнее чем в других системах яндекса и mail ru
Во-вторых, система просто так не пропустит письмо, даже если указать свои данные для входа. Для начала она пришлет письмо в котором и будет вся необходимая информация о дальнейших инструкциях.
В остальном же для гугла настраивается точно так же. Меняются только все данные .
Для настройки отправки почты через другие SMTP, все данные будут примерно одинаковы.
Если у вас все получилось и письма дошли до указанного адресата, значит все сделано правильно. Будет здорово если вы поделитесь своими наработками в комментариях.
Похожие публикации