PHPmailer – отправка писем через SMTP

Сегодня пришло первое письмо в Helper:

Name:  zeleboba
Email:   zelebb@gmail.com
Сайт:   http://www.knigoobzor.ru
Ваша проблема:	Проблема с сайтом knigoobzor.ru. Сейчас там дделываю возможность оставлять комменты к статьям. Хочу сделать возможность подписки и уведомления меня(админа) о том, что кто-то новый коммент оставил. Проблема состоит в том, что на хостинге сайта запрещено использование mail();. Можно ли реализовать отправку через smtp, например Яндекса? Намекни как. Или где почитать про это. Знаю, что есть плагины для wordpress, которые это делают, значит и для обычного сайта можно.

Данный класс предназначен для отправки почты с помощью php, если по каким-то причинам, от вас не зависящим, вы не можете использовать функцию mail(). Если же вы можете использовать mail() (возможность должа быть включена на сервере в конфигурации php), то можно лучше использовать её. Здесь же можно посмотреть на синтаксис команды mail: линк.

Мы будем использовать библиотеку PHPMailer (официальный сайт).

Закачав PHPMailer на сервер мы можем начинать работать. Создадим конфигурационный файл config.php:

<?php
$__smtp = array(
	"host" => "smtp.yandex.ru", //smtp сервер
	"debug" => 2,                   //отображение информации дебаггера (0 - нет вообще)
	"auth" => true,                 //сервер требует авторизации
	"port" => 25,                    //порт (по-умолчанию - 25)
	"username" => "%username%",//имя пользователя на сервере
	"password" => "%password%",//пароль
	"addreply" => "your@email.com",//ваш е-mail
	"replyto" => "your@email.com"      //e-mail ответа
);
?>

Теперь используем класс PHPMailer для отправки письма с авторизацией на SMTP сервере. Я создам отдельную функцию, которая будет отправлять письмо на определенный e-mail:

<?php 
	function smtpmail($to, $subject, $content, $attach=false)
	{
require_once('config.php'); //путь до конфигурационного файла для вашего smtp сервера
require_once('class.phpmailer.php'); //путь до класса phpmailer
$mail = new PHPMailer(true);

$mail->IsSMTP();

try {
  $mail->Host       = $__smtp['host']; 
  $mail->SMTPDebug  = $__smtp['debug']; 
  $mail->SMTPAuth   = $__smtp['auth'];
  $mail->Port       = $__smtp['port']; 
  $mail->Username   = $__smtp['username'];
  $mail->Password   = $__smtp['password'];
  $mail->AddReplyTo($__smtp['addreply'], $__smtp['username']); 
  $mail->AddAddress($to);                //кому письмо
  $mail->SetFrom($__smtp['addreply'], $__smtp['username']); //от кого (желательно указывать свой реальный e-mail на используемом SMTP сервере
  $mail->AddReplyTo($__smtp['addreply'], $__smtp['username']);
  $mail->Subject = htmlspecialchars($subject);
  $mail->MsgHTML($content);
  if($attach)  $mail->AddAttachment($attach);
  $mail->Send();
  echo "Message sent Ok!</p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); 
} catch (Exception $e) {
  echo $e->getMessage(); 
}
}
?>

Думаю, что разбирать каждую функцию разбирать безсмысленно из-за понятности по названию. Хочется добавить, что в официально версии есть много примеров (работа с ssl, pop3 прежде smtp, работа с gmail и тд). Мы разобрали самый простой и самый распространенный вариант отправки писем через smtp средствами php.
Пример можно скачать здесь.

37 Replies to “PHPmailer – отправка писем через SMTP”

      1. А там просто не WordPress =) Там мой самопал, написанный мной с нуля в целях постижения и тренировки в php =)

  1. PHPmailer много где используется, если я не ошибаюсь, то соотв. модуль в Друпале есть.

  2. В чем может быть проблема?

    1) http://www.ip-cci.by/

    2) http://belpatent.faberstudio.by/

    Два одинаковых сайта, расположены на разных хостах, первый вариант при отправке письма в онлайн заказе, не выдает ошибку пишет письмо успешно отправлено, но письмо на емайл не приходит

    Во втором варианте всё нормально, пишет письмо успешно отправленно и тут же на емайл приходит письмо, в чем может быть дело?

    Пробовал даже через SMTP опять же пишет письмо отправленно, на почте пусто!

    1. Быть может просто на сервере на котором проблема с отправлением заблокирован 25 порт провайдером в целях безопасности и уменьшения количества распространения спама? Проверьте это обратившись к своему провайдеру (хостеру).

      1. Да спасибо, именно в этом и была проблема, жаль что так поздно ответили :) Может кому другому поможет, я реализовал через SMTP отправку писем

  3. скачал пример, все как указано в статье сделал, ругается на строке “try {“: Parse error: parse error in *\index.php on line 10

  4.  Привет всем, а как сделать рассылку по бд. Ну как реализовать, скажем выборку адресов из бд и натравить на них (на получателей) phpmailer.
    В Вашем примере одиночная отправка; Меня интересует как сделать тоже самое только многим польчателям.

    1. Напишите свой скрипт, который будет в цикле использовать данный скрипт. Кстати, при массовой рассылке есть большой процент, что ваш провайдер (владелец хостинга) забанит вас за спам.

  5. Пишет просто “Invalid address:” попробывал на яндексе и на mail.ru Никаго результата. Из чего может быть? Может ваш код уже устарел?

  6. Добрый вечер, выдает ошибку

    SMTP -> ERROR: Failed to connect to server: Попытка установить соединение была безуспешной (10060)
    SMTP Error: Could not connect to SMTP host.

    Настроено вот так:
    “smtp.yandex.ru”,
    “debug” => 2,
    “auth” => true,
    “port” => 25,
    “username” => “**”,
    “password” => “**”,
    “addreply” => “**@yandex.ru”,
    “replyto” => “**@yandex.ru”
    );
    ?>

    раскомментировал в php.ini строчку extension=php_openssl.dll, не дало результатов.

  7. Привет! шлёт на ура! Спасибо! но на моём сайте imper.tk при отправке выводит 2014-12-16 18:21:41 SERVER -> CLIENT: 220 smtp1m.mail.yandex.net ESMTP (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru) 2014-12-16 18:21:41 CLIENT -> SERVER: EHLO imper.tk 2014-12-16 18:21:41 SERVER -> CLIENT: 250-smtp1m.mail.yandex.net 250-8BITMIME 250-PIPELINING 250-SIZE 42991616 250-AUTH LOGIN PLAIN 250-DSN 250 ENHANCEDSTATUSCODES 2014-12-16 18:21:41 CLIENT -> SERVER: и ещё дофига. Я так понимаю это ход операции. Вопрос А как его скрыть?

  8. почему функция smtp Отправляет 2 письма вместо одного, недоработка phpmailer?

  9. Скажите с чем может быть связана вот такая ошибка при попытки отправить письмо
    “SMTP ERROR: Failed to connect to server: Connection refused (111) 2015-08-19 11:45:20 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting ne okSMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
    работаю через gmail, пробовал через mail.ru – все тоже.
    Помогите пожалуйста, что не так может быть?

    1. Ошибка при попытке соединения. Отказ в соединении. Проверьте включен ли у вас SMTP в настройках почтового ящика и проверьте порт, который вы используете при подключении к удаленному серверу. Должно помочь.
      Плюс ещё у GMAIL всё давно через SSL. Порт, ЕМНП, 993 или 995. Указывайте порт при подключении и всё должно заработать.

  10. После переноса сайта на новый хостинг перестала работать форма:
    Invalid address: in class.phpmailer.php on line 857
    Подскажите пожалуйста, что это может быть?

  11. Добрый день!
    После переезда на новый хостинг перестала отправляться информация. Т.е. письма не доходят совсем. Подскажите, в чем может быть проблема? Куда копать?

  12. За инструкцию спасибо, а страничка эта либо с вируснёй либо майнит биткойны без разрешения, потому что загрзка процессора на ней 146%

Leave a Reply

Your email address will not be published. Required fields are marked *