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.
Пример можно скачать здесь.

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

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

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

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

    1) www.ip-cci.by

    2) 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 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 ERROR: Failed to connect to server: Connection refused (111) 2015-08-19 11:45:20 SMTP connect () failed. github.com/PHPMailer/PHPM.../Troubleshooting ne okSMTP connect () failed. github.com/PHPMailer/PHPM.../Troubleshooting»

    работаю через gmail, пробовал через mail.ru — все тоже.

    Помогите пожалуйста, что не так может быть?

    1. Ошибка при попытке соединения. Отказ в соединении. Проверьте включен ли у вас SMTP в настройках почтового ящика и проверьте порт, который вы используете при подключении к удаленному серверу. Должно помочь.

      Плюс ещё у GMAIL всё давно через SSL. Порт, ЕМНП, 993 или 995. Указывайте порт при подключении и всё должно заработать.

  9. После переноса сайта на новый хостинг перестала работать форма:

    Invalid address: in class.phpmailer.php on line 857

    Подскажите пожалуйста, что это может быть?

  10. Добрый день!

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

Leave a Reply

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