Описание API EDIMail

advertisement
Описание API EDIMail
Функции инициализации и работы с контекстом
EDIMailContext* InitContext(char* filepath)
Функция инициализации библиотеки. Предназначена для создания контекста, с
помощью которого определяются умолчания для не заданных аргументов
функций и параметров. Конструктор каждого создаваемого объекта позволяет
указать имя прототипа объекта. Имя прототипа ищется в контексте, и методы,
атрибуты найденного прототипа используются при инициализации объекта. При
окончании работы с библиотекой контекст должен быть освобожден функцией
FreeContext
void FreeContext(EDIMailContext *ctx)
Функция освобождает память и другие ресурсы, связанные с контекстом
библиотеки. После этого вызова использование функций библиотеки будет
завершаться с ошибкой.
void AddPrototype(EDIMailContext *ctx, v8:String name, v8:Object
prototype)
Добавляет указанный объект в качестве прототипа к контексту. Создав объект с
требуемыми методами и атрибутами, можно добавить его к контексту с тем, чтобы
в дальнейшем использовать его в качестве шаблона в конструкторах объектов.
Аналогично использованию шаблонов документов в MS Word.
int GetMessageStatus(EDIMailContext *ctx, v8:String messageId)
Функция возвращает статус отправленного сообщения или код ошибки, если о
таком сообщении ничего не известно.
Основные функции библиотеки
Адресация
Цель работы библиотеки – доставить сообщение в хранилище сообщений, откуда
его получит (заберет) адресат. Под адресатом понимается бизнес-сущность,
имеющая наименование, ИНН и несколько хранилищ сообщений для разных
целей (сервисов). Хранилищем сообщений в данной реализации библиотеки
может выступать папка в файловой системе, папка на FTP сервере или папка на
IMAP сервере. Каждому хранилищу соответствует свой URL, например,
file://C:/doc, ftp://ftp.micex.com/common, imap://sbrf@ex.micex.com/inbox. Некоторые
хранилища сообщений могут иметь прокси-url для входящих сообщений,
например, url хранилища imap://sbrf@ex.micex.com/inbox может соответствовать
url для входящих сообщений mailto:sbrf@ex.micex.com. Еще пример прокси-url: на
компьютере abc.local c локальной папкой C:\Inetpub\common можно настроить FTP
сервер с корнем C:\Inetpub. Получим хранилище с url
file://abc.local/C:/Inetpub/common и прокси-url ftp://abc.local/common.
Объекты типа EDIMailAddress
Для адресации исходящих сообщений используется объект типа EDIMailAddress.
Этот объект инкапсулирует связь между атрибутами бизнес-сущности и url ее
хранилища сообщений.
Атрибуты EDIMailAddress
Этот объект имеет 4 атрибута:




