Документация для разработчиков

.NET SDK

Пакет NuGet DashaMail. Работает на System.Net.Http.HttpClient и встроенном с .NET 5 System.Text.Json — без единого внешнего пакета.

Установкаdotnet add package DashaMail
Требования.NET 6.0+
Пространство имёнDashaMail, ресурсы — в DashaMail.Resources
Исходникиgithub.com/DashaMail/dashamail-dotnet
ЛицензияMIT

SDK нацелен на net6.0, а не netstandard2.0: только начиная с .NET 5 System.Text.Json идёт в составе рантайма без отдельного NuGet-пакета. Более старый таргет означал бы внешнюю зависимость ради JSON — этого мы как раз избегаем.

Быстрый старт #

using DashaMail;

var dashamail = new DashaMailClient("YOUR_API_KEY");

var balance = await dashamail.Account.BalanceAsync();
Console.WriteLine(balance["balance"]);

var created = await dashamail.Lists.CreateAsync("Newsletter");
await dashamail.Lists.AddMemberAsync(created["list_id"], "subscriber@example.com",
    new Dictionary<string, object> { { "merge_1", "Иван" } });

await dashamail.Transactional.SendAsync(
    "subscriber@example.com",
    "sender@yourdomain.com",
    "<p>Спасибо за подписку!</p>",
    new Dictionary<string, object> { { "subject", "Добро пожаловать" } });

Ресурсы #

DashaMailClient — фасад с одним свойством на каждый раздел API, типы — в DashaMail.Resources. Методы Task-based (суффикс Async) и возвращают DashaMailResponse (оборачивает data как Dictionary<string, object> или List<object>, перебирается через foreach) либо бросают DashaMailApiException. Необязательные параметры — завершающий Dictionary<string, object>, поскольку у API слишком много полей, чтобы у каждого был свой типизированный аргумент.

СвойствоКлассРаздел
.ListsResources.ListsАдресные базы
.SegmentsResources.SegmentsСегменты
.CampaignsResources.CampaignsРассылки, включая A/B-тесты
.AutomationsResources.AutomationsАвтоматизации
.WorkflowsResources.WorkflowsСценарии визуального конструктора
.TemplatesResources.TemplatesШаблоны
.ReportsResources.ReportsОтчёты, включая результаты A/B
.TransactionalResources.TransactionalТранзакционные письма
.AccountResources.AccountАккаунт
.DialogsResources.DialogsДиалоги
.RouterResources.RouterОбработка входящих
.ImagesResources.ImagesИзображения

Публичные типы вроде DashaMailResponse и DashaMailApiException намеренно с префиксом DashaMail — короткие имена вроде Response легко столкнутся с типами из других библиотек в вашем проекте.

Пагинация #

int start = 0;
while (true)
{
    var page = await dashamail.Lists.MembersAsync(listId,
        new Dictionary<string, object> { { "start", start }, { "limit", 100 } });
    foreach (var member in page) { /* ... */ }
    start += page.Limit ?? 0;
    if (!page.HasMore) break;
}

Ошибки #

Каждый неуспешный ответ бросает подкласс DashaMailApiException, выбранный по HTTP-статусу. У любого исключения есть ApiCode — тот же код, что в справочнике ошибок, HttpStatus и Details. Все исключения непроверяемые (RuntimeException), так что вызывающий код не обязан их объявлять.

HTTPКласс исключения
401DashaMailAuthenticationException
402DashaMailPaymentRequiredException
403DashaMailAuthorizationException
404DashaMailNotFoundException
409DashaMailConflictException
413DashaMailPayloadTooLargeException
422DashaMailValidationException
429DashaMailRateLimitException — есть RetryAfter
5xxDashaMailServerException

Если ответ вообще не пришёл (обрыв сети, таймаут) — бросается DashaMailNetworkException, отдельно от ошибок самого API.

Изображения #

// Готовый файл на диске — без ручного base64:
var result = await dashamail.Images.OptimizeFileAsync("/path/to/banner.png");

// Сырые байты в ответ вместо base64 в JSON:
var binary = await dashamail.Images.OptimizeFileBinaryAsync("/path/to/banner.png");
binary.SaveTo("/path/to/banner-optimized.png");

Полная документация — в README репозитория. Вернуться к обзору всех SDK.

DashaMail хранит и защищает ваши данные на территории Российской Федерации

Подробнее...