Лучше отправлять электронную почту с помощью.net или триггера в таблице SQL

70
6

У нас есть этот модуль, где пользователь может зарегистрироваться, и ему нужно подтвердить свой адрес электронной почты.

В настоящее время я использовал.NET для отправки электронной почты. Поэтому после добавления записи я теперь вызову свой метод электронной почты. Но я заметил, что есть моменты, когда функция электронной почты получает ошибку тайм-аута, и поскольку я улавливаю все исключения, эта ошибка предоставляется пользователю.

Я хотел бы отправить электронное письмо на задний план. Если есть время ожидания пересылки почты, метод электронной почты будет просто повторять отправку сообщения по электронной почте, возможно, через минуту или две. И я думаю об использовании SQL-почты для этого. Но я не уверен, что это лучшее решение.

спросил(а) 2020-04-04T00:24:08+03:00 6 месяцев, 3 недели назад
1
Решение
92

У вас есть несколько вариантов:

Используйте SQL Server Database Mail, чтобы выполнять тяжелую работу вокруг очереди и отправки по электронной почте. Приложение все равно будет отвечать за построение сообщения и отправку его в базу данных. Реле через отдельный SMTP-сервер (установка SMTP-сервисов непосредственно на машине SQL, вероятно, не очень хорошая идея).

Используйте методы async электронной почты из своего веб-приложения, например SmtpMail.SendAsync(). Это позволит вам обрабатывать ошибки, не задерживая пользователя (или взаимодействуя с пользователем), но это не долговечно. Если ваш веб-процесс перезагрузится, операция будет потеряна.

Используйте службу Windows. Это будет простое отдельное приложение, которое просто контролирует базу данных для новых задач электронной почты и/или отправляет сообщение из веб-приложения, что задача должна быть выполнена.

Вариант № 2 с использованием SendAsync() будет самым быстрым для реализации. В зависимости от ваших потребностей этого может быть достаточно.

Вариант № 1 не требует больших усилий. Вариант №3 действительно сияет, когда вам нужно реализовать сложную бизнес-логику вокруг списка получателей и содержимого электронной почты. Также возможно комбинировать варианты # 1 и № 3 (см. Разговор между @RemusRusanu и мной в комментариях).

Как с параметрами # 1, так и С# 3, если среда опускается, перезапуск службы или возникновение ошибки, вы не потеряете какие-либо данные или не смогли отправить электронное письмо.

ответил(а) 2020-04-04T00:43:03.043603+03:00 6 месяцев, 3 недели назад
41

Скорее управляйте тайм-аутом в приложении.net. Если в триггере есть проблема или тайм-аут, ваши данные могут быть не совершены. Скорее позвольте БД завершить транзакцию данных и проверить состояние из вашего.net-приложения.

Я не думаю, что есть окончательный ответ на этот вопрос, но это было бы моим преимуществом.

ответил(а) 2020-04-04T00:24:08+03:00 6 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема