Freebsd + php отправка почты без mail() и sendmail [2012]
В статье описано как можно отправлять электронную почту средствами php под freebsd и другими ОС без использования функции mail() использующей sendmail.
С FreeBSD статья связана только подготовкой php-extensions для использования сокетов.
Вступление
Понадобилось мне однажды отправлять электронную почту из скриптов php.
Для этого у php уже есть функция mail() которая использует sendmail для отправки почты.
Но для того чтобы почта уходила в интернет нужно поднимать почтовый сервер, иначе она просто будет лежать на серваке.
Поднимать почтовый сервер мне показалось не целесообразным и я пошел другим путем:
Отправка почты через php и сокеты
Задача:
Используя свой ящик на стороннем сервисе типа mail или yandex - отправлять с него почту из php на любые e-mail адреса.
Дано:
Freebsd 7.3
PHP5
PHP5-Extensions
Apache
Почтовый ящик, например mymail@server.com
Суть и план действий:
Допустим у нашего выдуманного e-mail адреса mymail@server.com
логин: mymail
пароль: 123
smtp сервер: smtp.server.com порт 25.
Допустим адрес назначения, на который будем отправлять почту будет: test@test.ru.
Метод отправки почты будет лежать через php и sockets.
(для справки: сокет в данном случае - это прямой tcp конект на порт и передача через него данных о письме)
Принцип работы:
создаем сокет из php
конектимся на smtp, 25 порт почтового сервера
авторизируемся на нем путем отправки подготовленных пакетов
говорим серверу мол отправь такое то письмо на адрес
отключаемся
выводим ошибки если есть
Проверка php-extensions, настройка php на сокеты под freebsd
Если ваш php не поддерживает сокеты, то скрипт будет выдаватьошибку:
Call to undefined function: socket_create()
По этому, перед тем как использовать сокеты на php удостоверимся что наш php-extensions собран с поддержкой сокетов.
Для этого посмотрим содержимое extensions.ini:
TESTBSD# cat /usr/local/etc/php/extensions.ini
extension=bz2.so
extension=ctype.so
extension=dom.so
extension=filter.so
extension=hash.so
extension=iconv.so
extension=json.so
extension=mysql.so
extension=pdo.so
extension=pdo_sqlite.so
extension=posix.so
extension=session.so
extension=simplexml.so
extension=sqlite.so
Тут должна быть строка extension=sockets.so.
Если ее нет, значить нужно пересобрать php-extensions с поддержкой сокетов.
Для этого удалим текущий extensions и поставим заново.
Посмотрим какой у нас php и extensions
TESTBSD# pkg_info | grep extensions
php5-extensions-1.5 A "meta-port" to install PHP extensions
Идем в порты и ищем:
TESTBSD# cd /usr/ports/lang
TESTBSD# ls | grep php
php-mode.el
php4
php4-extensions
php4-overload
php5
php5-extensions
php52
php52-extensions
php_doc
вот он php5-extensions, удаляем
TESTBSD# cd php5-extensions
TESTBSD# make deinstall
...
удалили, теперь конфигурим и инсталим
TESTBSD# make config
Отмечаем [X] SOCKETS sockets support
и устанавливаем php5-extensions
TESTBSD# make install clean
рестартим apache
TESTBSD# apachectl restart
Все, поддержка сокетов в php - включена. Переходим к php скрипту.
Напишем php скрипт который будет соединяться с smtp почтового сервера, логиниться под своим логином, паролем и отправлять письмо на test@test.ru:
Скрипт отправки почты через php sockets и smtp
А точнее файл mailsock.php подключаемый через inclue();
Не скажу что этот скрипт полностью моих рук дело, так как за основу был взят скрипт отправки писем через сокеты с сайта
i-novice.net. Спасибо автору скрипта за метод.
Я лишь немного расширил функционал, переделал обработку ошибок, добавил поддержку кодировок, и русскоязычных символов в полях subject и from.
Вот сам скрипт, в архиве также пример: index.php
mailsock.zip - Скрипт mailsock.php для отправки электронной почты из php через сторонний smtp сервер (mail,yandex). Не использует функцию mail(). Подключается как модуль include('mailsock.php');
Использование:
Создаем php скрипт или дописываем уже в имеющийся такой код:
include('mailsock.php');
$ms_email= 'mymail@server.com';
$ms_address= 'smtp.server.com';
$ms_port= 25;
$ms_login= 'mymail';
$ms_pwd = '123';
$ms_codepage= 'windows-1251';
if (mail_socket('test@test.ru','test@test.ru','тема','сообщение'))
echo "сообщение успешно отправлено";
else echo "Сообщение не отправлено";
?>
Перменные $ms_... являются глобальными, их можно указывать как в config.php вашего сайта, в текущем скрипте, или самом mailsock.php. В них настраивается ваш ящик с которого будет уходить почта. Т.е. скрипт будет конектиться на 25 порт указанного smtp сервера, авторизовываться и отправлять почту.
Если почта ушла успешно, то функция mail_socket() возвратит true, в противном случае false и выведит ошибки.
Синтаксис функции:
mail_socket('e-mail получателя','e-mail для ответа','тема','текст письма')