Установка
Один NuGet-пакет для .NET 8 и новее и для .NET Standard 2.0, без зависимостей на .NET 8.
Установка
Текущий выпуск: 0.0.1. В нём есть метод для каждого метода TypeScript SDK, и проверка паритета пакета ломает сборку, когда какого-то не хватает или он отправляет другой запрос.
dotnet add package OpenEmailusing 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 отправляет сообщение.
#: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-ключ рабочего пространства, который может отправлять почту и читать почтовый ящик, поэтому его место на сервере, в задании или в инструменте, который работает на вашей собственной машине. Храните ключ в переменной окружения или в секретах вашего фреймворка, но никогда в коде.