Информационные технологииStfw.Ru 🔍

IMAP, РОРЗ и NNTP

Файлы и сети
🕛 01.11.2006, 13:31
Для того чтобы использовать следующие функции, необходимо перекомпилировать РНР с параметром -with-imap (для этого клиентские библиотеки С должны быть установлены). Последнюю версию для компиляции можно загрузить с ftp://ttp.cac.washington.edu/imap/. Можно также подключить модуль динамически.

Несмотря на имя модуля, имеющиеся в нем функции позволяют выполнять также много других полезных операций, выходящих за рамки простого использования протокола IMAP. Лежащая в основе библиотека С-клиента также поддерживает NNTP, РОРЗ и методы доступа к локальным почтовым ящикам.

Чтобы разобраться в том, что позволяют делать функции, полезно ознакомиться (. перечисленными ниже документами RFC.

RFC821: Simple Mail Transfer Protocol (SMTP).
RFC822: Стандарт текстовых сообщений Интернет ARPA.
RFC2060: Internet Message Access Protocol (IMAP) Version 4 revl.
RFC1939: Post Office Protocol Vei.sion 3 (РОРЗ).
RFC977: Network News Transfer Protocol (NNTP).
RFC2076: Common Internet Message Headers.
RFC2045, RFC2046, RFC2047, RFC2048 и RFC2049: Multipurpose Internet Mail Extensions (MIME).
Детальное рассмотрение функционирования систем работы с электронной почтой можно найти в книгах: «Programming Internet Email» (David Wood) и «Managing IMAP» (Dianna Mullet и Kevin Mullet).

Далее под ящиками подразумеваются как папки верхнего уровня, так и вложенные.

imap_open

Подключение к серверу (открытие почтового ящика)

int imap_open (string mailbox, string username, string password [, int flags])

Возвращает дескриптор открытого почтового ящика IMAP (дескриптор подключения к серверу IMAP) или значение FALSE при ошибке. Эту функцию можно также использовать для подключения к серверам РОРЗ и NNTP, но некоторые функции будут недоступны.

В аргументе mailbox указывается имя сервера и путь к почтовому ящику. Имя сервера заключается в фигурные скобки «{» и «}», и состоит из: имени сервера (или его IP-адреса), возможного указания протокола (начинающегося со слеша '/') и необязательного значения номера порта подключения (начинающегося с двоеточия «:»). Имя сервера необходимо указывать всегда; бывает полезно указывать имя сервера в переменной, но следует учитывать, что фигурные скобки имеют специальное значение для переменных в строках в двойных кавычках, поэтому открывающую скобку следует предварять слешем, например: "\{$SERVER/pop3:110}INBOX".

Специальное значение - имя INBOX, обозначающее основной ящик пользователя (папка Входящие). Если имя ящика включает какие-либо символы помимо английских печатных ASCII, то их нужно закодировать функцией imap_utf7_encode(). Разделителем иерархии почтовых ящиков обычно является слеш, но для некоторых серверов им также может быть точка, например: «INBOX. Current. Important. Work».

Аргументами username и password указываются имя и пароль пользователя.

В аргументе flags указываются параметры открытия в виде битовой маски):

OP_READONLY - открыть только для чтения;
OP_ANONYMOUS - не использовать (обновлять) разделы новостей .newsrc (только для NNTP);
OP_HALFOPEN - для IMAP- и NNTP-имен: только подключение без открытия ящика;
CL_EXPUNGE - автоматически удалить ящик при его закрытии.
(См. также: imap_delete() и imap_expunge()).

Для подключения к серверу ШАР, использующему порт 143 на локальной машине, используйте:

$mbox = imap_open ("{localhost:143}INBOX".
"user_id". "password");

Для подключения к серверу РОРЗ, использующему порт 110 на локальной машине, используйте:

$mbox = imap_open
("{localhost/pop3:110}INBOX". "user_id".
"password").

Для подключения к серверу NNTP, использующему порт 119 на локальной машине, используйте:

$nntp = imap_open ("{localhost/nntp:119}
comp test". "". "");

Следующий пример демонстрирует подключение к серверу ШАР «your.imap.host» и вывод имеющихся ящиков и сообщений для пользователя «username».

$mbox = imap_open ("{your imap.host:143}",
"username". "password").
echo "<р><h1>Ящики Mailboxes</hl>\n".
Sfolders = imap_ilstmailbox (Smbox.
"{your.imap.host:143}". "*"):
if (Sfolders == FALSE) echo
"Ошибка- ящиков не обнаружено
<br>\n": else while (list ($key. Sval)
= each (Sfolders)) echo "\t Sval <br>\n".
echo "<р><h1>Сообщения в INBOX</hl>\n"
. Sheaders = imapjieaders (Smbox);
if (Sheaders == FALSE) { echo
"Ошибка - сообщений нет <br>\n";
} else while (list (Skey.Sval) =
each (Sheaders)) echo "\t Sval <br>\n";
imap_close(Smbox):

В общем случае должно быть выведено нечто вроде следующего:

Ящики Mailboxes
{localhost:143} l innn/i gf<br>
{loca lhost;143} linnn<br>
{local host:143}INBOX<br>
Сообщения в INBOX
ШЗ-Мау-2001 Имя Отправителя
Заголовок (1621 chars)<br>

imap_reopen

Переподключение (выбор другого ящика)

int imap_reopen (int imap_stream, string mailbox [, string flags])

