2016
26
Окт

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

grigoriev
6061
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 Ответить

Ясно,спасибо большое.Завтра отпишусь.

Добавить комментарий


Защитный код
Обновить