2016
26
Окт

Отправка почты средствами PHP

grigoriev
19510
php отправка почты
скачать скрипт гостевая книга php
DOWNLOAD
посмотреть гостевая книга php
DEMO

При работе моих скриптов происходят разные события о которых я бы хотел бы знать. Один из вариантов таких оповещений это отправка сообщения на электронную почту. В этой заметке я бы хотел бы рассказать как происходит средствами 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:
Ваше сообщение не отправлено
Помогите пожалуйста!

Алексей Григорьев

Алексей Григорьев

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:

Алексей Григорьев

Алексей Григорьев

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, буду ждать ответа

You have no rights to post comments

Используя данный сайт, вы даете согласие на использование файлов cookie, помогающих мне сделать его удобнее для вас. Уведомление о cookie