Отправка Email средствами php
Одним из самых распространенных способов обмена информацией в Интернете является электронная почта или другими словами E-mail сообщение.
Миллионы сообщений каждый день проходят по всемирной сети начиная от поздравительной открытки и заканчиваю деловым предложением.
И вот однажды, как мне в этот раз, Вам понадобилось отправить сообщение пользователю по email. И тут сразу возник вопрос, какими средствами это можно сделать на PHP? Рассмотрим несколько возможных способов.
Одним из самых распространенных способов отправки сообщений в php явлляется использование функции mail. Самый простой пример ей использования:
<?php
// Наше сообщение
$message = "Line 1\nLine 2\nLine 3";
// После 70 символов делаем перенос на следующую строчку
$message = wordwrap($message, 70);
// Отправляем сообщение
mail('[email protected]', '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('[email protected]', 'Пример письма 1', 'Текст текст текст');
$mail->sendMail('[email protected]', 'Пример письма 2', '<h1>Большой заголовок!</h1>');
$mail->sendMail(array('[email protected]', '[email protected]'), 'Пример письма 3', '<h1>Большой заголовок!</h1>');
Вот так, достаточно просто, можно отправлять сообщения используя готовый класс на любой платформе, например, через Ваш собственный почтовый ящик. В последствии данный класс можно расширить, например, добавить поддержку вложений. Ведь PHPMailer v5.1 их поддерживает (смотрите примеры и документацию).
А вот и архив с рабочим примером. Тестировал на mail.ru