Функция подобна imap_open() с тем отличием, что она не создает новый дескриптор подключения, а использует уже существующий imap_ stream (имя пользователя и его пароль не изменяются). Аргументы mailbox и flags аналогичны.

Возвращает TRUE или FALSE - при ошибке.

imap_close

Отключение от сервера

int imap_close (int imap_stream [, int flags])

Функция закрывает поток подключения, связанный с дескриптором imap_stream. Если в аргументе flags указывается значение CL_EXPUNGE, то при закрытии ящика из него автоматически удаляются все сообщения, помеченные к удалению.

imap_ping

Проверка активности подключения

int imap_ping (int imap_stream)

Возвращает TRUE, если подключение действительно, или FALSE, если оно разорвано.

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

imap_listmailbox

Получение списка почтовых ящиков

array imapjistmailbox (int imap_stream, string ref, string pattern)

Возвращает массив имен почтовых ящиков. Описание аргументов см. в imap_getmailboxes().

$mbox = imap_open("{your imap host}".
"username"."password",OP_HALFOPEN)
dieC'can't connect- ".tmap_last_error()):
Slist " imap_listmailbox($mbox,
"{your.imap host}"."*"):
ifOs_array($list)) { reset ($"hst):
while (list($key. $val) = each(Slist))
print imap_utf7_decode($val).
"<br>\n". } else
print "imap_listmailbox failed "
imap_last_error(). "\n".
imap_close($mbox):

imap_getmailboxes

Получение описания почтовых ящиков

array imap_getmail boxes (int imap_stream, string ref, string pattern)

Возвращает массив объектов, содержащих описания каждого ящика. Каждый объект имеет 3 атрибута: полное имя ящика папе, символ-разделитель иерархии ящиков delimiter и битовое поле attributes, которое может состоять из следующих компонентов:

LATT_NOINFERIORS (1) - ящик не имеет вложенных;
LATT_NOSELECT (2) - ото контейнер (а не ящик) и его нельзя открыть;
LATT_MARKED (4) - ящик маркирован. Используется только с UW-IMAPD;
LATTJJNMARKED (8) - ящик маркирован. Используется только с UW-IMAPD.
Имена ящиков могут содержать символы национальных алфавитов (из набора ASCII), которые могут быть закодированы и затем декодированы функцией imap_utf7jJecode().

Аргумент ref должен содержать обычную спецификацию сервера (его адреса), как в функции imap_open(), а аргумент pattern - указывать, с какого ящика начинать и шаблон для возвращаемых ящиков.

В аргументе pattern могут быть указаны два специальных значения: «*» означает, что следует возвращать всю иерархию ящиков, а <<%>> -только текущий иерархический уровень (без вложенных ящиков).

$mbox = imap_open("{your шар.host}",
"user-name", "password".OP_HALFOPEN)
|| dieC'can't connect: ".imap_last_error()).
$list = imap_getmailboxes($mbox.
"{your.imap.host}"."*"):
ifds_array($list))
{ pnnt_r (Slist): } else
print "imap_getmailboxes failed
".imap_last_error()."\n":
imap_close($mbox).

См. также imap_getsubscribed().

imap_createmailbox

Создание почтового ящика

int imap_createmailbox (int imap_stream, string mbox)

Имя создаваемого ящика указывается в аргументе mbox. Имена, содержащие национальные символы, должны кодироваться функцией imap_utf() encode().

Возвращает TRUE или FALSE - при ошибке.

См гакжс: imapj-enamemailbox(), imap_deletemanbox() и imapj>pen().