email – строка или список строк с url для входящих сообщеий; как правило,
это url mailto; в соответствии со стандартом данный url может содержать не
только собственно RFC822 адрес электронной почты, но и заголовки,
предмет письма.
rtsmail – строка с адресом в «старой» системе вида
EMAIL@TROYM.REPORT;
DName – строка в формате запроса к LDAP серверу, например
«DN=Московская биржа, OU=Клиентский отдел» или «INN=7707083893»
service – строка, обозначающая сервис, использующий систему EDIMail для
доставки своих сообщений адресату, например «REPORT».
При создании объекта в конструкторе может быть задано любое допустимое
сочетание из этих четырех атрибутов. При работе с объектом обращение к не
определенному в конструкторе атрибуту вызовет обращение к функции контекста
библиотеки, которая выполнит поиск значения в справочнике или выбор значения
по умолчанию. Недопустимое сочетание атрибутов в конструкторе вызовет
ошибку-исключение и объект EDIMailAddress создан не будет. Примером
недопустимого сочетания атрибутов является, например, задание строки service
не совпадающей с соответствующим заголовком в параметре email, содержащим
url mailto:.
Конструктор EDIMailAddress(EDIMailContext *ctx, v8::String rtsmail, v8::string DName, v8::String
service, v8::Value email, v8::String prototype = v8::Null)
Создает объект адрес, связанный с контекстом ctx.
Объект будет автоматически удален при освобождении контекста, если он не был
удален ранее.
Объекты типа EDIMailURL
Объекты этого типа используются для получения доступа к хранилищам
сообщений. Некоторые url предоставляют отграниченный доступ, например, url
mailto предоставляют только доступ «на запись», доступ по другим url, например,
ftp, зависит от настроек сервера, к которому идет обращение.
Некоторые атрибуты объекта могут как инициализироваться из строки url,
например, имя пользователя и пароль, так и задаваться непосредственным
присваиванием значения атрибуту.
Конструктор EDIMailURL(EDIMailContext *ctx, v8::String url, v8::String prototype = v8::Null)
Создает объект, который можно использовать в дальнейшем для доступа к
хранилищу сообщений. Все атрибуты, которые можно заполнить с помощью
информации, содержащейся в строке URL, будут заполнены. Конструктор не
проводит никаких проверок, кроме синтаксических. Создание объекта не означает,
что к описываемому хранилищу можно будет получить доступ в дальнейшем. При
обнаружении синтаксических ошибок в строке URL объект не создается, возникает
исключение. Объект будет автоматически удален при освобождении контекста,
если он не был удален ранее.
Атрибуты EDIMailURL
user – v8::String – имя пользователя, строка, используемая для авторизации
доступа к хранилищу.
password – v8::String – пароль, строка, используемая для авторизации доступа к
хранилищу.
usetls – v8::Number. Использование TLS для IMAP и SMTP:



0 – не использовать, если сервер требует TLS/SSL, соединения с
сервером не происходит;
1 – использовать по возможности, если сервер допускает использование
TLS/SSL, то оно используется;
2 – обязательно использовать, если сервер не поддерживает TLS/SSL,
соединения с сервером не происходит.
tlsfirst – v8::Number. Порядок запуска протоколов для IMAP и SMTP:


0 – сначала запускается почтовый протокол, потом по команде протокола
STARTTLS запускается TLS;
1 – сначала запускается TLS/SSL, а затем поверх запускается почтовый
протокол.
Этот параметр может задаваться в строке url путем добавления “s” к схеме url,
например imaps://… вместо imap://…
tlscheck – v8::Number. Проверка сертификата SMTP и IMAP сервера:



0 – не производится;
1 – проверяется соответствие имени сервера, с которым было
установлено соединение и имени сервера в сертификате;
2 – проверка совпадения имени сервера и проверка валидности самого
сертификата, самоподписанные сертификаты эту проверку не проходят.
url – v8::String – строка, указанная в конструкторе. Атрибут только для чтения.
proxy_url – URL, который надо использовать для доступа к данному URL. Этот
атрибут может заполняться контекстом при создании объекта. Например, при
создании url со схемой mailto: proxy_url должен содержать url smtp сервера,
используемого для посылки сообщений.
Преобразование формата сообщений
Для унификации работы с областями памяти и файлами используется базовый
класс EDIStream. Его потомки – EDIMemoryStream представляет поток,
инициализированный буфером в памяти, EDIFileStream – поток,
инициализированный файлом. Для преобразования формата сообщений к потоку
могут прикрепляться фильтры. С помощью фильтров осуществляется
шифрование, подписывание, проверка подписи, расшифровывание.
Потоки
Базовый класс EDIStream
Атрибуты класса
Date – v8::Date дата, ассоциированая с потоком, в случае если это файловый
поток – дата последнего изменения файла
Length – v8::Number размер потока или -1, если длина неизвестна
Name – v8::String имя потока, в случае файлового потока – имя файла
Методы класса
AddFilter(EDIFilter *filter) – добавляет фильтр к потоку, фильтры применяются в
порядке добавления при выполнении записи в другой поток.
RemoveFilter(EDIFilter *filter) – удаляет ранее добавленный фильтр.
Write(const char *buf, size_t len) – запись в поток.
Read(const char *buf, size_t len) – чтение из потока.
size_t Tell() – текущая позиция потока.
Seek(size_t offset, int whence) – изменение текущей позиции потока
Write2Stream(EDIStream* stream) – запись в другой поток, может использоваться,
например, для записи содержимого памяти в файл с криптопреобразованием,
заданным фильтрами.
Класс EDIMemoryStream - поток, инициализируемый буфером памяти
Класс инициализируется буфером памяти, если происходит запись за пределами
буфера, размер буфера увеличивается по аналогии с функцией realloc.
EDIMemoryStream(EDIMailContext *ctx, char* buffer, size_t length, v8::String prototype
= v8::Null) – конструктор создает поток и инициализирует его буфером заданного
размера
EDIMemoryStream(EDIMailContext *ctx) – конструктор создает пустой поток в
памяти, размер потока будет зависеть от выполненных в него операций записи.
Класс EDIFileStream – поток, инициализированный файлом
EDIFileStream(EDIMailContext *ctx, v8::String file_name, const char * mode, v8::String
prototype = v8::Null) – конструктор создает поток, открывая файл по аналогии с
функций fopen.
EDIFileStream(EDIMailContext *ctx, v8::String prototype = v8::Null) – конструктор
создает пустой файловый поток, предназначенный для записи. Имя файла может
определяться с помощью прототипа, например, можно сделать прототип, который
будет определять имя файла по имени файла аттачмента, которым будет в
дальнейшем инициализирован поток.
Фильтры
Фильтры используются для зашифровывания, расшифровывания, подписывания
и проверок подписей, преобразования файла в аттачмент к электронному письму,
отделение аттачментов от электронного письма. Фильтры применяются при
записи из одного потока в другой. Порядок применения фильтров совпадает с
порядком их добавления.
Класс EDISignFilter(EDIMailContext *ctx, EDIMailAddress *address, v8::String
prototype = v8::Null) – обеспечивает подписывание сообщение присоединенной
подписью от имени бизнес-сущности, соответствующей указанному экземпляру
класса EDIMailAddress. Запрос сертификата бизнес-сущности происходит с
помощью указанного в вызове контекста, если данный контекст возвратит
сертификат, не содержащий бита KEYUSAGE_DIGITAL_SIGNATURE, применение
фильтра вызовет исключение.
Класс EDISenderEncryptFilter(EDIMailContext *ctx, EDIMailAddress *address,
v8::String prototype = v8::Null) – обеспечивает шифрование файла приватным
ключом бизнес-сущности, соответствующей указанному экземпляру класса
EDIMailAddress. Запрос сертификата бизнес-сущности происходит с помощью
указанного в вызове контекста, если данный контекст возвратит сертификат, не
содержащий приватного ключа, применение фильтра вызовет исключение.
Класс EDIReceiverEncryptFilter(EDIMailContext *ctx, EDIMailAddress *address,
v8::String prototype = v8::Null) – обеспечивает шифрование файла публичным
ключом бизнес-сущности, соответствующей указанному экземпляру класса
EDIMailAddress (анонимное шифрование). Запрос сертификата бизнес-сущности
происходит с помощью указанного в вызове контекста, если данный контекст
возвратит сертификат, не содержащий публичного ключа, применение фильтра
вызовет исключение.
Класс EDICheckSignatureFilter(EDIMailContext *ctx, EDISignStatusList* status,
v8::String prototype = v8::Null) – обеспечивает проверку электронных подписей,
возвращает список объектов содержащих результаты проверки и экземпляры
EDIMailAddress идентифицирующие подписавших сообщение.
Класс EDIDecryptFilter(EDIMailContext *ctx, EDIMailAddress *sender, v8::String
prototype = v8::Null) – обеспечивает расшифрование и возвращает экземпляр
EDIMailAddress, соответствующий отправителю, если использовалось не
анонимное шифрование. Если расшифрование невозможно, происходит
исключение.
Класс EDIAttachFilter(EDIMailContext *ctx, EDIStream *stream, v8::String prototype =
v8::Null) – фильтр преобразует указанный поток в формат аттачмента.
Класс EDIMessageFilter(EDIMailContext *ctx, EDIStream *stream, v8::String prototype
= v8::Null) – фильтр преобразует указанный поток в формат сообщения. Данный
фильтр имеет те же атрибуты, что и класс EDIMessage. Которые используются
для задания атрибутов результирующего сообщения.
Класс EDIDetachFilter(EDIMailContext *ctx, EDIStreamList *list, v8::String prototype =
v8::Null) – фильтр преобразует сообщение в список инициализированных потоков
в памяти, каждый из которых не является ни сообщением, ни аттачментом к
сообщению. Используется для распаковки полученных сообщений. Потоки
получают атрибуты сообщений и/или аттачментов, к которым они принадлежали
– from, to и т.д.
Отправка и получение сообщений.
Класс EDIMessage
Данный класс предназначен для представления сообщений в формате,
используемом для непосредственной обработки на MTA и MDA, другими словами,
сообщения в этом формате принимаются SMTP серверами и получаются с IMAP
серверов. Данный класс используется при необходимости обработки атрибутов
сообщения перед отправкой или анализа структуры полученного сообщения.
Конструктор EDIMessage
Конструктор EDIMessage(EDIMailContext* ctx, EDIStream* stream, v8::String
prototype = v8::Null) создает сообщение из указанного потока. Если синтаксический
анализ закачивается ошибкой, объект не создается и генерируется исключение.
Атрибуты EDIMessage
From – v8::String адрес отправителя, определяется контекстом по сертификату
неанонимного шифрования или цифровой подписи
To – адрес получателя, определяется контекстом по сертификатам анонимного
шифрования, может определяться при посылке с помощью url mailto:.
MessageId – определяется контекстом
Mailbox – сервис получателя, которому адресуется сообщение, может
определяться при посылке с помощью url mailto:.
Date – дата сообщения, контекст определяет ее дате цифровой подписи если она
присутствует или по текущей дате
Subject – тема сообщения, определяется по атрибуту Mailbox, может
определяться при посылке с помощью url mailto:.
Part – v8::Object – корневая MIME-часть сообщения
Методы EDIMessage
WriteToStream(EDIStream *stream) – инициализирует указанный поток сообщением
в MIME формате
V8::string PostTo(EDIMailURL *url) – асинхронно отправляет сообщение по
указанному url. Статус доставки сообщения можно запросить у контекста, в
котором создавалось сообщение с помощью MessageId, которое вернул метод. В
случае использования url mailto: указанные в url атрибуты (адрес доставки,
mailbox, subject и др.) заменяют соответствующие атрибуты письма. Если url есть
NULL, то для отправки используется smtp сервер по умолчанию, указанный в
контексте письма.
Функция Post
Данная функция предназначена для асинхронной отправки сообщений. Функция
возвращает строку с идентификатором отправленного сообщения.
v8::String Post(EDIMailContext* ctx , EDIStream *stream, EDIMailURL *url, v8::String
prototype = v8::Null)
Функция выполняет построение объекта EDIMessage из указанного потока и его
отправку по указанному url. Если для выполнения функции не хватает данных,
генерируется исключение.
Функция Collect
Данная функция предназначена для опроса указанного с помощью URL
хранилища сообщений и получения «новых» сообщений. «Новыми» считаются
сообщения, у которых отметка времени хранилища сообщений больше или равна
отметки времени последнего обработанного сообщения из этого хранилища.
Отметка времени последнего обработанного сообщения сохраняется в контексте
и обновляется в результате выполнения каждого вызова, закончившегося
получением сообщения.
int Collect(EDIMailContext* ctx , EDIStream *stream, EDIMailURL *url, v8::String
prototype = v8::Null)
При наличии сообщения функция возвращает количество «новых» сообщений в
хранилище, считая уже принятое, т.е. если в хранилище было 2 сообщения,
функция вернет 2 и инициализирует поток первым новым сообщением. Если в
хранилище нет новых сообщений, функция вернет 0.
Download