Отправка Email средствами php

Одним из самых распространенных способов обмена информацией в Интернете является электронная почта или другими словами E-mail сообщение.

Миллионы сообщений каждый день проходят по всемирной сети начиная от поздравительной открытки и заканчиваю деловым предложением.

И вот однажды, как мне в этот раз, Вам понадобилось отправить сообщение пользователю по email. И тут сразу возник вопрос, какими средствами это можно сделать на PHP? Рассмотрим несколько возможных способов.

Одним из самых распространенных способов отправки сообщений в php явлляется использование функции mail. Самый простой пример ей использования:

<?php
// Наше сообщение
$message = "Line 1\nLine 2\nLine 3";  

// После 70 символов делаем перенос на следующую строчку
$message = wordwrap($message, 70); 

// Отправляем сообщение
mail('caffeinated@example.com', 'My Subject', $message);

Так же через данную функцию можно отправлять и html сообщения указав дополнительные заголовки (читаем страницу документации). Казалось бы вот и все, что нам ещё надо? Но на практике все совсем сложнее.

Сама по себе функция mail не отправляет почту, она использует программу sendmail, которая и занимается отправкой сообщений.

Таким образом, чтобы php скрипт мог отправлять почту нужно установить и настроить sendmail.

Но, тут возникает несколько неудобств: первое-если на linux машине sendmail надо лишь настроить, то на windows машине ещё надо ее скачать и установить. И собственно второе — на некоторых хостингах она может быть отключена. Что делать?

Если вы использует в разработке Zend Framework, то у вас не возникнет такой вопрос, так как для отправки сообщений в нем реализован очень удобный класс Zend_Mail. Отправлять через него сообщения просто. Тоже самое, например, касается фреймворка Symfony при работе с почтой. Думаю, что и во многих других фреймворках данная проблема решена. Но, если нет необходимости использовать какой-либо фрейморк, то вариант первый — написать самому класс для работы с почтой, или второй — найти готовый.

Думаю, стоит пойти по простому пути и не изобретать велосипед. А,если уж что, всегда код можно доработать под себя.

Так и был найден простой и достаточно функциональный класс PHPMailer v5.1 (LGPL). К его преимуществам можно отнести:

  • Поддержка текстовых и html сообщений
  • Удобный дебагинг
  • SMTP авторизация
  • Имеет небольшой размер
  • Поддержка 8bit, base64, binary, and quoted-printable кодирования
  • Умеет работать с Gmail и Exchange и другими почтовыми серверами
  • Имеет хорошую документацию (англ)

Существует облегченная версия класса. Основное отличие от полной — нет поддержки отправки через SMTP.

Воспользуемся полной версией, для отправки сообщения через SMTP. Так мы не будет зависеть ни от платформы, ни на отсутствие прав отправки через sendmail. А будем отсылать почту, например, через свой почтовый ящик.

После скачивания архива можно увидеть множество примеров отправки сообщений. Что уже очень радует. Из всего архива нам понадобится 2 файла

  • class.phpmailer.php — Основной класс
  • class.smtp.php — Поддержка SMTP

Реализуем простенький класс для отправки сообщений MailAgent.

class MailAgent {

 private $_SMTPServer = 'Ваш SMTP сервер';
 private $_SMTPLogin = 'Ваш логин к серверу';
 private $_SMTPPass = 'Пароль к сервер';
 private $_mail = null;
 private $_mailFrom = 'email от кого будет уходить почта';

 private function initMailAgent()
 {
  require_once('class.phpmailer.php');

  $this->_mail  = new PHPMailer();
  // Устанавливаем, что наши сообщения будет идти через
  // SMTP сервер
  $this->_mail->IsSMTP();

  // Можно раскомментировать след. строчку для отладки
  // 1 = Ошибки и сообщения
  // 2 = Только сообщения
  //$mail->SMTPDebug  = 2;        		

  // Включение SMTP аутентификации
  // Большинство серверов ее требуют
  $this->_mail->SMTPAuth   = true;
  // SMTP Сервер отправки сообщений
  $this->_mail->Host       = $this->_SMTPServer;
  // Порт сервера (чаще всего 25)
  $this->_mail->Port       = 25;
  // SMTP Логин для авторизации
  $this->_mail->Username   = $this->_SMTPLogin;
  // SMTP Пароль для авторизации
  $this->_mail->Password   = $this->_SMTPPass;
  // Кодировка сообщения
  $this->_mail->CharSet    = 'utf-8';
 }

 public function sendMail( $address, $subject, $body, $from='' )
 {
  if ($this->_mail == null) {
   $this->initMailAgent();
  }

  // Устанавливаем от кого будет уходить почта
  $this->_mail->SetFrom($from=='' ? $this->_mailFrom : $from);
  // Устанавливаем заголовк письма
  $this->_mail->Subject    = $subject;
  // Текст сообщения
  $this->_mail->MsgHTML($body);

  if (is_array($address)) {
   // Отправка сообщений сразу нескольким пользователям
   foreach($address as $value) {
    $this->_mail->AddAddress($value);
   }
  } else {
   // Адрес получателя. Второй параметр - имя получателя (не обязательно)
   $this->_mail->AddAddress($address);
  }
  // Отправляем сообщение
  if(!$this->_mail->Send()) {
    echo "Ошибка отправки: " . $this->_mail->ErrorInfo;
  } else {
    echo "Сообщение отправлено!";
  }
 }

}

А теперь пример использования класса.

$mail = new MailAgent();

$mail->sendMail('mail@vexell.ru', 'Пример письма 1', 'Текст текст текст');
$mail->sendMail('mail@vexell.ru', 'Пример письма 2', '<h1>Большой заголовок!</h1>');
$mail->sendMail(array('mail@vexell.ru', 'support@vexell.ru'), 'Пример письма 3', '<h1>Большой заголовок!</h1>');

Вот так, достаточно просто, можно отправлять сообщения используя готовый класс на любой платформе, например, через Ваш собственный почтовый ящик. В последствии данный класс можно расширить, например, добавить поддержку вложений. Ведь PHPMailer v5.1 их поддерживает (смотрите примеры и документацию).

А вот и архив с рабочим примером. Тестировал на mail.ru