MMP - протокол соединения Mail.Ru Агента с общей сетью Mail.Ru.
Рекомендованный для соединения сервер в любой момент времени можно
получить в текстовом формате ip:port по адресу mrim.mail.ru:443 и mrim.mail.ru:2042.
Взаимодействие с сервером происходит поверх постоянно установленного
tcp-соединения посредством асинхронного обмена командами. Инициатором
установления соединения может быть только клиент, команды могут посылаться
как клиентом, так и сервером.
MMP бинарный протокол. Все числовые данные передаются как
четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт,
последним младший. Четырехбайтовые беззнаковые целые обозначаются
UL.
Текстовые данные передаются с префексированной длиной, т. е. сначала
UL, а потом строка (в кодировке windows-1251) длины UL без
завершающего нуля. Обозначение в дальнейшем - LPS.
Каждая команда или ответ на нее начинаются с заголовка. Поля
указываемые в заголовке:
- Пакет: Установка соединения
Имя пакета: MRIM_CS_HELLO
Ответ: MRIM_CS_HELLO_ACK
Тип пакета:
cs
Описание: Первый пакет, отправляемый на сервер.
- Пакет: Подтверждение установки соединения
Имя пакета: MRIM_CS_HELLO_ACK
Тип пакета:
sc
Параметры:
UL ## ping_period ## Ожидаемая частота подтверждения
соединения (в секундах)
Описание: Подтверждает возможность соединения и
сообщает клиенту интервал, с которым надо отправлять пакеты контроля
соединения.
- Пакет: Успешная авторизация
Имя пакета: MRIM_CS_LOGIN_ACK
Тип пакета:
sc
Описание: Сообщает, что пара логин-пароль была верна и
клиент успешно авторизовался в сети агента.
- Пакет: Неверная авторизация
Имя пакета: MRIM_CS_LOGIN_REJ
Тип пакета:
sc
Параметры:
LPS ## reason ## причина отказа
Описание: Сообщает, что пара логин-пароль была
неверна, и соединение будет завершено.
- Пакет: Контроль соединения
Имя пакета: MRIM_CS_PING
Тип пакета: cs
Описание:
Отправка этого пакета подтверждает для сервера, что клиент активен.
Пакет должен отправляться с интервалом, определенным в MRIM_CS_HELLO_ACK.
- Пакет: Сообщение
Имя пакета: MRIM_CS_MESSAGE
Тип пакета: cs
поле seq
должно содержать номер, который в последствии будет содержаться в
заголовке пакета MRIM_CS_MESSAGE_STATUS,
оповещающем клиента о статусе доставки данного
сообщения.
Параметры:
UL ## flags ## флаги ##
MESSAGE_FLAG_OFFLINE ##
Сообщение пришло, пока клиент был отключен
MESSAGE_FLAG_NORECV ##
Отправителю сообщения не требуется подтверждения
доставки
MESSAGE_FLAG_AUTHORIZE ## Сообщение является запросом на
авторизацию
MESSAGE_FLAG_SYSTEM ## Сообщение является системным
уведомлением администрации
MESSAGE_FLAG_RTF ## В сообщении содержится
форматированная часть
MESSAGE_FLAG_CONTACT ## Сообщение представляет
из себя пересланный список контактов. Текст сообщения в этом случае
должен представлять из себя список адресов и ников пересылаемых
контактов, перечисленных через точку с запятой.
<адрес1>;<ник1>;<адрес2>;<ник2>;<адрес3>;<ник3>;...
MESSAGE_FLAG_NOTIFY
## Это сообщение-уведомление "Вам пишут". Должно посылаться каждые 10
секунд, при более длинной паузе клиент-получатель должен считать, что
отправитель прекратил написание. Текст такого сообщения должен состоять
из одного пробела.
MESSAGE_FLAG_MULTICAST ## Сообщение направлено
списку получателей, а не одному. Поле to в таком случае состоит из
списка получателей, перечисленных через запятую. Максимальная длина
списка - 50 адресов.
LPS ## to ## email получателя
LPS ## message ##
текстовая версия отправляемого сообщения
LPS ## rtf-message ##
отформатированная версия отправляемого сообщения, в случае наличия обоих
версий сообщения приоритет имеет rtf-версия. Она должна содержать
rtf-текст упакованный gzip в base64 представлении. То есть:
BASE64(
GZIP(
UL количество LPS (должно быть не менее 2)
LPS rtf_text_with_all_rtf_headers_and_tags
LPS цвет фона в виде UL
)
)
Описание: Основной пакет взаимодействия между
двумя клиентами. Может быть отправлено в любой момент по инициативе
клиента. Ни текстовая, ни rtf части сообщений не могут быть пустыми, при
необходимости следует использовать строку из одного пробела.
- Пакет: Доставка сообщения
Имя пакета: MRIM_CS_MESSAGE_ACK
Тип пакета:
sc
Параметры:
UL ## msg_id ## Номер пакета (Sequence) этого сообщения
для отправителя
UL ## flags ## Возможные значения описаны в
MRIM_CS_MESSAGE
LPS ## from ## Адрес отправителя
LPS ## message ##
текстовая версия сообщения
LPS ## rtf-message ## форматированная
версия сообщения
Описание:
- Пакет: Подтверждение получения сообщения
Имя пакета: MRIM_CS_MESSAGE_RECV
Тип пакета:
cs
Параметры:
LPS ## from ##
UL ## msg_id ##
Описание: Отправляется получателем сообщения сразу
после прихода MRIM_CS_MESSAGE_ACK, если флаги MRIM_CS_MESSAGE_ACK не содержали MESSAGE_FLAG_NORECV. from и msg_id должны быть скопированы из MRIM_CS_MESSAGE_ACK и имеют то же значение.
- Пакет: Подтверждение доставки сообщения
Имя пакета: MRIM_CS_MESSAGE_STATUS
Тип пакета: sc
Поле
seq численно равно полю seq пакета MRIM_CS_MESSAGE
Параметры:
UL ## status ## статус доставки ##
MESSAGE_DELIVERED ## Сообщение
успешно доставлено
MESSAGE_REJECTED_INTERR ## Произошла внутренняя
ошибка
MESSAGE_REJECTED_NOUSER ## Не существует
пользователя-получателя сообщения
MESSAGE_REJECTED_LIMIT_EXCEEDED ##
Пользователь-получатель в данный момент отключен от сети, и сообщение не
помещается в его почтовый ящик
MESSAGE_REJECTED_TOO_LARGE ## Размер
сообщения превышает максимально
допустимый
MESSAGE_REJECTED_DENY_OFFMSG ## Пользователь-получатель в
данный момент отключен от сети, а настройки его почтового ящика не
допускают наличие оффлайновых сообщений агента
Описание: Отправленное сообщение считается
доставленным только после получения этого ответа сервера. Сервер НЕ
ГАРАНТИРУЕТ доставку сообщения. В случае отстутствия MRIM_CS_MESSAGE_STATUS более интервала подтверждения
соединения, программа клиент должна послать сообщение повторно или
проинформировать пользователя о невозможности доставки из-за проблем
связи получателя.
- Пакет: Смена статуса другого пользователя
Имя пакета: MRIM_CS_USER_STATUS
Тип пакета:
sc
Параметры:
UL ## status ## новый статус пользователя ##
STATUS_OFFLINE ## Пользователь
отключен от сети Агента
STATUS_ONLINE ## Пользователь находится в
сети
STATUS_AWAY ## Пользователь в сети, но отошел от
компьютера
STATUS_UNDETERMINATED ## Настройки пользователя запрещают
показывать его статус
STATUS_FLAG_INVISIBLE ## Пользователь находится
в сети, но невидим для всех, кроме привилегированных пользователей из
его списка видимости.
LPS ## user ## email сменившего свой статус
пользователя
Описание: Это сообщение отправляется сервером при
смене статуса пользователям всем тем, у кого он находится в
контакт-листе (за исключением группы "Жду Авторизации" и тех, кого он
включил в список игнорируемых или невидящих). Данное сообщение может
быть доставлено клиенту ДО получения им контакт-листа. В такой ситуации
оно должно игнорироваться.
- Пакет: Закрытие соединения
Имя пакета: MRIM_CS_LOGOUT
Тип пакета:
sc
Параметры:
UL ## reason ## причина отключения ##
LOGOUT_NO_RELOGIN_FLAG ##
Пользователь отключен из-за параллельного входа с его логином. Клиент не
должен осуществлять автоматический перезаход в этом случае.
- Пакет: Изменение параметров соединения
Имя пакета: MRIM_CS_CONNECTION_PARAM
Тип пакета:
sc
Параметры:
UL ## ping_period ## новая ожидаемая частота подтверждения
соединения
Описание: Ближайший MRIM_CS_PING следует отправлять уже исходя из новой
частоты.
- Пакет: Добавление нового контакта
Имя пакета: MRIM_CS_ADD_CONTACT
Тип пакета:
cs
Параметры:
UL ## flags ## флаги ##
CONTACT_FLAG_GROUP ##
Добавляется новая группа, а не контакт (несовместим с остальными).
Верхний байт содержит количество уже имеющихся групп в
контакт-листе
CONTACT_FLAG_INVISIBLE ## Контакт должен попасть в
список "Я всегда невидим для"
CONTACT_FLAG_VISIBLE ## Контакт должен
попасть в список "Я всегда видим для"
CONTACT_FLAG_IGNORE ## Контакт
должен попасть в список игнорируемых
CONTACT_FLAG_SHADOW ## Контакт
не должен попасть в основной контакт-лист (применяется в паре с одним из
трех предыдущих)
CONTACT_FLAG_REMOVED ## Контакт удален
UL ## group_id ## группа, в которую должен быть добавлен
контакт (для CONTACT_FLAG_GROUP равно 0)
LPS ## email ## добавляемый
адрес (имя группы для CONTACT_FLAG_GROUP)
LPS ## name ## ник
добавляемого пользователя (для отображения в контакт-листе, не
посылается для CONTACT_FLAG_GROUP) LPS ## unused ## неиспользуемый
параметр
- Пакет: Подтверждение добавления контакта
Имя пакета: MRIM_CS_ADD_CONTACT_ACK
Тип пакета:
sc
Параметры:
UL ## status ## результат операции ##
CONTACT_OPER_SUCCESS ##
добавление произведено успешно
CONTACT_OPER_ERROR ## переданные
данные были некорректны
CONTACT_OPER_INTERR ## при обработке запроса
произошла внутренняя ошибка
CONTACT_OPER_NO_SUCH_USER ## добавляемого
пользователя не существует в системе
CONTACT_OPER_INVALID_INFO ##
некорректное имя пользователя
CONTACT_OPER_USER_EXISTS ##
пользователь уже есть в контакт-листе
CONTACT_OPER_GROUP_LIMIT ##
превышено максимально допустимое количество групп (20)
## UL ## contact_id ## присвоенный новому контакту
номер
Описание: Приходит в ответ на MRIM_CS_ADD_CONTACT. -1 если status
не равен CONTACT_OPER_SUCCESS.
- Пакет: Изменение контакта
Имя пакета: MRIM_CS_MODIFY_CONTACT
Тип пакета:
cs
Параметры:
UL ## id ## номер модифицируемого контакта
UL ## flags
##
UL ## group_id ## Равно 0 для группы
LPS ## contact ## Если
группа, то имя группы
LPS ## name ## Если группа, то имя группы
Описание: Параметры те же, что и у MRIM_CS_ADD_CONTACT. contact до и
после изменения обязаны совпадать.
- Пакет: Подтверждение изменения контакта
Имя пакета: MRIM_CS_MODIFY_CONTACT_ACK
Тип пакета:
sc
Параметры:
UL ## status ## Результат операции. Значения имеют тот же
смысл, что и в MRIM_CS_ADD_CONTACT_ACK
- Пакет: Сообщение доставленное, пока пользователь не был
подключен к сети
Имя пакета: MRIM_CS_OFFLINE_MESSAGE_ACK
Тип пакета:
sc
Параметры:
UIDL ## uidl ## id сообщения
LPS ## message ##
сообщение. Сообщение приходит в формате RFC/822 письма. Отправитель
сообщения хранится в заголовке From, дата в заголовке Date, флаги
сообщения в X-MRIM-FLAGS, текстовая и форматированная версии сообщения
составляют текст письма и разделяются между собой разделителем из
заголовка Boundary.
Описание: Каждое полученное за время отсутствия
сообщение приходит отдельным пакетом в том порядке, в каком они
поступали на сервер.
- Пакет: Удаление сохраненного сообщения
Имя пакета: MRIM_CS_OFFLINE_MESSAGE_DEL
Тип пакета:
cs
Параметры:
UIDL ## uidl
Описание: На каждый полученный MRIM_CS_OFFLINE_MESSAGE_ACK клиент обязан отправить MRIM_CS_OFFLINE_MESSAGE_DEL с тем же uidl, подтверждающий получение данного сообщения.
Сообщение стирается на сервере только при получении этой команды.
- Пакет: Авторизация пользователя на добавление в
контакт-лист
Имя пакета: MRIM_CS_AUTHORIZE
Тип пакета:
cs
Параметры:
LPS ## user ## email пользователя
Описание: Отправляется, чтобы разрешить user добавление пользователя в контакт-лист и наблюдение
за его статусом.
- Пакет: Информация об авторизации
Имя пакета: MRIM_CS_AUTHORIZE_ACK
Тип пакета:
sc
Параметры:
LPS ## user ## email авторизовавшего пользователя
Описание: Отсылается сервером после получением им
MRIM_CS_AUTHORIZE от user
тому, кого user авторизовал.
- Пакет: Изменение статуса
Имя пакета: MRIM_CS_CHANGE_STATUS
Тип пакета:
cs
Параметры:
UL ## status ## возможные значения совпадают с
MRIM_CS_USER_STATUS, но не могут посылаться статусы
STATUS_UNDETERMINATED и STATUS_OFFLINE
- Пакет: Требование ключа для web-авторизации
Имя пакета: MRIM_CS_GET_MPOP_SESSION
Тип пакета:
cs
Описание: Пользователь агента может заходить в почтовый
ящик Mail.Ru без дополнительной авторизации и не передавая свой пароль в
GET-запросе, для этого используется механизм ключей.
- Пакет: Ключ для web-авторизации
Имя пакета: MRIM_CS_GET_MPOP_SESSION_ACK
Тип пакета:
sc
Параметры:
UL ## status ## успешность операции (1 - ключ получен, 0 -
произошла ошибка)
LPS ## session ## сам ключ
Описание: Для входа в ящик можно использовать URL
win.mail.ru/cgi-bin/auth?Login=email&agent=ключ.
- Пакет: Поиск контакта
Имя пакета: MRIM_CS_WP_REQUEST
Тип пакета:
cs
Параметры:
UL ## field ## параметр поиска ##
MRIM_CS_WP_REQUEST_PARAM_USER ##
логин (без домена), обязан комбинироваться с
доменом
MRIM_CS_WP_REQUEST_PARAM_DOMAIN ## почтовый
домен
MRIM_CS_WP_REQUEST_PARAM_NICKNAME ##
ник
MRIM_CS_WP_REQUEST_PARAM_FIRSTNAME ## имя
MRIM_CS_WP_REQUEST_PARAM_LASTNAME ## фамилия, * в конце
ника/имени/фамилии указывает на возможность любого продолжения
имени
MRIM_CS_WP_REQUEST_PARAM_SEX ## пол. 1 - мужской, 2 -
женский
MRIM_CS_WP_REQUEST_PARAM_DATE1 ## минимальный возраст (в
годах)
MRIM_CS_WP_REQUEST_PARAM_DATE2 ## максимальный возраст (в
годах)
MRIM_CS_WP_REQUEST_PARAM_CITY_ID ## ID региона проживания
MRIM_CS_WP_REQUEST_PARAM_ZODIAC ## Знак зодиака (Овен - 1, ..., Рыбы
- 12)
MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_MONTH ## Месяц рождения
(Январь - 1, ..., Декабрь - 12)
MRIM_CS_WP_REQUEST_PARAM_BIRTHDAY_DAY
## День рождения (обязан комбинироваться с месяцем
рождения)
MRIM_CS_WP_REQUEST_PARAM_COUNTRY_ID ## ID страны
проживания
MRIM_CS_WP_REQUEST_PARAM_ONLINE ## ищем ли мы только
подключенных в данный момент пользователей (1)
LPS ## value все параметры в строковом формате, включая
числа
Описание: Поиск контактов в базе агента. Параметры
поиска передаются парами параметр-значение. Передача нескольких
параметров имеет семантику "и", т. е. все найденные результаты должны
соответствовать всем переданным параметрам. Комбинироваться могут все
параметры за исключением логина и домена (они обязаны идти парой и не
могут комбинироваться с другими параметрами) в порядке соответствующем
порядку описания (за исключением требования для MRIM_CS_WP_REQUEST_PARAM_ONLINE быть последним в списке).
- Пакет: Найденные пользователи
Имя пакета: MRIM_CS_ANKETA_INFO
Тип пакета:
cs
Параметры:
UL ## status ## успешность запроса ##
MRIM_ANKETA_INFO_STATUS_OK ##
поиск успешно завершен
MRIM_ANKETA_INFO_STATUS_NOUSER ## не найдено
ни одной подходящей записи
MRIM_ANKETA_INFO_STATUS_RATELIMERR ##
слишком много запросов, поиск временно запрещен
UL ## fields_num ## количество полей в анкете каждого
пользователя
UL ## max_rows ## текущее ограничение на количество
результатов поиска (может быть больше, чем количество строк в данном
ответе)
UL ## server_time ## текущее время на сервере (должно
использоваться для вычисления возраста). Формат времени: Количество
секунд с 00:00:00 1 января 1970 года.
LPS, LPS, ... ## fields ##
названия полей текущей анкеты (всего fields_num штук)
LPS, LPS, ...
## values ## значения полей анкеты для каждого найденного по запросу
пользователя в том же порядке, что в списке полей, по fields_num штук на
каждого
Описание: Результат поиска контактов. Возвращает
анкеты найденных пользователей (их адреса являются полями анкеты).
- Пакет: Количество писем в почтовом ящике
Имя пакета: MRIM_CS_MAILBOX_STATUS
Тип пакета:
sc
Параметры:
UL ## status ## количество непрочитанных писем
Описание: Приходит при получении новой почты или
любом другом изменении числа непрочитанных писем в ящике.
- Пакет: Контакт-лист
Имя пакета: MRIM_CS_CONTACT_LIST2
Тип пакета:
sc
Параметры:
UL ## status ## результат запроса контакт-листа
GET_CONTACTS_OK ## поиск
выполнен успешно
GET_CONTACTS_ERROR ## найденный контакт-лист
некорректен
GET_CONTACTS_INTERR ## произошла внутренняя ошибка
UL ## groups_number ## количество групп в
контакт-листе
LPS ## group_mask ## маска-описание группы, состоит из
символов 's' (LPS),'u' (UL),'z' (строка оканчивающаяся бинарным нулем, в
данный момент не используется), сейчас "us" - флаги и название, при
расширении описания старые поля сохранят свое расположение
LPS ##
contacts_mask ## маска-описание пользователя (синтаксис такой же как и у
group_mask), сейчас uussuu (флаги, группа, адрес, ник, серверные флаги,
текущий статус в сети)
## groups ## группы (всего groups_number
штук)
## contacts ## контакты
Описание: Контакт-лист пользователя хранится на
сервере. Клиент может хранить локальную копию контакт-листа, но
серверная должна иметь приоритет. Флаги контакта имеют тот же смысл, что
в MRIM_CS_ADD_CONTACT, статус - тот же смысл, что в
MRIM_CS_USER_STATUS. Серверный флаг в данный момент
определён один - CONTACT_INTFLAG_NOT_AUTHORIZED
означает, что контакт еще не авторизовал пользователя и находится в
группе "Жду авторизации". Если маска контакта или группы содержит больше
символов, чем необходимо, клиент должен прочитать значения этих полей и
проигнорировать их.
- Пакет: Авторизация
Имя пакета: MRIM_CS_LOGIN2
Тип пакета:
cs
Параметры:
LPS ## login ## email авторизующегося пользователя
LPS
## password ## пароль
UL ## status ## статус (см.
MRIM_CS_CHANGE_STATUS)
LPS ## user_agent ## текстовое описание
клиента пользователя, например "Mail.Ru Miranda Plugin v
1.0"