Отправка 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