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

20 комментариев на “PHPmailer — отправка писем через SMTP”

  1. Большое спасибо)

    Сейчас пойду пробовать)

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

  3. У тебя в блоке try { } дублируется 2 раза строки:

    $mail->Host = $__smtp['host'];

  4. youssef:

    не могу понять, оправляю письмо, в ответ пишет Invalid address:

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

    1) www.ip-cci.by

    2) belpatent.faberstudio.by

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

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

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

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

      • sergey:

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

  6. отличный класс, только для повседневных задач в нем слишком много лишнего.

  7. Вот только в функции smtpmail () везде прописан addreply даже где должно быть происано replyto

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

Пообсуждаем?