Навигация |
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-pay![]() |
Последние записи |
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет |
Каменты [еще] |
Теги |
Друзья |
Freebsd + php отправка почты без mail() и sendmail
Марта
2012 года
26
2012 года
Теги: freebsd, web, php, скрипты, Раздел: zgbox.ru ![]() ![]() ![]() |
Просмотров: 13559 |
С 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
Если ее нет, значить нужно пересобрать 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
TESTBSD# cd php5-extensions
TESTBSD# make deinstall
...
TESTBSD# make config

и устанавливаем php5-extensions
TESTBSD# make install clean
TESTBSD# apachectl restart
Напишем php скрипт который будет соединяться с smtp почтового сервера, логиниться под своим логином, паролем и отправлять письмо на test@test.ru:
Скрипт отправки почты через сокеты (php sockets) и smtp
А точнее файл mailsock.php подключаемый через inclue();
Не скажу что этот скрипт полностью моих рук дело, так как за основу был взят скрипт отправки писем через сокеты с сайта
i-novice.net. Спасибо автору скрипта за метод.
Я лишь немного расширил функционал, переделал обработку ошибок, добавил поддержку кодировок, и русскоязычных символов в полях subject и from.
Вот сам скрипт, в архиве также пример: index.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 для ответа','тема','текст письма')
Удачи.
Комментарии к записи:
a_serg | 2012-05-28 03:27:47 [ответить] |
Великолепно работает! Спасибо! |
александр | 2012-06-17 02:51:26 [ответить] | ||||
не работает mail_socket() Error: ERROR: 535 Incorrect authentication data 550 Access denied - Invalid HELO name (See RFC2821 4.1.1.1) Сообщение не отправлено
|
Vladus | 2012-06-19 17:09:05 [ответить] |
вот он php5-extensions, удаляем TESTBSD# cd php5-extensions TESTBSD# make deinstall А разве нельзя без удаления? Просто make config, а затем make install ? |
юра | 2016-05-17 09:56:26 [ответить] |
нечекюго |