rss
Навигация
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-payrss
Последние записи
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет
Каменты [еще]
2017-05-17 11:25:31 [articles] Владимир:
2016-12-20 17:49:41 [articles] Виталик:
2016-12-01 23:34:25 [news] Meteor:
2016-11-11 03:35:47 [articles] Tata10:
2016-07-27 14:28:19 [articles] Сергей:
2016-05-17 09:56:26 [articles] юра:
2016-04-29 18:03:48 [articles] agatsky.dn:
Теги
Друзья
Блог малова Лучшие стихи зая =) Мед в Красноярске Daniil V. Savenkoff Blog | То, что мне когда-то пригодилось... Велкам в друзья!

Freebsd + php отправка почты без mail() и sendmail

Марта
2012 года
26
Теги: freebsd, web, php, скрипты,
Раздел: zgbox.ru -> Статьи -> FreeBSD -> Freebsd + php отправка почты без mail() и sendmail
Просмотров: 13559
В статье описано как можно отправлять электронную почту средствами php под freebsd и другими ОС без использования функции mail() использующей sendmail.
С FreeBSD статья связана только подготовкой php-extensions для использования сокетов.

image


Вступление


Понадобилось мне однажды отправлять электронную почту из скриптов 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

image

и устанавливаем 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'); Размещен
размер 0.00 mb 2012-03-27 11:30:42
Скачан 494

Использование:

Создаем 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) Сообщение не отправлено
=ZG= IP:172.29.65.227 2012-06-17 09:49:09 [ответить]
похоже на неверно указанный логин. Какой почтовик?
на яндексе и майле проверял - все было ок.
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 [ответить]
нечекюго

Добавление комментария

Ваше имя: (Антиспам) Какой сейчас год?
Ваш комментариий: