Окт
Отправка почты средствами 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: mail
bk.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
bk.ru
SMTP Error: The following recipients failed: почта
Алексей Григорьев
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, буду ждать ответа