Перейти к документации
C#

Установка

Один NuGet-пакет для .NET 8 и новее и для .NET Standard 2.0, без зависимостей на .NET 8.

Установка

Текущий выпуск: 0.0.1. В нём есть метод для каждого метода TypeScript SDK, и проверка паритета пакета ломает сборку, когда какого-то не хватает или он отправляет другой запрос.

dotnet add package OpenEmail
Program.cs
using OpenEmail; var client = new OpenEmailClient(); var sent = await client.Emails.SendAsync(new Body{    ["from"] = "Acme Billing <[email protected]>",    ["to"] = "[email protected]",    ["subject"] = "Your September invoice",    ["html"] = "<p>Invoice attached.</p>",}); Console.WriteLine($"{sent["id"]} {sent["status"]}");

new OpenEmailClient() читает ключ из OPENEMAIL_API_KEY, поэтому в коде нет учётных данных. Передайте new OpenEmailOptions { ApiKey = ... }, если ваша конфигурация хранится в другом месте. Отсутствующий или неверно составленный ключ вызывает ArgumentException при создании клиента, до того как что-либо отправлено.

Тело запроса представляет собой Body или любой IReadOnlyDictionary<string, object?>, ключи которого сохраняют имена API, поэтому scheduledAt пишется здесь так же, как в справочнике API. Ответ представляет собой JsonObject из System.Text.Json.Nodes, который читается через sent["id"].

То, что SendAsync вернул результат, не значит, что сообщение ушло. Запланированная или отменяемая отправка возвращается со статусом queued или scheduled и завершается позже. Читайте status, а не сам факт возврата из вызова.

Попробуйте в одном файле

На .NET 10 один файл запускается без проекта. Строка #:package загружает пакет, а dotnet run send.cs отправляет сообщение.

send.cs
#:package OpenEmail@* using OpenEmail; var client = new OpenEmailClient(); var sent = await client.Emails.SendAsync(new Body{    ["from"] = "[email protected]",    ["to"] = "[email protected]",    ["subject"] = "Sent from one file",    ["text"] = "No project was needed.",}); Console.WriteLine(sent["id"]);

Где он работает

Пакет нацелен на net8.0 и netstandard2.0. На .NET 8 и новее у него нет зависимостей, и его можно безопасно обрезать и компилировать заранее. На .NET Standard 2.0 он подключает System.Text.Json и Microsoft.Bcl.AsyncInterfaces. Клиентом можно безопасно пользоваться из многих потоков сразу: создайте один при запуске программы и используйте его везде.

Клиент несёт API-ключ рабочего пространства, который может отправлять почту и читать почтовый ящик, поэтому его место на сервере, в задании или в инструменте, который работает на вашей собственной машине. Храните ключ в переменной окружения или в секретах вашего фреймворка, но никогда в коде.