Вопрос или проблема
Мое требование – написать пакетную программу/задачу, которая будет отправлять электронное письмо каждые 5 минут. Она будет запрашивать базу данных SQL Server.
Моя команда работает с Microsoft, поэтому мы имеем дело с .Net Core и SQL Server.
Я предпочитаю решение, которое может работать в
- локальной инфраструктуре.
- или в облачной среде, такой как Azure или AWS.
В настоящее время я рассматриваю следующие варианты.
Консольное приложение .NET Core 1.1, которое можно запустить как запланированную задачу или разместить как веб-работу Azure.
Другие инструменты, которые могут быть использованы:
Docker, MailKit, логирующие фреймворки, такие как Serilog, NLog.
Вы можете использовать бесплатную Microsoft Visual Studio 2017 Community Edition. Она поддерживает .NET Core. Поддержка SQL Server не требуется для самой среды разработки. Вместо этого .NET Core предоставляет доступ к данным SQL Server.
Кроме того, вам не нужно много: таймер и электронная почта.
У меня есть два предложения.
Мое первое решение – использовать SQL Server Agent для выполнения хранимой процедуры в требуемые временные интервалы. Используйте sp_send_dbmail для отправки электронных писем из хранимой процедуры. Запрос к базе данных можно выполнить внутри хранимой процедуры. Это полностью осуществляется с помощью SQL Server, администратору базы данных может потребоваться настроить отправку электронных писем из SQL Server, и я должен сказать, что я не отправлял электронные письма из облачных сред баз данных.
Второе предложение – использовать PowerShell для выполнения запроса к SQL Server и отправки электронного письма. Вывод запроса можно обработать в PowerShell перед отправкой, если это необходимо. Запустите это с помощью Планировщика задач.
(редактировать) Томас упомянул использование Visual Studio. Установка SQL Server Data Tools в Visual Studio дает вам полный доступ к SQL Server.
Ответ или решение
Для выполнения вашей задачи по созданию запланированной работы, которая будет отправлять электронные письма каждые 5 минут, мы можем использовать .NET Core и SQL Server. Поскольку ваша команда работает в экосистеме Microsoft, вы можете легко интегрировать эти технологии в как развертывании на локальной инфраструктуре, так и в облачных решения, таких как Azure или AWS. Рассмотрим более подробно два возможных подхода к решению данной задачи.
Подход 1: Использование .NET Core
Шаги по реализации
-
Создание консольного приложения на .NET Core:
- С помощью Visual Studio 2017 Community Edition создайте новое консольное приложение на .NET Core.
- Убедитесь, что установлены необходимые пакеты:
MailKit
для отправки писем иMicrosoft.Data.SqlClient
для подключения к SQL Server.
-
Настройка проекта:
- Добавьте необходимые зависимости в файл
*.csproj
вашего проекта:<PackageReference Include="MailKit" Version="2.19.0" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.3" />
- Добавьте необходимые зависимости в файл
-
Написание логики отправки писем:
-
Используйте
Timer
, чтобы выполнить задачу каждые 5 минут:using System; using System.Net.Mail; using System.Threading; class Program { private static Timer _timer; private static void Main(string[] args) { _timer = new Timer(SendEmail, null, TimeSpan.Zero, TimeSpan.FromMinutes(5)); Console.ReadLine(); // предотвращает завершение приложения } private static void SendEmail(object state) { using (var client = new SmtpClient("smtp.example.com")) { client.Port = 587; client.Credentials = new NetworkCredential("username", "password"); client.EnableSsl = true; var mailMessage = new MailMessage { From = new MailAddress("from@example.com"), Subject = "Тема письма", Body = "Содержимое письма", IsBodyHtml = true, }; mailMessage.To.Add("to@example.com"); client.Send(mailMessage); // отправка письма } // Здесь добавьте код для выполнения SQL-запроса } }
-
-
Запуск приложения:
- Запустите приложение как фоновую задачу на локальном сервере или настройте Azure WebJob для выполнения приложения.
Преимущества подхода:
- Гибкость развертывания: может быть выполнено как локально, так и в облаке.
- Возможность интеграции с другими .NET библиотеками и системами.
Подход 2: Использование SQL Server Agent и хранимых процедур
Если ваша система уже включает SQL Server и вы хотите снизить объем кода и сторонних решений, можно рассмотреть использование SQL Server Agent
.
Шаги по реализации
-
Создание хранимой процедуры:
-
Создайте процедуру в SQL Server для выполнения ваших запросов и отправки писем:
CREATE PROCEDURE SendEmailProcedure AS BEGIN DECLARE @EmailBody NVARCHAR(MAX); -- Ваш SQL-запрос SELECT @EmailBody = ...; EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Ваш профиль', @recipients = 'to@example.com', @subject = 'Тема письма', @body = @EmailBody; END
-
-
Настройка SQL Server Agent:
- Создайте новый Job в SQL Server Agent, который будет запускать вашу хранимую процедуру каждые 5 минут.
-
Проверка настройки e-mail:
- Убедитесь, что
Database Mail
настроен и работает корректно. Вам может понадобиться помощь DBA для его настройки.
- Убедитесь, что
Преимущества подхода:
- Простота: минимальное количество кода вне SQL Server.
- Больше контроля и управление задачами через встроенные механизмы SQL Server.
Заключение
Оба подхода имеют свои сильные и слабые стороны. Выбор между использованием .NET Core и SQL Server Agent зависит от ваших конкретных требований к гибкости, масштабируемости и уровня контроля. Если вы хотите развивать приложение с большими возможностями, выберите .NET Core. Если же вам требуется простое и быстрое решение с минимальными затратами, используйте SQL Server Agent.