Окт
Отправка почты средствами PHP
При работе моих скриптов происходят разные события о которых я бы хотел бы знать. Один из вариантов таких оповещений это отправка сообщения на электронную почту. В этой заметке я бы хотел бы рассказать как происходит средствами php отправка почты.
В моих скриптах средствами php отправка email происходит с помощью всем известного класса phpmailer и удалённого smtp сервера. Я использую smtp сервер google. Ну а теперь обо всём по порядку.
Smtp google
Ничего сложного в настройке и подключении smtp сервер google нет. Что бы получить к нему доступ достаточно создать ящик электронной почты в gmail. Логин и пароль доступа к ящику будет подходить и к серверу. Важно только знать основные google smtp настройки, которые мы будем использовать в phpmailer.
- адрес smtp сервера -
smtp.gmail.com
- тип соединения -
ssl
- порт сервера -
465
- логин -
адрес ящика
- пароль -
ваш пароль от ящика электронной почты
Phpmailer
Phpmailer это всем известный php класс для отправки email. Скачать его можно c github
здесь.
Обычно я скачиваю
файлы class.phpmailer.php, class.pop3.php, class.smtp.php
и складываю их в корень сайта. Теперь поговорим о подключении и настройке Phpmailer.
Создадим в корне сайта файл index.php, в нём мы создадим подключение и настройки.
//подключаем phpmailer require_once('class.phpmailer.php'); //получаем экземпляр $mail = new PHPMailer(); //задаём как работать с SMTP сервером $mail->IsSMTP(); //адрес smtp сервера $mail->Host = "smtp.gmail.com"; //сообщения дебагера, 0-не показываем $mail->SMTPDebug = 0; //если сервер требует авторизации $mail->SMTPAuth = true; //тип шифрования $mail->SMTPSecure = "ssl"; //порт сервера $mail->Port = 465; //приоритет почты, 3 - нормально $mail->Priority = 3; //кодировка $mail->CharSet = 'UTF-8'; $mail->Encoding = '8bit'; //тема письма $mail->Subject = "Тест php mailer"; $mail->ContentType = "text/html; charset=utf-8\r\n"; //адрес почтового ящика gmail $mail->Username = "ваш_почтовый_ящик"; //ваш пароль от ящика $mail->Password = *************; $mail->isHTML(true); //текст письма $mail->Body = "привет от Phpmailer"; $mail->WordWrap = 50; //адрес, на котоый нужно отправить письмо $mail->AddAddress("адрес_получателя"); if(!$mail->send()) { echo 'ошибка'; exit; } echo 'сообщение отправлено';
Из листинга я думаю всё понятно. Если правильно прописать все настройки и запустить файл index.php, то мы отправим на указанный email сообщение "привет от Phpmailer". В принципе мне данного функционала хватает, для того что бы силами php отправить email , так что дальше копаться в классе не стал. Вот наверное и всё, по традиции написал небольшой пример, и разобрал его.
В примере имеем файл index.php. В нём есть поле с указанием email, куда надо отправить письмо и поле с текстом письма. Через ajax проискодит отправка данных из полей в файл send.php. В send.php подключается phpmailer и происходит средствами php отправка email. Так же к index.php подключается файл myjs.js. В нём происходит проверка правильности заполнения полей формы, а так же отправка данных ajax в send.php и получение ответа об отправке письма или ошибке. Пример я писал используя bootstrap для вёрстки. Классы бутстрап я убрал из листинга что бы было меньше кода. И так основной кусок index.php.
<form> <div> <label for="email">Ваш email</label> <div> <input type="text" id="email" placeholder="Введите email на который отправляете письмо" name="email"/> </div> </div> <div> <div class="emailalert"> <!-- сюда выводим сообщение ошибки заполнения --> </div> </div> <div class="form-group"> <label for="body">Ваше сообщение</label> <div> <textarea rows="5" id="body" placeholder="Введите текст вашего письма" name="body"></textarea> </div> </div> <div> <div class="bodyalert"> <!-- сюда выводим сообщение ошибки заполнения --> </div> </div> </form> <div> <button class="submit">Отправить письмо</button> </div> <div class="load" style="display: none;"> <img class="img-responsive" src="/css/preload.gif"> </div> <!-- Modal bootstrap--> <div id="myModal"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header" style="border: none;"> <button type="button">×</button> </div> <div class="modal-body"> <div id='result'> <!-- сюда выводим сообщение об отправке письма --> </div> </div> </div> </div> </div>
Будем считать что myjs.js подключён к index.php. Листинг myjs.js
$(document).ready(function(){ //обработка клика по кнопке отправить $('.submit').click(function(){ //стираем старый алерт $('.emailalert').html(' '); //получаем значение поля ввода var em=$("#email").val(); //alert(em); //шаблон регулярного выражения //для проверки правильности ввода email var emRegExp=/^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/; //проверка через ф-ю .test() //соотнош рег выражения и данных в форме if(!emRegExp.test(em)){ var eReg='<div>Неправильный email адрес</div>'; $('.emailalert').html(eReg); } //если поле пустое if(em==''){ var e='<div>заполните поле с адресом электронной почты</div>'; //выводим предупреждение $('.emailalert').html(e); } //стираем старый алерт $('.bodyalert').html(' '); var bd=$("#body").val(); //если поле пустое if(bd==''){ var b='<div>Заполните поле с текстом письма</div>'; //выводим предупреждение $('.bodyalert').html(b); } //если все поля заполнены правильно //отсылаем данные ajax в send.php if(emRegExp.test(em)&&!em==''&&!bd==''){ $.ajax({ //как будем передавать данные type: "POST", //куда передаём url: "send.php", //какие данные передаём data: {email: em, body: bd}, //событие перед отправкой ajax beforeSend: function(){ //стираем старый вывод $('#result').html(' '); //выводим гифку $(".load").show(); }, //событие после получения ответа, //получаем массив в data success: function(data){ //скрываем гифку $(".load").hide(); $('#result').html(data); //выводим модальное окно //эта ф-я из бутстрап $('#myModal').modal(); } }); } }) })
И наконец send.php
//подключаем phpmailer require_once('class.phpmailer.php'); /*ф-я фильтрации*/ function myclear($dt){ $dt=stripslashes($dt); $dt=strip_tags($dt); $dt=trim($dt); return $dt; } if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { $email = myclear($_POST['email']);//фильтруем $body = myclear($_POST['body']); $mail = new PHPMailer(); $mail->IsSMTP(); $mail->Host = "smtp.gmail.com"; $mail->SMTPDebug = 0; $mail->SMTPAuth = true; $mail->SMTPSecure = "ssl"; $mail->Port = 465; $mail->Priority = 3; $mail->CharSet = 'UTF-8'; $mail->Encoding = '8bit'; $mail->Subject = "Тест php mailer"; $mail->ContentType = "text/html; charset=utf-8\r\n"; $mail->Username = "мой почтовый ящик"; $mail->Password = "мой пароль"; $mail->isHTML(true); $mail->Body = $body; $mail->WordWrap = 50; $mail->AddAddress($email); if(!$mail->send()) { echo 'Ваше сообщение не отправлено'; exit; } echo 'Ваше сообщение отправлено'; }
Вот такой вот не хитрый пример как делается отправка сообщения на почту php.
Комментарии
Камиль
20.02.2017 12:20 Ответить
Здравствуйте,ск ачал primer_phpmaile r.zip для проверки работоспособнос ти скрипта на сервере,изменил настройки на свои, но почему-то выдает ошибку SMTP Error: The following recipients failed: mailbk.ru
Ваше сообщение не отправлено
Помогите пожалуйста!
Алексей Григорьев
20.02.2017 12:51 Ответить
Здравствуйте, возможно вы не правильно указали smtp сервер (уточните у хостера или провайдера). Если всё указано верно то обратитесь к хостеру или вашему провайдеру. У меня на таймвеб то ли вашу ошибку выдавало то ли Mailer Error: SMTP Error: Could not connect to SMTP host, не помню. Только через тех поддержку починил. Был их косяк. Ещё включите дебагер $mail->SMTPDebu g = 1; посмотрите что он выдаёт.
Камиль
20.02.2017 20:33 Ответить
С $mail->SMTPDebu g = 1; выдает SMTP -> ERROR: RCPT not accepted from server: 550-Verificatio n failed for 550-Unrouteable address 550 Sender verify failed
SMTP Error: The following recipients failed: почтаbk.ru
Алексей Григорьев
20.02.2017 20:47 Ответить
Не уверен, но это скорее всего ошибка из за неправильно настроенного почтового сервера. Вам лучше обратиться в тех поддержку вашего хостера.
Камиль
20.02.2017 21:15 Ответить
я ведь могу указать не свои настройки smtp (хостинга),а к примеру smtp.gmail.com для проверки?
Алексей Григорьев
20.02.2017 21:22 Ответить
Ну в примере я и не указывал smtp хостинга, а всё делал через smtp google. Вам просто для этого нужно почту на gmail сделать если нет, и будете юзать smtp google, а не прова. Все настройки в примере для гугла рабочие, нужны только логин и пасс от почты.
Камиль
20.02.2017 21:49 Ответить
все равно почему-то не получилось отправить,хотя все данные smtp.gmail.com( логин,пассворд- верны)SMTP Error: Could not connect to SMTP host.
Алексей Григорьев
20.02.2017 21:54 Ответить
Вот про такую ошибку (SMTP Error: Could not connect to SMTP host) я писал выше. Когда делал пример для этой статьи у меня то же через smtp гугла ничего не работало. Решили проблему на стороне хостера. Так что вам точно нужно писать в тех поддержку.
Камиль
20.02.2017 22:06 Ответить
Ясно,спасибо большое.Завтра отпишусь.
Сергей
26.03.2018 16:58 Ответить
Добрый день, вот у меня ошибка SMTP Error: Could not connect to SMTP host. Скажите пожалуйста, как можно устранить данную неполадку.
Алексей Григорьев
26.03.2018 17:07 Ответить
День добрый, как я писал выше возможны проблемы у вашего хостера. Попробуйте отправить сообщение с своего локального компа, облака или другого хостера. Внимательно просмотрите настройки, которые вы задали при отправке почты (порты, адреса и тд)
Сергей
26.03.2018 17:35 Ответить
Настройки у меня в порядке, я уже написал в тех поддержку gmail, буду ждать ответа