Отправка сообщений в новостные группы Usenet

Задача
Необходимо отправить сообщение в новостную группу Usenet, например в comp.lang.php.

Решение
С помощью функции imap_mail_compose() отформатируйте сообщение, а затем передайте сообщение на сервер с помощью сокетов:

$headers['from'] = 'adam@example.com';
$headers['subject'] = 'New Version of PHP Released!';
$headers['custom_headers'][] = 'Newsgroups: comp.lang.php';
$body[0]['type'] = TYPETEXT;
$body[0]['subtype'] = 'plain';
$body[0]['contents.data'] = 'Go to http://www.php.net and download it
today!';
$post = imap_mail_compose($headers, $body);
$server = 'nntp.example.com';
$port = 119;
$sh = fsockopen($server, $port) or die ("Can't connect to $server.");
fputs($sh, "POST\r\n");
fputs($sh, $post);
fputs($sh, ".\r\n");
fclose($sh);

Обсуждение
В PHP нет встроенной функции, которая может послать сообщение в новостную группу. Поэтому надо открыть прямое сокет-соединение с сервером новостей и послать команды для отправки сообщения. Однако для форматирования почтового отправления и создания заголовков и тела сообщения можно вызвать функцию imap_mail_compose().


Каждое сообщение должно иметь три заголовка:

адрес отправителя From:,

тема сообщения Subject: и имя новостной группы:

$headers['from'] = 'adam@example.com';
$headers['subject'] = 'New Version of PHP Released!';
$headers['custom_headers'][] = 'Newsgroups: comp.lang.php';

Создайте массив $headers для хранения заголовков сообщения. Можно прямо присвоить значения заголовкам From: и Subject:, но этого нельзя сделать для заголовка Newsgroups:. Поскольку чаще всего функция imap_mail_compose() применяется для создания сообщений электронной почты, то заголовок Newsgroups: не относится к числу предопределенных. Чтобы обойти это, необходимо добавить его в массив custom_headers в качестве элемента.
В массиве custom_headers применяется иной синтаксис. Имя заголовка (в нижнем регистре) не выступает в качестве имени элемента, а содержимое заголовка не сохраняется в массиве как значение, вместо этого весь заголовок целиком записывается в массив в качестве значения.

Между именем заголовка и его значением надо поставить двоеточие, а затем пробел. Убедитесь в правильности написания Newsgroups: с прописной буквы N, а заканчивается слово буквой s.

Тело сообщения может состоять из нескольких частей.


В результате параметр тела, переданный функции imap_mail_compose(), представляет собой массив массивов. В разделе «Решение» была только одна часть, поэтому мы присваиваем значения непосредственно элементу $body[0]:

$body[0]['type'] = TYPETEXT;
$body[0]['subtype'] = 'plain';
$body[0]['contents.data'] = 'Go to http://www.php.net and download it
today!';

Каждая часть должна иметь MIME-тип и подтип. Данное сообщение написано в кодировке ASCII, поэтому оно имеет тип TYPETEXT и подтип plain. Обратимся снова к табл. 17.1 из рецепта 17.3 за списком констант IMAP MIME-типов и тем, что они представляют. Поле contents. data содержит тело сообщения.

Для преобразования этих массивов в форматированную строку вызовите функцию imap_mail_compose($body, $headers). Она возвращает почтовое сообщение, которое выглядит так:

From: adam@example.com
Subject: New Version of PHP Released!
MIME-Version: 1.0
Content-Type: TEXT/plain; CHARSET=US-ASCII
Newsgroups: comp.lang.php
Go to http://www.php.net and download it today!

Вооружившись почтовым сообщением для сервера новостей, вызовем функцию fsockopen(), чтобы создать соединение:

$server = 'nntp.example.com';
$port = 119;
$sh = fsockopen($server, $port) or die ("Can't connect to $server.");

Первый параметр функции fsockopen() – это имя хоста, на котором запущен сервер, а второй параметр представляет используемый порт.

Если имя сервера новостей неизвестно, попробуйте имена хостов news, nntp или news-server в вашем домене: например news.example.com,nntp.


example.com или news-server.example.com. Если ни одно их них неподходит, то обратитесь к системному администратору. По традиции все серверы новостей работают на порту 119. Соединившись с сервером, вы посылаете сообщение:

fputs($sh, "POST\r\n");
fputs($sh, imap_mail_compose($headers, $body));
fputs($sh, ".\r\n");

Первая строка говорит серверу, что вы хотите отправить почтовое сообщение. Вторая строка представляет собственно сообщение. Чтобы обозначить конец сообщения, добавьте строку из одиночного символа точки. В конце каждой строки должны находиться символы возвратакаретки и новой строки. Закройте соединение с помощью вызова fclose($sh).

Каждому сообщению на сервере присваивается уникальное имя, известное как Message-ID. Для того чтобы ответить на сообщение, возьмите идентификатор Message-ID исходного сообщения и используйте его в качестве значения заголовка References:

// получено при чтении исходного сообщения
$message_id = '<20030410020818.33915.php@news.example.com>';
$headers['custom_headers'][] = "References: $message_id";

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Отправка почты
Отправка почты в кодировке MIME
Поиск адресов с помощью LDAP
Поиск в DNS
Получение и размещение файлов с помощью FTP

Вернуться в раздел: PHP / 17. Интернет-службы