Документация по ОС FreeBSD Четверг, 25.04.2024, 10:25
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Mail

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 для ответа','тема','текст письма')

Удачи.


Источник: http://zgbox.ru/articles/freebsd/freebsd-p-php-otpravka-pochty-bez-mail-i-sendmail
Категория: Mail | Добавил: oleg (22.07.2012) | Автор: zgbox
Просмотров: 2272 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links
порно — это единственная отрасль бизнеса.

Copyright MyCorp © 2024