EMAIL HTTP API¶
Описание¶
API предоставляет удобный интерфейс для автоматизации процесса отправки email-рассылок через платформу Devino Telecom. С помощью API можно:
- отправлять массовые и транзакционные email-рассылки
- управлять рассылками
- получать статистику по рассылкам
Для использования API необходима авторизация по логину паролю от личного кабинета Devino Telecom.
Внимание
В тексте обязательно должны присутствовать ссылки на отписку от рассылки и веб-версию.
Авторизация¶
API поддерживает базовую авторизацию через заголовок Authorization. В заголовке запроса необходимо передать логин и пароль из личного кабинета в формате login:password
в кодировке base64.
Authorization: Basic dGVzdGVyOjExMTExMQ==
Формат запроса¶
Запрос к API задается в следующем формате:
{тип_метода} https://integrationapi.net/email/v{версия}/{ресурс}?{параметры}
где:
{тип_метода}
- HTTP-метод GET, POST, PUT, PATCH и DELETE.{версия}
- Версия API. Текущая версия - 2.{ресурс}
- URL ресурса, над которым выполняется действие. Список всех ресурсов смотрите в соответствующем разделе.{параметры}
- обязательные и необязательные параметры запроса, которые не входят в состав URL ресурса.- Обязательный пункт:
Accept */*
Сервис позволяет передавать параметры и получать ответы в форматах JSON и XML.
Формат ответа¶
Ответ API состоит из двух частей:
- Код с описанием - эта часть присутствует во всех ответах.
- Результат - специфичный для каждого запроса. Может отсутствовать.
{
"Result": {},
"Code": "not_found",
"Description": "user not found"
}
Код можно использовать для проверки статуса запроса, а описание предназначено для диагностики возможных проблем. Описание может быть изменено в новой версии API без предупреждения о нарушении обратной совместимости. Набор кодов также может быть расширен.
Список кодов ответов:
Код | HTTP status | Расшифровка |
---|---|---|
ok | 200, 201 | Запрос выполнен успешно |
validation_error | 400 - 404 | Ресурс не изменён |
internal_error | 500 | Внутренняя ошибка сервиса, можно повторить запрос позже |
Запрос диапазонов¶
Некоторые запросы предполагают возвращение только части данных. Для таких запросов необходимо передавать специальный заголовок:
Range: items=1-100
Оба предела диапазона включаются. При отсутствии заголовка такие запросы возвращают ошибку validation_error
с HTTP-кодом 416 RequestedRangeNotSatisfiable
.
Локализация¶
В поле Description может возвращаться локализованная строка с текстом ошибки. Для этого необходимо передать заголовок Accept-Language с нужным языком. В текущей версии поддерживаются русский и английский языки. По умолчанию, если заголовок не передан или язык не найден среди доступных возвращаются ответы на английском.
Accept-Language: ru-RU
Управление адресами отправителя¶
Получение адресов отправителя¶
https://integrationapi.net/addressbook/v2/UserSettings/SourceAddresses
Метод возвращает адреса отправителя авторизованного пользователя - подтверждённые и запрошенные.
Параметры ответа - список записей.
Параметр | Тип данных | Описание |
---|---|---|
SourceAddress | string | Адрес отправителя |
State | SourceAddressState | Статус адреса отправителя: 0 - Запрошен ( |
IsDefault | bool | Флаг, указывающий является ли адрес адресом по умолчанию |
Пример ответа¶
{
"Result":[
{
"SourceAddress": "blabla@gmail.com",
"State": 1,
"IsDefault": true
},
{
"SourceAddress": "eeee@mailforspam.com",
"State": 1,
"IsDefault": false
}
],
"Code": "ok",
"Description": "ok"
}
Добавление адреса отправителя¶
POST /UserSettings/SourceAddresses
Метод отправляет запрос на добавление нового адреса отправителя. Адрес должен быть валидным email-адресом. Домен адреса должен быть подтверждён в личном кабинете.
Если запрос был успешно отправлен, возвращается код ok
и код HTTP 201
. Метод возвращает только стандартный ответ, без поля Result.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
SenderAddress | string | Адрес отправителя |
Пример запроса¶
{
"SourceAddress":"test@gmail.com"
}
Пример ответа¶
{
"Code": "ok",
"Description": "ok"
}
Удаление адреса отправителя¶
DELETE UserSettings/SourceAddresses/{SourceAddress}
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
SourceAddress | string | Адрес отправителя |
Пример ответа¶
{
"Code": "ok",
"Description": "ok"
}
Управление рассылками¶
Получение списка рассылок¶
GET /Tasks
Возвращает список рассылок.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
CreatorLogin | string | Логин создателя рассылки, задаёт фильтр (будут возвращены только те рассылки, что были созданы от имени указанного логина создателя рассылки). |
Range | ItemsRange | Диапазон |
Метод требует аутентификации с помощью BasicAuthentication Header. Список рассылок возвращается именно для того, кто авторизовался через BasicAuthentication, если только авторизованный не обладает правами админа и параметром Login не задан другой логин.
В случае, если задан CreatorLogin, в ответ попадут только те рассылки, что были созданы сублогином, заданным в CreatorLogin.
Пример ответа¶
{
"Result": [
{
"SourceName": "test",
"Price": 0.23,
"SendDuplicates": false,
"Cancellable": true,
"Deletable": false,
"NextStartDateTime": "/Date(1473417269843-0000)/",
"State": "Waiting",
"TotalContacts": 10000,
"CompletedContacts": 10000,
"ErrorCount": 0,
"IsExecuting": false,
"ServiceType": "Email",
"IsSmooth": false,
"IsPersonalized": false,
"ID": 130872,
"Name": "test",
"OwnerLogin": "test",
"Type": "Distribution",
"Groups": [],
"IncludedContacts": [],
"ExcludedContacts": [],
"ManualContacts": [],
"StopList": [],
"Text": "<p>test</p>",
"Subject": "test",
"MessageValidity": 0,
"MessageType": "Email",
"TaskMessageType": "11",
"DoTransliterate": false,
"SourceAddress": "pavel.voropaev@seedway.ru",
"StartDateTime": "/Date(1395809939517-0000)/",
"Period": "None",
"GlobalState": "Paused",
"GlobalStateInfo":{
"State": "Paused"
},
"PercentageCompleted": 100,
"MessageValidityAsTimeSpan": "1.00:00:00"
}
],
"Code": "ok",
"Description": "ok"
}
Получение рассылки¶
GET /Tasks/{TaskId}
Метод возвращает данные о рассылке.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
TaskId обязательный |
integer | ID рассылки (предаётся в url) |
Параметры ответа¶
Параметр | Тип данных | Описание |
---|---|---|
TaskId | integer | ID рассылки |
Login | string | Логин пользователя |
Name | string | Название |
Sender | EmailAddress | Отправитель - адрес и имя |
Subject | string | Тема |
Text | string | Текст |
StartDateTime | DateTime | Начало отправки в UTC-формате |
EndDateTime | DateTime | Окончание отправки в UTC-формате (для плавных рассылок) |
Type | TaskType | Тип рассылки |
UserCampaignId | string | Пользовательский ID рассылки |
Contacts | ContactDto[] | Список контактов |
ContactGroups | ContactGroupDto[] | Список групп контактов |
State | TaskState | Статус рассылки |
Price | decimal | Цена за сообщение |
CreatorLogin | string | Логин создателя рассылки (сублогин из ролевой модели) |
SendDuplicates | bool | Отправлять дубликаты или нет (по умолчанию - нет) |
SmsResendTask | SmsResendTaskDto | Данные для переотправки через SMS |
Counters | EmailTaskCounters | Количество контактов (общее, дубликаты, отписавшиеся, исключённые) |
ContactDto¶
Параметр | Тип данных | Описание |
---|---|---|
Id | long | ID контакта |
Included | bool | Включать или исключать контакт из рассылки (true или false ) |
ContactGroupDto¶
Параметр | Тип данных | Описание |
---|---|---|
Id | long | ID группы контакта |
Included | bool | Включать или исключать группу из рассылки (true или false ) |
EmailAddress¶
Параметр | Тип данных | Описание |
---|---|---|
Name | string | Имя |
Address | string | Адрес |
TaskType¶
Текст | Число | Описание |
---|---|---|
Distribution | 1 | Одноразовая рассылка |
Birthday | 2 | Рассылка по дням рождения |
SmsResendTaskDto¶
Параметр | Тип данных | Описание |
---|---|---|
ContactGroupId обязательный |
integer | Группа контактов для переотправки |
Text обязательный |
string | Текст SMS |
SenderAddress обязательный |
string | Адрес отправителя |
StartDelay обязательный |
TimeSpan | Задержка после отправки email-рассылки |
EmailTaskCounters¶
Параметр | Тип данных | Описание |
---|---|---|
TaskId | integer | ID рассылки |
TotalContacts | integer | Количество получателей |
Dublicates | integer | Количество отфильтрованных дубликатов |
Unsubscribed | integer | Количество отфильтрованных отписавшихся |
Excluded | integer | Количество отфильтрованных исключённых контактов |
OverPackage | integer | Контакты сверх пакета (на них отправки не будет) |
SpamScore | integer | Оценка спамности письма |
Пример ответа¶
{
"Result":{
"Login": "TEST",
"Name": "q",
"Sender":{
"Address": "xxx@gmail.com",
"Name": "yyy"
},
"Subject": "%Имя%",
"Text": "blablabla",
"StartDateTime": "/Date(1440501564737-0000)/",
"UserCampaignId": "",
"State": "Finished",
"Price": 10,
"Counters":{
"TotalContacts": 2,
"Duplicates": 0,
"Unsubscribed": 0,
"Excluded": 0,
"OverPackage": 0,
"SpamScore": 2.2,
"TaskId": 10500700
},
"Type": "Distribution",
"Contacts":[
{
"Id": 7907323000,
"Included": true
},
{
"Id": 8603950002,
"Included": true
}
],
"ContactGroups":[],
"CreatorLogin": "TEST",
"SendDuplicates": false,
"TaskId": 10592701
},
"Code": "ok",
"Description": "ok"
}
Создание рассылки¶
POST /Tasks
Метод создаёт рассылку. Если рассылка была успешно создана, возвращается код ok
и код HTTP 201
.
В качестве Result возвращается ID рассылки и набор счётчиков. При их расчёте учитываются только уникальные группы и контакты (из нескольких групп с одинаковыми идентификаторами учитывается только одна).
Максимальное количество получателей в одной рассылке - 2 миллиона.
Порядок вычисления счётчиков:
- дубли
- исключённые группы и контакты
- отписавшиеся
Валидируются:
- текст - на отсутствие стоп-слов и на наличие
- текст - на наличие макросов
[Unsubscribe]
и[WebVersion]
- тема - на отсутствие стоп-слов
- размер текста и темы (не более 10 МБ)
- отправитель - имя на отсутствие стоп-слов и подтверждён ли адрес
- группы контактов - на существование
- тип рассылки - допустимы только 1 (
Distribution
) и 2 (Birthday
). - логин - на существование (не актуально для внешнего API)
- шаблон - на существование
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
Name обязательный |
string | Название |
Sender обязательный |
EmailAddress | Отправитель - адрес и имя |
Subject обязательный |
string | Тема |
Text обязательный |
string | Текст |
StartDateTime | DateTime | Начало отправки в UTC формате |
EndDateTime | DateTime | Окончание отправки в UTC формате (для плавных рассылок) |
Type обязательный |
TaskType | Тип рассылки |
UserCampaignId | string | Пользовательский ID рассылки |
Contacts | ContactDto[] | Список контактов |
ContactGroups | ContactGroupDto[] | Список групп контактов |
TemplateId | string | ID шаблона |
SmsResendTask | SmsResendTaskDto | Данные для переотправки смс в случае непрочтения письма |
SendDuplicates | bool | Отправлять дубликаты или нет (по умолчанию - нет) |
ContactDto¶
Параметр | Тип данных | Описание |
---|---|---|
Id обязательный |
long | ID контакта |
Included обязательный |
bool | Включать или исключать контакт из рассылки (true или false ) |
ContactGroupDto¶
Параметр | Тип данных | Описание |
---|---|---|
Id обязательный |
long | ID контакта |
included обязательный |
bool | Включать или исключать группу из рассылки (true или false ) |
SmsResendTaskDto¶
Параметр | Тип данных | Описание |
---|---|---|
Text обязательный |
string | Текст SMS |
SenderAddress обязательный |
string | Адрес отправителя |
StartDelay обязательный |
TimeSpan | Задержка после отправки email-рассылки |
Параметры ответа¶
Параметр | Тип данных | Описание |
---|---|---|
TaskId | integer | ID рассылки |
TotalContacts | integer | Количество получателей |
Dublicates | integer | Количество отфильтрованных дубликатов |
Unsubscribed | integer | Количество отфильтрованных отписавшихся |
Excluded | integer | Количество отфильтрованных исключённых контактов |
OverPackage | integer | Контакты сверх пакета (на них отправки не будет) |
SpamScore | integer | Оценка спамности письма |
Пример запроса¶
{
"Name":"test",
"Sender":{
"Address":"xxx@gmail.com",
"Name":"yyy"
},
"Subject":"test subj",
"Body": {
"Html": "test [Unsubscribe][WebVersion]",
"PlainText": "test"
},
"StartDateTime":"08/31/2015 13:30:38",
"UserCampaignId":"",
"ContactGroups":[
{
"Id":252,
"Included":true
},
{
"Id":234,
"Included":true
}
]
}
Пример ответа¶
{
"Result":{
"TaskId": 133875,
"TotalContacts": 1,
"Dublicates": 0,
"Unsubscribed": 0,
"Excluded": 0
},
"Code": "ok",
"Description": "new task added"
}
Редактирование рассылки¶
PUT /Tasks/{TaskId}
Метод редактирования рассылки. Если рассылка была успешно отредактирована, возвращается код ok
и код HTTP 200
. Параметры запроса и ответ идентичны Tasks POST. Редактировать можно только рассылки в статусе New
. При этом все поля являются обязательными и заменяются.
Изменение статуса рассылки¶
PUT /Tasks/{TaskId}/State
Обновление статуса рассылки для остановки, возобновления, отмены, удаления. Возвращается только стандартный ответ.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
TaskId обязательный |
integer | ID рассылки (предаётся в url) |
State обязательный |
TaskState | Текстовый или числовой статус рассылки |
TaskState¶
Текст | Число | Описание | Можно ли использовать этот статус для PUT |
---|---|---|---|
New | 0 | Статус только что добавленной рассылки | Да |
Created | 1 | Создание рассылки завершено, рассылка готова к выполнению | Да |
Started | 2 | Рассылка отправляется (также используется для возобновления после остановки) | Да |
Stopped | 3 | Рассылка остановлена (с возможностью возобновления) | Да |
Canceled | 4 | Рассылка отменена (без возможности возобновления) | Да |
Finished | 5 | Оправка рассылки завершена успешно | Да |
Deleted | 6 | Рассылка удалена | Да |
Failed | 7 | При отправке рассылки произошла ошибка | Да |
Пример запроса¶
{
"State":1
}
Пример ответа¶
{
"Code": "ok",
"Description": "ok"
}
Шаблоны¶
Получение шаблона¶
GET Templates/{TemplateId}
Метод получения шаблона. В качестве результата возвращается шаблон.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
TemplateId | integer | ID рассылки (предаётся в URL) |
Параметры ответа¶
Параметр | Тип данных | Описание |
---|---|---|
TemplateId | integer | ID шаблона |
Name | string | Название |
Sender | EmailAddress | Отправитель - адрес и имя |
Subject | string | Тема |
Body | Body | Объект, который содержит HTML и PlainText письма |
UserTemplateId | string | Внешний ID |
MergeFields | array[str] | Доступные ключи для персонализации |
Пример ответа¶
{
"Result":{
"MergeFields":[],
"Name": "test",
"Sender":{},
"Body": {
"Html": "test [Unsubscribe] [WebVersion]",
"PlainText": "test message"
},
"TemplateId": 1
},
"Code": "ok",
"Description": "ok"
}
Получение списка шаблонов¶
GET Templates/
Метод получения списка шаблонов. В качестве результата возвращается шаблон.
Параметры ответа¶
Параметр | Тип данных | Описание |
---|---|---|
TemplateId | integer | ID шаблона |
Name | string | Название |
Sender | EmailAddress | Отправитель - адрес и имя |
Subject | string | Тема |
Body | Body | Объект, который содержит HTML и PlainText письма |
UserTemplateId | string | Внешний ID |
Пример ответа¶
{
"Result":[
{
"Name": "test",
"Sender":{},
"Body": {
"Html": "test [Unsubscribe] [WebVersion]",
"PlainText": "test message"
},
"TemplateId": 1
},
{
"Name": "test",
"Sender":{},
"Body": {
"Html": "test [Unsubscribe] [WebVersion]",
"PlainText": "test message"
},
"TemplateId": 2
}
],
"Code": "ok",
"Description": "ok"
}
Создание шаблона¶
POST /Templates
Метод добавляет шаблон. Если шаблон успешно добавлен, возвращается код ok
и код HTTP 201
. В качестве Result возвращается ID шаблона (int).
Валидируются:
- наличие непустого названия
- текст - на отсутствие стоп-слов и на наличие макросов
[Unsubscribe]
и[WebVersion]
- тема - на отсутствие стоп-слов
- размер текста и темы (не более 10 МБ)
- отправитель - имя на отсутствие стоп-слов и подтверждён ли адрес
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
Name обязательный |
string | Название шаблона |
Sender | EmailAddress | Отправитель - адрес и имя |
Subject | string | Тема |
Body обязательный |
Body | Объект, содержащий HTML и PlainText шаблона |
UserTemplateId | string | Внешний ID |
Пример запроса¶
{
"Name":"test",
"Sender":{
"Name":"good sender"
},
"Body": {
"Html": "test [Unsubscribe] [WebVersion]",
"PlainText": "test message"
}
}
Пример ответа¶
{
"Result": 123,
"Code": "ok",
"Description": "ok"
}
Обновление шаблона¶
PUT Templates/{TemplateId}
Метод обновления шаблона. Если шаблон был успешно обновлён, возвращается код "ok" и http код 200 и обновлённый шаблон.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
TemplateId обязательный |
integer | ID шаблона, полученный из метода Templates POST |
Name обязательный |
string | Название шаблона |
Sender | EmailAddress | Отправитель - адрес и имя |
Subject | string | Тема |
Body обязательный |
Body | Объект, содержащий HTML и PlainText шаблона |
UserTemplateId | string | Внешний ID |
Параметры ответа¶
Параметр | Тип данных | Описание |
---|---|---|
TemplateId | integer | ID шаблона |
Name | string | Название |
Sender | EmailAddress | Отправитель - адрес и имя |
Subject | string | Тема |
Body | Body | Объект, содержащий HTML и PlainText шаблона |
UserTemplateId | string | Внешний ID |
Пример запроса¶
{
"Name":"test",
"Sender":{
"Name":"good sender"
},
"Body": {
"Html": "test [Unsubscribe] [WebVersion]",
"PlainText": "test message"
}
}
Пример ответа¶
{
"Result":{
"Name":"test",
"Sender":{"Name":"good sender"},
"Body": {
"Html": "test [Unsubscribe] [WebVersion]",
"PlainText": "test message"
},
"TemplateId": 1
},
"Code": "ok",
"Description": "ok"
}
Удаление шаблонов¶
DELETE Templates/{TemplateId}
Удаление шаблона. Возвращается только стандартный ответ.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
TemplateId обязательный |
integer | ID шаблона, полученный из метода Templates POST |
Пример ответа¶
{
"Code": "ok",
"Description": "ok"
}
Статистика¶
Получение статистики¶
GET /Statistics?Login={Login}&TaskId={TaskId}&StartDateTime={StartDateTime}&EndDateTime={EndDateTime}
Получение статистики по сообщениям в виде набора счётчиков (сколько было отправлено, сколько было доставлено, сколько не было отправлено и т.д.).
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
TaskId обязательный |
integer | ID рассылки, в рамках которой были созданы сообщения, для которых необходимо вернуть статистику. |
StartDateTime обязательный |
DateTime | Дата в формате UTC, задающая начало временного диапазона, которому должны принадлежать сообщения, для которых необходимо вернуть статистику. |
EndDateTime обязательный |
DateTime | Дата в формате UTC, задающая конец временного диапазона, которому должны принадлежать сообщения, для которых необходимо вернуть статистику. |
Сервис рассчитан на получение в параметрах либо TaskId, - тогда возвращается статистика по сообщениям, отправленным в рамках рассылки с указанным IDом TaskId, - либо StartDateTime и EndDateTime, - тогда возвращается статистика по сообщениям, отправленным за временной диапазон, заданный с помощью StartDateTime и EndDateTime (даты должны быть приведены к UTC-зоне).
Пример ответа¶
{
"Result": {
"NotSent": 30,
"Sent": 0,
"Delivered": 0,
"Read": 0,
"Clicked": 0,
"Bounced": 0,
"Rejected": 0,
"Total": 30
},
"Code": "ok",
"Description": "ok"
}
Получение детализации¶
GET /Statistics/Messages?Login={Login}&TaskId={TaskId}&StartDateTime={StartDateTime}&EndDateTime={EndDateTime}&State={State}
Получение детализации по сообщениям.
Параметр | Тип данных | Описание |
---|---|---|
TaskId обязательный |
integer | ID рассылки, в рамках которой были созданы сообщения, для которых необходимо вернуть статистику. |
StartDateTime обязательный |
DateTime | Дата в формате UTC, задающая начало временного диапазона, которому должны принадлежать сообщения, для которых необходимо вернуть статистику. |
EndDateTime обязательный |
DateTime | Дата в формате UTC, задающая конец временного диапазона, которому должны принадлежать сообщения, для которых необходимо вернуть статистику. |
State | string | Выполняет роль фильтра, требует вернуть статистику по тем сообщениям, что находятся в указанном состоянии. |
Range обязательный |
ItemsRange | Диапазон |
Сервис рассчитан на получение параметров либо TaskId - тогда возвращается статистика по сообщениям, отправленным в рамках рассылки с указанным IDом TaskId, либо StartDateTime и EndDateTime - тогда возвращается статистика по сообщениям, отправленным за временной диапазон, заданный с помощью StartDateTime и EndDateTime (даты должны быть приведены к UTC-зоне), так же в заголовках необходимо передавать диапазон в формате Range: items=1-100
.
Параметр State является опциональным и может применяться в обоих из ранее описанных сценариев - тогда возвращается ранее описанная статистика по сообщениями, находящимися в указанном состоянии.
Пример ответа¶
{
"Result": [
{
"State": "NotSent",
"Price": 0,
"Id": 141471292110003601,
"DestinationEmail": "user@devinotele.com",
"LastUpdateUtc": "/Date(1485937304700-0000)/",
"CreatedDateUtc": "/Date(1485937304000-0000)/"
}
],
"Code": "ok",
"Description": "ok"
}
Отправка транзакционного сообщения¶
POST v2/messages
Метод отправляет транзакционное сообщение нескольким получателям с возможностью использования макросов. Если сообщение успешно добавлено в очередь, возвращается код ok
и код HTTP 201
. В качестве Result возвращается ID сообщения (string).
Валидируются:
- текст - на отсутствие стоп-слов (нецензурная лексика)
- тема - на отсутствие стоп-слов
- размер текста и темы (не более 10 МБ)
- отправитель - имя на отсутствие стоп-слов и подтверждён ли адрес
- получатель - имя на отсутствие стоп-слов и валидность email-адреса, также проверяется по списку отписавшихся
- шаблон - на существование
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
Sender обязательный |
array[string] | Отправитель - адрес и имя |
Recipients обязательный |
array[object] | Список получателей |
Subject обязательный |
array[string] | Тема письма |
Body обязательный |
array[string] | Тело сообщения HTML и PlainText |
TemplateId | string | ID шаблона |
UserCampaignId | string | ID рассылки в системе пользователя |
#### Recipient |
Параметр | Тип данных | Описание |
---|---|---|
MergeFields | Массив string | Пользовательские макросы вида ключ – значение. В названии макроса запрещены специальные символы |
RecipientId | string | Пользовательский ID получателя, не более 32 символов |
Address обязательный |
string | Адрес получателя |
Name | string | Имя получателя |
Пример запроса¶
{
"Sender":{
"Address": "sourceaddress@example.com",
"Name": "Test"
},
"Recipients": [
{
"MergeFields": {
"ExtField":"5 дней",
"Name": "Иван"
},
"RecipientId": "",
"Address": "ivan@example.com",
"Name": "Ivan"
}
],
"Subject": "Ув. [Name]!",
"Body": {
"Html": "Ув. [Name]! Осталось [ExtField]<br><a href=\"[Unsubscribe]\">Отписаться</a>",
"PlainText": "Ув. {ExtField}! Ждем вас завтра! [Unsubscribe]"
},
"UserCampaignId": "1234"
}
Пример ответа¶
{
"Result": [
{
"Index":0,
"Address":"ivan@example.com",
"MessageId":"Mdz0i7z1Dyp",
"Code":"ok"
}
],
"Code":"ok",
"Description":"ok"
}
Сценарии:
- Перед началом отправки необходимо подтвердить адрес отправителя
- В текст письма может быть включен макрос
[Unsubscribe]
- на его место будет подставлена ссылка на страницу отписки
Отправка транзакционного сообщения (old)¶
POST /Messages
Внимание
С выходом Email API v2 данный метод не поддерживается.
Метод отправляет транзакционное сообщение. Если сообщение успешно добавлено в очередь, возвращается код ok
и код HTTP 201
. В качестве Result возвращается ID сообщения (string).
Валидируются:
- текст - на отсутствие стоп-слов (нецензурная лексика)
- тема - на отсутствие стоп-слов
- размер текста и темы (не более 10 МБ)
- отправитель - имя на отсутствие стоп-слов и подтверждён ли адрес
- получатель - имя на отсутствие стоп-слов и валидность email-адреса, также проверяется по списку отписавшихся
- шаблон - на существование
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
Sender обязательный |
EmailAddress | Отправитель - адрес и имя |
Recipient обязательный |
EmailAddress | Получатель - адрес и имя |
Subject обязательный |
string | Тема |
Text обязательный |
string | Текст |
UserMessageId | string | ID сообщения в системе пользователя |
UserCampaignId | string | ID рассылки в системе пользователя |
TemplateId | string | ID шаблона (внешний или внутренний) |
Пример запроса¶
{
"Sender":{
"Address":"test@test.com",
"Name":"name"
},
"Recipient":{
"Address":"test@supertest.com",
"Name":"name"
},
"Subject":"test subj",
"Text":"test"
}
Пример ответа¶
{
"Result": "kaAtrHbZ72",
"Code": "ok",
"Description": "message queued to send"
}
Сценарии:
- Перед началом отправки необходимо подтвердить адрес отправителя(
"Sender": {"Address"}
) - В текст письма может быть включен макрос
[Unsubscribe]
- на его место будет подставлена ссылка на страницу отписки.
Получение статусов транзакционных сообщений¶
GET /Messages/{MessageId},{MessageId}
Метод используется для получения статусов транзакционных сообщений. Допускается передача сразу нескольких ID сообщений через запятую. Можно передавать не более 150 ID. При этом возвращаются статусы только уникальных сообщений и только сообщений доступных пользователю.
Параметры запроса¶
Параметр | Тип данных | Описание |
---|---|---|
MessageId обязательный |
string | ID сообщения (предаётся в url, можно указать несколько через запятую) |
Параметры ответа (массив для нескольких сообщений)¶
Параметр | Тип данных | Описание |
---|---|---|
MessageId | string | ID сообщения |
string | Email получателя | |
State | string | Статус сообщения |
RecipientId | string | Пользовательский ID получателя |
State¶
Значение | Описание |
---|---|
NotSent | Отправляется |
Sent | Отправлено |
Delivered | Доставлено |
Read | Прочитано |
Clicked | Переход по ссылке |
Bounced | Не удалось доставить |
Rejected | Отклонено (сообщение не было отправлено) |
Пример ответа¶
{
"Result":[
{
"MessageId": "y49EiXaPY1",
"Email": "ftw@gmail.com",
"State": "Sent"
},
{
"MessageId": "y49cjxHxxI",
"Email": "blabla@gmail.com",
"State": "NotSent"
}
],
"Code": "ok",
"Description": "ok"
}
Получение callback¶
Данный метод позволяет не обращаться к API Devino каждый раз, когда требуется получить статус доставки сообщения, а обрабатывать входящие события от платформы Devino на своем внутреннем ресурсе. Форматы коллбэков: json или XML.
Внимание
Для подключения URL для приема статусов Email-сообщений обратитесь к вашему менеджеру или напишите письмо в техническую поддержку.
Запросы производятся по следующим событиям:
- Отправлено (
Sent
) - Доставлено (
Delivered
) - Прочитано (
Opened
) - Переход по ссылке (
Clicked
) - Не удалось доставить (
Bounced
) - Отписался от рассылки (
Unsubscribed
) - Подписался на рассылки (
Subscribed
) - Жалоба (
Complained
)
Параметры запроса¶
Параметр | Тип данных | Описание | Доступен в событиях |
---|---|---|---|
messageId | string | ID сообщения | Во всех |
taskId | integer | ID рассылки | Во всех |
userMessageId | string | Клиентский ID сообщения | Во всех, кроме delivered , bounced , complained |
userCampaignId | string | Клиентский ID кампании | Во всех, кроме delivered , bounced , complained |
string | Email получателя | Во всех | |
event | Event | Событие | Во всех |
url | string | URL, по которому перешел получатель | clicked |
dateTime | string | Дата и время события | Во всех |
clientInfo | ClientInfo | Информация о получателе | opened , clicked , unsubscribed |
isHardbounce | bool | Указывает на то, является ли передаваемый статус hard bounce | По умолчанию NULL . Заполняется только в случае если поле event равен Bounced |
reason | string | Содержит причину, по которой сообщение не было принято почтовым сервером. | По умолчанию NULL . Заполняется только в случае если поле event равен Bounced |
Информация
В случае, если параметр недоступен в событии, то значение параметра будет null
.
Event¶
Значение | Описание |
---|---|
SENT | Отправлено |
DELIVERED | Доставлено |
OPENED | Прочитано |
CLICKED | Переход по ссылке |
BOUNCED | Не удалось доставить |
UNSUBSCRIBED | Получатель отписался |
SUBSCRIBED | Получатель подписался |
COMPLAINED | Получатель пожаловался |
ClientInfo¶
Значение | Описание |
---|---|
platform | Тип платформы. Например, DESKTOP |
operatingSystem | Операционная система |
browser | Браузер |
userAgent | userAgent |
ipAddress | IP-адрес |
geolocation | Геолокация |
Geolocation¶
Значение | Описание |
---|---|
country | Страна |
region | Регион |
city | Город |
В данный момент геолокация не определяется, поэтому в ближайшее время параметры country, region и city будут пустыми.
Reason¶
Значение | Описание |
---|---|
already_unsubscribed | Получатель отписан от рассылок |
bad-configuration | Некорректная конфигурация |
bad-connection | Ошибка в соединении |
bad-domain | Домен не принимает почту или не существует |
bad-mailbox | Адрес не существует, доставка не удалась |
content-related | Заблокировано из-за содержания |
inactive-mailbox | Адрес когда-то существовал, но сейчас отключен |
invalid-sender | Неправильный адрес отправителя |
message-expired | Истек срок давности доставки |
no-answer-from-host | Сервер получателя не отвечает |
other | Неизвестная ошибка |
overpackage-related | Превышение пакета |
policy-related | Не соответствует настройкам правил сервера получателя |
protocol-errors | Отклонено из-за ошибок SMTP |
quota-issues | Адрес существует, но почта не принимается, т.к. исчерпана дисковая квота |
relaying-issues | Ошибка ретрансляции |
routing-errors | Ошибка маршрутизации |
spam-related | Сообщение отвергнуто сервером получателя как спам |
virus-related | Отклонено как инфицированное |
Примеры запросов¶
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "SENT",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": null,
"operatingSystem": null,
"browser": null,
"userAgent": null,
"ipAddress": null,
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "DELIVERED",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": null,
"operatingSystem": null,
"browser": null,
"userAgent": null,
"ipAddress": null,
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "OPENED",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": "DESKTOP",
"operatingSystem": "Windows",
"browser": "Outlook",
"userAgent": "Mozilla/4.0(compatible;MSIE7.0;WindowsNT10.0;Win64;x64;Trident/7.0;.NET4.0C;.NET4.0E;.NETCLR2.0.50727;.NETCLR3.0.30729;.NETCLR3.5.30729;ASU2JS;MicrosoftOutlook16.0.9029;ms-office;MSOffice16)",
"ipAddress": "192.168.0.1",
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "CLICKED",
"url": "http://example.com",
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": "DESKTOP",
"operatingSystem": "Windows",
"browser": "Chrome",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"ipAddress": "192.168.0.1",
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "UNSUBSCRIBED",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": "DESKTOP",
"operatingSystem": "Windows",
"browser": "Chrome",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"ipAddress": "192.168.0.1",
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "SUBSCRIBED",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": "DESKTOP",
"operatingSystem": "Windows",
"browser": "Chrome",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"ipAddress": "192.168.0.1",
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "BOUNCED",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": null,
"operatingSystem": null,
"browser": null,
"userAgent": null,
"ipAddress": null,
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": true,
"reason": "bad-mailbox"
}
]
}
{
"messageEventDtos":
[
{
"messageId": "MsA29aT4zJe",
"taskId": 0,
"userMessageId": "userMessageId-1234",
"userCampaignId": "UserCampaignId-1234",
"email": "address@example.com",
"event": "COMPLAINED",
"url": null,
"dateTime": "2020-01-14T08:27:57.7377849",
"clientInfo":
{
"platform": "DESKTOP",
"operatingSystem": "Windows",
"browser": "Chrome",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"ipAddress": "192.168.0.1",
"geolocation":
{
"country": null,
"region": null,
"city": null
}
},
"isHardbounce": null,
"reason": null
}
]
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messageEventDtos>
<messageEventDto>
<messageId>MsAqJyjEjwP</messageId>
<taskId>0</taskId>
<userMessageId>UserMessageId-1234</userMessageId>
<userCampaignId>UserCampaignId-1234</userCampaignId>
<email>address@example.com</email>
<event>SENT</event>
<dateTime>2020-01-14T08:34:02.9306227</dateTime>
<clientInfo>
<geolocation/>
</clientInfo>
</messageEventDto>
</messageEventDtos>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messageEventDtos>
<messageEventDto>
<messageId>MsA247Nalun</messageId>
<taskId>0</taskId>
<userMessageId>userMessageId-1234</userMessageId>
<userCampaignId>UserCampaignId-1234</userCampaignId>
<email>address@example.com</email>
<event>BOUNCED</event>
<dateTime>2020-01-14T08:26:27.0083642</dateTime>
<clientInfo>
<geolocation/>
</clientInfo>
<isHardbounce>true</isHardbounce>
<reason>bad-mailbox</reason>
</messageEventDto>
</messageEventDtos>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messageEventDtos>
<messageEventDto>
<messageId>MsAqREbsSUB</messageId>
<taskId>0</taskId>
<userMessageId>UserMessageId-1234</userMessageId>
<userCampaignId>UserCampaignId-1234</userCampaignId>
<email>address@example.com</email>
<event>BOUNCED</event>
<dateTime>2020-01-14T08:33:12.1570284</dateTime>
<clientInfo>
<geolocation/>
</clientInfo>
<isHardbounce>false</isHardbounce>
<reason>already_unsubscribed</reason>
</messageEventDto>
</messageEventDtos>