$mbox = imap_openf"(your imap.host}"
."username"."password",OP_HALFOPEN)
|| chet"can't connect. "
.imap_last_error()).
$namei = "newhox:
$name2 = imap_utf7_encode
("MOй личный ящик");
if(&imap_createmai1box(Smbox.
1map_utt7_encode("{your.imap.host}
INBOX/$namer))) { Sstatus =
@imap_status($mbox."{your.imap
host}:NBOX/$naoiel".SA_ALL);
if($btat'js) { echo "Статус нового
ящика 'Snamel': <br\n".
"Messages: ". $status->messages
."<br>\n". "Recent: ". $status->
recent "<br-\n". "Unseen:
". $status->unseen "<br>\n".
"UIDnext ". $status->uidne/.t .
"<Dr>»n". "UIDvalnaity ".
Sstatus->uldval1d1ty.".<br>\n"; if
(imap_renamemailbox($mbox "{your,
irnao host)INBOX/Snamel".
"{your.-imap host}lNBOX/$name2'l)
{ echo "Ящик Sramel' переименован
в '$raine2'<br>\n": } else {
print "imap_renamemailbox failed:
" imap_last_error() "<br>\n": i
} else { pnnt "i:nap_s"'atus tailed.
" inap_labt_error() "<br>'n"-}
if(?imap_deletemailbox(Smbox.
"{your imap.host}INBOX/$naire2")i
{ print "new mailbox removed <br>\n":
} else { print "lmap_deletemailbox
failed: ". implode("<br>\n".
lroap_errors()3 "<br>\n", i }
ebe { print "could not
create new mailbox- ".
implodeC"<br>\n".imap_errors()).
"<br>\n":
imap_clcse($iTibox);

imap_ renamemailbox

Переименование ящика

int imap_renamemailbox (int imap_stream, string oldjnbox, string new_rabox)

Имя ящика задается аргументом oldjnbox, а его новое имя - new_ mbox Формат этих аргументов см. в описании функции imap_open(). Пример использования см. в функции imap_createmailbox().

Возвращает TRUE или FALSE - при ошибке.

См. также: imap_createmailbox(), imap_deletemailbox(), imap_open().

imap_ deletemaiibox

Удаление почтового ящика

int imap_deletemailbox (int imap_stream, string mbox)

Имя ящика задается аргументом mbox, его формат см. в описании функции imap_open(). Пример использования см. в функции imap_ createmailbox().

Возвращает TRUE или FALSE - при ошибке.

См. также: imap_createmai1box(), imap_renamemailbox() и imap_open().

imap_ check

Проверка текущего ящика

object imap_check (int imap_stream)

Возвращает объект, содержащий информацию о текущем почтовом ящике, или FALSE при ошибке. В объекте имеются следующие свойства:

Date - время последней модификации содержимого ящика (доступа);
Driver - протокол доступа к ящику: POPS, IMAP, NNTP;
Mailbox - полное имя почтового ящика;
Nmsgs - число сообщений в ящике;
Recent - число новых сообщений в ящике.
$mbox - imap_open('{localhost}°."igor"."lgx324879".
OP_HALFOPEN) || dle("can't connect:
".imap_last_error()):
pnnt_r(imap_check ($mbox));
imap_close($mbo/).

Выводит нечто подобное следующему:

$tdClass Object
[Date] => Sun. 13 May 2008
14-31:38 +0400 (Московское время
(лето))
[Driver] -> imap
[Mailbox] => {igor 143/imap/user="igor"}
<no_mailbox>
[Nmsgs] => 0
[Recent] 0

imap_status

Получение статуса указанного ящика

object imap_status (int imap_stream, string mailbox, int options)

Возвращает объект, содержащий информацию о почтовом ящике с именем mailbox, пли FALSE при ошибке. В объекте возвращаются свойства, в зависимости от указанного значения аргумента options:

SA_MESSAGES - возвратить в status ->messages общее число сообщений в ящике;
SA_RECENT - возвратить в status->recent число новых сообщений;
SAJJNSEEN - возвратить в status->unseen число непрочитанных сообщений;
SAJJIDNEXT - возвратить в status->uidnext номер uid для следующего нового сообщения;
SAJJIDVALIDITY - возвратить в status->uidvalidity константу действительности uid ящика;
SA_ALL - возвратить все вышеперечисленное.
Объект также содержит свойство status-^flags, отражающее (в объединенном битовом поле), с какими параметрами он создан.

$mbox = шар_ореп("{your.imap host}".
"ucename"."password".OP HALFOPEN)
|| dieC'can't connect: " nmap_last_error!));
$status = imap_status(Smbox."{your
imap host}INBOX".SA_ALL).
if($status) { print_r($status); }
else print "imap_status failed "
imap_lasterror()."\n":
imap_clcse($mbox)

imap_ mailboxmsginfo

Получение информации о текущем ящике

object imapjnailboxmsginfo (int imap_stream)

функция сходна с imap_status(), но дополнительно она вычисляет 0С,-рем всех сообщений, находящихся в ящике. Свойства возвращаемого объекта:

Date - время последней модификации;
Driver - драйвер (протокол доступа);
Mailbox - имя почтового ящика;
Nmsgs - число сообщений;
Recent - число новых полученных сообщений;
Unread - число непрочитанных сообщений;
Deleted - число удаленных сообщений;
Size - размер почтового ящика.
<?рhp
$mbox = imap_open
("{your imap.host}INBOX".
"user-name",
"password") || diet"can't connect:
".imap_last_error()):
rebeck = imapinallboxmsginfo
($fnbox);
lf($6heck) {
print "Date; " . $check->Date .
"<br^\n" print "Driver:
" . $check->Driver ."<br>\n"
print "Mailbox: "
. $check->Mailbox ."<br>\n" :
print "Messages- "
. $check->Nmsgs ."<br>\n"
print "Recent: " .
$check->Recent ."<br>\n"
print "Unread: " . $check->Unread
"<br>\n" print "Deleted: "
. $check->Deleted ,"<br>\n" :
print "Size: " $check->Size ."<br>\n"
} ele ( print "imap_check()
failed- ".imap_last_error().
"<br>\n": } linap^close
($mbox). >

imap_num_msg

Получение числа сообщений в текущем ящике - nt imap_num_msg (int imap_stream)

imap_num_recent

Получение числа новых сообщений в текущем ящике

int imap_num_recent (nnt imap_stream)

imap_listsubscribed

Получение списка активных ящиков

array imap_listsubscribed (Int imap_stream, string ref, string pattern)

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

Функция возвращает в массиве перечисление имен папок, выбранных для синхронизации. Она аналогична функции iraap_listmailbox().

imap_getsubscribed

Получение описания активных ящиков

array imap_getsubscribed (int imap_stream, string ref, string pattern)

Функция подобна imap_getmai"lboxes(), но она возвращает только имена тех ящиков, которые были выбраны для синхронизации.

imap_ subscribe

Активизация ящика

int imap_subscribe (int imap_stream, string mbox)

В дальнейшем ящик будет использоваться для синхронизации. Возвращает TRUE иди FALSE - при ошибке.

imap_ unsubscribe

Дезактивизация ящика

int imap_unsubscribe (int imap_stream, string mbox)

imap_ search

Поиск в текущем ящике

array imap_search (int imap_stream, string criteria, int flags)

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

ALL- все соoбщения, содержащие перечисленные слова;
ANSWERED - только сообщения, на которые был выслан ответ;
ВСС "string" - «екать "string" в поле Вcс;
Before "date - сообщения, датированные ранее "date";
Body "string" - сообщения, содержащие в своем теле "string";
СС "string" - искать "string" в поле Сс;
Deleted - удаленные сообщения;
Flagged - сообщения со статусом «Важное»;
FROM "string " - искать "string" в поле From;
KEYWORD "strinп" - искать сообщения, содержащие слово "string";
NEW - просматРивать только новые сообщения;
Old - проСматривать только старые сообщения;
On date - просматривать сообщения, датированные "date";
RFCFNT - просматривать свежие сообщения (с флагом \\RECENT); ссси „посматривать прочитанные сообщения ;
Since "date" - просматривать сообщения, датированные позже "date";
Subject "string" - искать "string" в поле темы Subject:;
TFXT "string" - искать сообщения, содержащие текст "string";
To string - искать сообщения, содержащие "string" в поле адреса;
UNANSWERED - пРoсматРивать сообщения, на которые не был написан ответ;
UNDFI FTED - просматривать неудаленные сообщения;
UNFI АГ6ЕО - пРосматРивать сообщения без флагов;
UNKEYWORD "sttring" - искать сообщения, не содержащие слово "string";
UNSEEN - просматривать непросмотренные сообщения.
Например, чтобы найти все сообщения от отправителя Peter, на которые не был выслан ответ, указывается: UNANSWERED FROM Peter.

imap_scanmailbox

Поиск текста в сообщениях

array imap_scanmailbox (int imap_stream, string ref,

string pattern, string content)

функция подобна imapJistmailbox(), но она возвращает имена только тех ящиков, которые содержат в себе строку content.

imap_fetch_overview

Получение описания сообщений

array imap_fetch_overview (int imap_stream, string sequence [, int flags])

Возвращает в массиве объекты, содержащие информацию о сообщениях, номера которых перечислены в строке sequence. Эта строка должна содержать номер или номера через запятую без пробелов; можно указать диапазон разделителем «двоеточие» (:). Если в значении аргумента указана константа FTJJID, это указывает на то, что номера являются уникальными идентификаторами UID.

Каждый объект массива может иметь следующие свойства:

subject - тема сообщения;
from - отправитель;
date - дата отправки;
message_id - Message-ID;
references - ссылки на message_id;
size - размер в байтах;
uid - уникальный идентификатор сообщения UID в ящике;
msgno - порядковый номер сообщения в ящике;
recent - присутствие флага «новое»;
flagged - присутствие флага «важное»;
answered - присутствие флага «ответ написан»;
deleted - пометка сообщения к удалению;
seen - прочитанное сообщение;
draft - присутствие флага «черновик».
Smbox = imap_open("{your л map host:143}".
"username","password") cheC'can't connect:
" .imap_last_error()):
$overview = imap_fetch_overview($mbox."2,4 6",0).
if(is_array($overview)) { pnnt_r($overview): }
imap close($mbox):

Выводится информация следующего вида:

Array
[0] => stdClass Objecl
[subject] -> ПроРавление
[from] => IG <ig<^or>
[date] > Sun 10 May 2001
01-41^°0 +»400 [message_id] ->
^(100801c0db2c$3c46a2cO
$0100007f(aigor>
[S1ze] => 1621
[uid] -> 2897036J
[msgno] => 1
[recent] => 0
[flagged] => 0
[answered] ==> 0
[deleted] => 0
[seen] => 1
[draft] -> 0
)

imap_ headers

Получение списка сообщений текУЩего ящика

array iroapjieaders (int imap_Streara)

Возвращает массив, соДержащий заголовки имеющихся сообщений. Сообщения вложенных папок не просматриваются.

См. пример в функции imap_open().

imap_header

Синоним функции imap_headerinfo

object imapjieader (int stream, int msgjiumber , int fromlength subjectlength , string defaulthost]]])

imap_headerinfo

Просмотр заголовка сообщенИя

object imap headerinfo (imap_stream, int msg_number)

int fromlength [, int Subjectlength [. string defaulthost]]])

Возвращает объект, содержащии различные элементы информации о сообщении.

$mbox = imap_open
'\{$SERVEf/p°P3- HOJINBOX". "lgor7".
Г1дх32Г);
pnnt_r(imap_header($mbox.l)'

Будет выведено примери" следующее:

stdClass Object (
[date] => Sun. 13 May
2005 01:41:00 +0400 [Date] >
Sun. 13 May 2005 01-41:00 +0400 [subject]
=> Послание [Subject] => Послание
[messagejd] =>
<000801cOdb2c$3c46a2c
O$0100007f@igor> [toaddress] ->
igor@loca]host [to] => Array (
[0] => swClass Object (
[mailbox] -> igor [host] =>
local host ) ) [fromaddress] =>
IG <ig@igor.^ [from] => Array (
[0] -> stddass Object (
[personal] => IG [mailbox] => ig [host] =>
Igor. ) )
[reply_toaddress] =>
IG <тд1?тдог.> [reply_to] => Array (
[0] -> stddass Object (
[personal] => IG [mailbox] =>
ig [host] => igor. )
[senderaddress] ->
IG <ig(?igor.> [sender] -> Array (
[0] -> stddass Ob.iect i
[personal] => IG
[mailbox] => ig [hnbt] -> igor ) )
[Recent] > N [Unseen] =>
[Flagged] => [Answered] =>
[Deleted] => [Draft] => [Msgno] => 1
[MailDate] =>
13 May-2005 01:41:00
+0400 [Size] => 1581 [udate] =>
9S9703660 )

В объекте, как вы можете видеть, возвращаются следующие значения:

Идентификационная информация: date, Date, subject, Subject, message^ I id, Msgno, Mai IDate, Size, udate.
Адресная информация: toaddre^s, to (mailbox, host), fromaddress, from (personal, mailbox, host), replyjtoaddress, reply_to (personal, mailbox, host), senderaddress, sender (personal, mailbox, host).
Значения флагов: Recent. Unseen, Flagged, Answered, Deleted, Draft.
Структура и формат записей определяются реализацией серверного интерфейса и могут сильно различаться для разных систем (единственный способ выяснить это - проверить на практике). В большинстве случаев для сообщений протоколов ШАР, РОРЗ и NNTP форматы информационных полей идентичны.

Для news-сообщений дополнительно возвращается свойство newsgroup.

Пары полей date, Date и subject, Subject обычно совпадают. В message_ id хранится уникальный хеш сообщения (идентификатор UID), а в Msgno - относительный порядковый. В записях Size и udate возвращается соответственно размер сообщения в байтах и время в формате UNIX Timestamp.

Адресная информация возвращается как в целостном, так и разделенном па составляющие виде. В большинстве случаев адреса fromaddress, reply_toaddress и senderaddress совпадают. Если у сообщения имеется поле Сс: (отправить копии вторичным получателям), то также возвращается адрес ccaddress.

Флат сообщения соответственно обозначают: только что пришедшее сообщение, непрочитанное сообщение, помеченное как «Важное», сообщение на которое был написан ответ, сообщение, маркированное к удалению, и черновик сообщения.

Три дополнительных аргумента используются редко.

imap_sort

Сортировка заголовков

array imap_sort (int stream, int criteria, int reverse, int options) Возвращает массив номеров сообщений, сортированных по критерию.

Если в аргументе reverse указывается значение, то происходит обратная сортировка.

В аргументе criteria можно указывать одно из следующих значений:

SORTDATE - по дате сообщения;
SORTARRIVAL - по дате получения;
SORTFROM - по первому адресу в поле From;
SORTSUBJECT - по строке темы в поле Subject:;
SORTTO - по первому адресу в поле То;
SORTCC - по первому адресу в поле получателей копии Сс;
SORTSIZE - но размеру сообщения в октетах.
Флаги options аргумента могут (побитово) включать следующие значения:

SEJJID - возвращать уникальный идентификатор сообщения UID вместо сто порядкового номера;
SE NOPREFETCH - не выполнять с сообщением предварительные манипуляции.
imap_fetchstructure

Получение полной информации о сообщении

object. imap_fetchstructure (int iraap_streara, int msgjiumber [, int flags])

Информация возвращается в объекте, она описывает формат и структуру сообщения в текущем ящике, указанном порядковым номером msgjiumber. Если в аргументе flags указывается значение FTJJID. это свидетельствует о том, что в аргументе msgjiumber указан не номер сообщения, а его идентификатор UID.

В объекте присутствуют следующие объекты (его структура сильно варьируется):

type - тип основного тела сообщения;
encoding - кодировка тела сообщения;
if subtype - True, если имеется вложенный тип;
subtype - вложенный тин MIME;
ifdescription - True, если имеется строка описания;
description - строка описания;
if id - True, если имеется строка идентификации;
id - строка идентификации;
lines - размер в строках;
bytes - размер в байтах;
ifdisposition - True, если имеется строка размещения;
disposition - строка размещения;
ifdparameters - True, если имеется массив dparameters;
dparameters - массив d-параметров (объектов, где каждый вложен-I ный объект состоит из пар «атрибут», «значение»);
ifparameters - True, если существует массив параметров;
parameters - массив параметров MIME (объектов, где каждый вложенный объект состоит из пар «атрибут*, «значение»);
parts - массив объектов, описывающий каждую часть сообщения (аналогичен по структуре объекту верхнего уровня, но не может иметь вложенные части).
Тип type основного тела может определяться следующими значениями:

0 - простой текст;
1 - составное сообщение (multipart);
2 - простое сообщение;
3 - приложение;
4 - аудио;
5 - картинка;
6 - видео;
7 - другое.
Типы кодировки encoding:

0 - 7BIT;
1 - 8BIT;
2 - BINARY;
3 - BASE64;
4 - QUOTED-PRINTABLE;
5 - OTHER.
Для простого сообщения возвращает объект такого вида:

stdClass Object
[ifsubtype] => 1
[subtype] => PLAIN [ifdescnption]
=> 0 [ifid] => 0 [lines] => 2 [bytes] =>
41 [ifdisposition] => 0 [ifdparameters]
=> 0 [ifparameters] => 0 [parameters]
=> stdClass Object '>

Для сложного сообщения1 возвращает объект следующего вида:

stdClass Object
[type] => 1 [ifsubtype] => 1
[subtype]
=> ALTERNATIVE [ifdescription] =>
0 [ifid] => 0 [Ifdisposition] =>
0 [ifdparameters] => 0
[ifparameters] =>
1 [parameters] => Array (
[0] => stdClass Object (
[attribute] => boundary
[value] => -=_NextPart_000_0005_
01CODB4D.C33837AO
[parts] => Array ( [0] => stdClass
Object ( [encoding] => 4
[ifsubtype] => 1 [subtype] =>
PLAIN
[ifdescription] => 0 [ifid] => 0
[lines] => 5 [bytes] => 59
[ifdisposition] => 0
[ifdparameters] =>
0 [ifparameters] =>
1 [parameters] => Array (
[0] => stddass Object \ (
} [attribute] => charset
[value] => koi8-r )
[1] "> stddass Object
[encoding] => 4 [ifsubtype] =>
1 [subtype] => HTML [ifdescription]
=> 0 [ifid] => 0 [lines] => 14
[bytes] => 547 [ifdisposition] =>
0 [ifdparameters] =>
0 [ifparameters] =>
1 [parameters] => Array (
[0] => stddass Object (
[attribute] => charset [value] =>
koi8-r ) ) ) ) )

imap_fetchheader

Получение заголовка сообщения

string imap_fetchheader (int imap_stream, int msgno, int flags)

Возиращается полный, нефильтрованный заголовок (формата RFC822) сообщения с номером msgno в текущем ящике.

В аргументе flags могут быть указаны следующие значения (их можно бинарно комбинировать):

FTJJID - в аргументе msgno указан уникальный идентификатор UID;
FT_INTERNAL - возвращать текст как есть, а не в формате CRLF1;
FT_PREFETCHTEXT - (RFC822) одновременно получается текст сообщения, что сокращает общую длительность (RTT) подключений ШАР (полученный текст сохраняется в локальном буфере на время подключения).
imap_body

Получение сообщения

string imap_body (int imap_stream, int msg_number [, int flags])

Возвращает тело сообщения с номером msgjiumber в текущем ящике. В аргументе fI ags могут быть указаны следующие значения (их можно бинарно комбинировать):

FTJJID - в аргументе msgno указан уникальный идентификатор UID;
FT_PEEK - не устанавливать флаг сообщения \Seen (если он еще не установлен);
FT_INTERNAL - возвращать текст как есть, а не в формате CRLF1.
Функция возвращает полную точную копию сообщения (как есть). С ее помощью можно прочитать простые сообщения. Для сложных (составных) сообщений функция может вернуть просто строку: «This is a multi-part message in MIME format» («Это сообщение в формате MIME состоит из нескольких частей»). Чтобы извлечь отдельные его части и обработать соответственно MIME-кодировке, пользуйтесь функциями imap_fetch_structure() и imap_fetch_body().

imap_fetchbody

Получение части сообщения

string imap_fetchbody (int imap_stream, int msgjiumber.

string partjiumber [, flags flags])

Возвращает часть тела сообщения с номером msgjiumber в текущем ящике. Спецификация указания перечисления номеров секций в аргументе partjiumber определяется IMAP 4 (в тривиальном случае это может быть простой номер части, где 0 - основная часть, 1 и далее - вложенные).

В аргументе flags могут быть указаны следующие значения (их можно бинарно комбинировать):

FTJJID - в аргументе msgno указан уникальный идентификатор UID;
FT_PEEK - не устанавливать флаг сообщения Seen (если он еще не установлен);
FT_INTERNAL - возвращать текст как есть, а не в формате CRLF.
Например, для сложного сообщения, структура которого приведена в примере функции imap_fetchstructure(), содержание частей может быть следующим.

Это основная часть сообщения (при вызове imap_fetchbody($m,l,0);):

X-F: <ig@igor > Sun May 13 01:41:00
2003 Received: from igor [127 0 0.1] by igor
(SMTPD32-6 06 EVAL) id ADEC10316 Sun.
13 May 2001 01:41-00 +0400 Message-ID:
<000801cOdb2c$3c46a2cO$01000D7№igor>
From: "IG" <ig@igor.> To <igor@localhost>
Subject Приветствие Date: Sun. 13 May 2001
01.41-00 +0400 MIME-Version: 1.0
Content-Type: multipart/alternative:
boundary"- -=_NextPart_000_0005_
01CODB4D.C33837AO" X-Pnonty:
3 X-MSMail Priority Normal
X-Mailer: Microsoft Outlook Express
5.00 2919 6700 X-MimeOLE: Produced
By Microsoft MimeOLE V5.00.2919.6700
X-RCPT-TO- <igor@localhost> X-UIDL:
289703661 Status: U

Это первая вложенная часть (при вызове imap_fetchbody($m,l,l);):

Привет.
У нас все хорошо
Пока.

Это вторая вложенная часть (при вызове imap_fetchbody($m,l,2);):

<!DOCTYPE HTML PUBLIC "
-//W3C//DTD HTML 4 0
Transitional//EN"> ^HTML>
<HEAD> <META content=
3D"text/html. charset=3Dkoi8-r"
http-equiv=3DContent-Type>
<META content«3D"MSHTML 5.00.2920.0"
name=3DGENERATOR>
<STYLE>
</STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3D"Arial Cyr"
size=3D2> Привет </FONT>
</DIV>
<DIV><FONT face=3D"Anal CYR"
size=3D2> У нас все хорошо.</FONT>
</DIV> <DIV><FONT face=3D"Anal CYR"
size=3D2> Пока. </FONT></DIV>
</BODY>
</HTML>

bnap_uid

Получение DID сообщения из порядкового номера

int imap_uid (int imap_stream, int msgno)

Возвращается уникальный идентификатор сообщения UID. Он отличается от номера неизменностью, так как номера псревычисляются при удалении сообщений. Действие функции обратно imapjnsgno().

echo imap_uid($mbox.l);
// выводит например: 289703561

imap_msgno

Получение порядкового номера сообщения из UID

int imapjnsgno (int imap_stream, int uid)

Действие функции обратно imap_uid().

imap_setflag_full

Установка флагов сообщения

string imap_setflag_fu"n (int stream, string sequence, string flag, string options)

В аргументе sequence указывается перечисление номеров сообщений, для которых необходимо установить флаги, указанные в аргументе flag. Флат (согласно RFC2060) обозначаются: "\\Sccn", "\\Answered", "\\Flagged", "\\Deleted", "\\Draft", и "\\Rccent".

В аргументе options может быть указано значение STJJID, указывающее на то, что в аргументе sequence указан уникальный идентификатор UID.

$mbox =- imap_open("{your.I map.host:143}".
"userrame"."password") || dieC'can't connect: "
.imap_last_error()):
if (imap_sPtflag_full($mbox."2A15:
19.23"."\\Seen \\Flagged")) print
"Флаги установлены";
imap_clobe($mbox).

imap_clearflag_ full

Сброс флагов сообщения

string imap_clearf!ag_fun (int stream, string sequence, string flag, string options)

Действие функции противоположно imap_setflag_fuTI().

См. описание в imap_setf1ag_fun().

imap_delete

Маркировка сообщения как удаленного

int imapjJelete tint imap_stream, int msg_number [, int flags])

Возвращает TRUE.

В аргументе msg_number указывается номер сообщения, а в flags (при значении FTJJID) - является ли номер идентификатором. Сообщения, помеченные к удалению, остаются в ящике, пока не будет вызвана функция imap_expunge() или подключение (с установленным флагом CL_EXPUNGE) не будет закрыто функцией imap_close().

\ Smbox - imap_open ("{your miap.hostJINBOX".
"username". "password") || die
("can't cornect: " imap_last_error()):
/ Scheck = imapjnailboxmsginfo
(Smbox): print "Сообщений до удаления
" Scheck->Nmsgs . "<br>\n" ;
imapjJelete (Smbox. 1);
$check = imipjnailboxmsginfo
(imbox): print "Сообщений после удаления
".$check->Nmsgs."<br>\n" : imap_expunge
(Smbox): $check = imap_mailboxmsginfo
(Smbox).
print " Сообщений после expunge()
: ",$chPck->Nmsgs "^br>\n" ; imap_close
(Smbox);

imap_undelete

Восстановление удаленного сообщения

int imap_undelete (int imap_stream, int msg_number)

Функция удаляет флаг удаления с сообщения с номером msgjiumber. Этот флаг ранее можег быть установлен функциями imap_delete(), imapjnail_move() или imap_setflag_full().

Возвращает TRUE или FALSE - при ошибке.

imap_ expunge

Удаление «удаленных» сообщений

int imap_expunge (int imap_stream)

Полностью удаляет из ящика сообщения, имеющие флаг "\\Dcleted", который может быть установлен функциями imap_delete(), imap_mail_ move() или imap_setflag_full().

Возвращает TRUE.

imap_mail_copy

Копирование сообщения в ящик

int -imapjnail_copy (int imap_stream, string msglist, string mbox [. int flags])

Возвращает TRUE или FALSE - при ошибке.

Перечисление номеров копируемых сообщений указывается в стро-I ковом аргументе msglist. Их следует перечислять через запятую, без пробелов, диапазоны указываются знаком двоеточия.

См. также документ RFC2060.

Ящик назначения, указываемый в аргументе mbox, указывается без имени сервера.

В аргументе flags можно указывать битовую маску из следующих констант:

CPJJID - номера являются уникальными идентификаторами UID;
СР MOVE - удалять сообщения после копирования.
imap_mail_copy($m. "1.3 5"."INBOX/Текущие"):

imap_mail_move

Перемещение сообщения в ящик

int imapjnailjnove (int imap_stream, string msglist, string robox [. int flags])

Функция аналогична вызову:

imap_mail_copy(imap_stream, msglist, mbox, flags | CP_MOVE );

imap_alerts

Получение сообщения IMAP

array imap_alerts (void)

Возвращается массив, содержащий все извещения, посланные сервером от начала подключения или после прошлого вызова данной функции.

imap_mime_header_decode

Декодирование элементов MIME заголовков

array imap_header_decode (string text)

Функция декодирует расширенные заголовки, посланные не в тексте ASCII (см. RFC2047). Декодированные элементы возвращаются в массиве объектов, каждый из которых содержит пару "charset" и "text" (кодировка и содержимое текста). Если заголовки не были закодированы (то есть они передавались в кодировке US-ASCII), значение элемента "charset" будет равно "default".

$teAt="*?ISO-8859-l?Q?Keld_>
r8rn_Simoisen?= <kpldG>dkuug.dk>";
print._r( тлар irnme_heacier_decode
($text 0

Выводит следующее:

Arrayt
[0] -> stdClass Object (
[charset] => ISO-8859-1
[text] => Keld Juirn Slmonsen )
[1] -> stdClass Object (
[charset] => default [text] «>
<keld@dkuug.dk> ) )

imap_mail_compose

Создание сообщения MIME по шаблону

string imapjrtan_compose (array envelope, array body)

<?php
$envelope["from"]="musore
@afterfive com". $envelope["to"]="
musone@darkstar"; $envelope["cc"]
="musone@edgeglobal.com".
$partlC"type">TYP0WLTIPART;
$partl["siibtype"]="mixed";
$flleneroe-'/tmp/lroap c.gz";
$fp=fopen($filename."r").
$contents=fread<$fp.filesize($filename)):
fc!ose($fp):
$part2["type']=TYPEAPPLICATION.
$part2["encoding"]=ENCBIMARY:
$part?["subtype">"octet-stream".
$part?["descnption"]=basename
($filename); $part2["contents.data"]=
$contents;
$part3["type">TYP&#163;TEXT.
$part3["subtype"]="plain".
$part3[ "descn pt i on" ]="descri pt i on3";
$part3["contents.data ']="contents
.data3\n\n\n\t";
$body[l]=$partl: $body
[2]=$part2. $body[3]=$part3:
echo nl2br(imap_mail_compose
($envelope.$body)): ?>

imap_append

Создание сообщения в ящике

int imap_append (Int imap_stream, string mbox, string message [, string flags])

Возвращает TRUE или FALSE - при ошибке.

В аргументе message содержится текст сообщения, включая текст заголовка. Для многих серверов необходимо обозначать конец строк парой символов «\r\n».

В аргументе flags можно указать флаги, присваиваемые сообщению. ,

$stream = imap_open("(
your imap.host}INBOX.Drafts"."username".
"password"): /
[ $check = imap_check($stream);
print "Сообщений было: " $check->
Nmsgs "\n";
imap_append($stream."
{your.imap.host}INBOX.Drafts" .
"From- me@my.host\r\n"
"To: you@your.host\r\n"
Subject: test\r\n" "\r\n"
."this TS a test message, please
ignore\r\n". "\\Flagged \\Draft"):
$check = imap_check($stream): ' print
"Сообщений стало: ". $check->
Nmsgs "\n"; imap_close
($stream).

imap_ mail

Посылка email

string imapjnail (string to, string subject, string message [, string additionaljieaders [, string cc [, string bcc [, string rpath>)

Функция пока доступна только в PHP 3.

Вспомогательные функции

imap_last_error

Получение описания последней ошибки

string imap_last_error (void)

Возвращается строка, содержащая полное описание ошибки ШАР (если она имелась), произошедшей в ходе исполнения сценария. Стек сообщений не изменяется, и повторный вызов функции возвратит то же значение (если других ошибок не произошло).

imap_errors

Получение всех возникших ошибок array imap_errors (void)

В массиве возвращаются строки описания ошибок ШАР, произоше/ тих от начала подключения или с момента последнего вызова дан ной функции. Вызов функции полностью очищает стек ошибок.

imap_qprint

Конвертация строки quoted-printable в 8-bit string imap_qprint (string string.j Способ конвертации описан в RFC2045, раздел 6.7. / Возвращает двоичную, 8-битную строку.

См. также imap_8bit().

imap_8bit

Конвертация строки 8bit в quoted-printable

string imap_8bit (string string)

Способ конвертации описан в RFC2045.

Возвращает строку, «цитированную для печати».

print imap_8bit("The Привет"),
// напечатает. The <F=FO=E8=E2=E5=F2

См. также imap_qprint().

imap_ binary

Конвертация строки 8bit в base64

string imapjjinary (string string)

Процедура конвертации описана в RFC2045.

Возвращает строку в формате base64.

print imap_tnnary("The Привет");
// напечатает: VGhlIM/w60L18g==

См. также imap_base64().

imap_base64

Декодирование BASE64

string imap_base64 (string text)

Процедура конвертирования описана в RFC2045.

См. также imap_binary().

imap_rfc822_write_address

Форматирование строки адреса

string imap_rfc822_write_address (string mailbox, string host, string personal)

Возвращает строку адреса электронной почты, сформированную из заданных значений согласно правилам, указанным в RFC822.

print imap_rfc822_write_address
("ig"."php net"."Igor Ghgin");
// выведет. Igor Grigin <ig@php.net>

imap_rfc822_parse_adrlist

Интерпретация адреса

array imap_rfc822_parse_adrlist (string address, string default_host)

Исходная строка с перечислением почтовых адресов, записанных в формате RFC822, указывается в аргументе address. Аргумент содержит имя хоста, добавляемое к адресу, если в нем таковое отсутствует.

Возвращается массив объектов, каждый из которых может иметь следующие свойства:

mailbox - имя ящика (usernamc);
host - имя хоста;
personal - личное имя;
adl - доменный разделитель.
$address_stnng = "Igor Grigin
<ig@my.domain.net>,postmaster
@somedomain net. root";
$address_array = imap_rfc822_parse_ac!rlist
($address_string."our net").
if(! is_array($address_array))
dieC'somethings wrong\n"):
print_r($address_array);

Будет выведено следующее:

Arrayt [0] => stdClass Object
( [mailbox] => ig [host] =>
my domann.net [personal] =>
Igor Origin ) [1] => stdClass Object
( [mailbox] => postmaster [host]
=> somedomain.net )
[2] => stdClass Object ( [mailbox]
=> root [host] => our net ) )
imap_rfc822 parse headers
Интерпретация заголовков
из строки object
imap_rfc822_parse_headers
(string headers [, string defaulthost])

Функция сходна с imap_header(), но информацию она получает не с сервера ШАР, а из строки headers.imap_utf7_decode

Декодирование строки UTF-7

string imap_utf7_decode (string text)

Возвращает оригинальную строку или FALSE - в случае ошибки. Эта кодировка часто используется для адресов почтовых ящиков, содержа-! щих национальные символы (например, символы кириллицы). Функ-/ ция использует модифицированный алгоритм, описанный в RFC2060, раздел 5.1.3 (устаревший алгоритм» был описан в RFC1642).

imap_utf7_encode

Кодирование строки 8bit в UTF-7

string imap_utf7_encode (string data)

imap_utf8

Конвертация текста в UTF8

string imap_utf8 (string text) Конвертация описана в RFC2044.[/size]

Учебник по основам PHP   Теги: Imap, Nntp, Pop

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