Comments 16
Как всегда привязка к Asp .Net приложению цветет и пахнет.... А если убрать эту привязку то вполне можно обойтись 1 сущностью для работы с e-mail, которую кстати очень удобно будет интегрировать в DI контейнер 🙂
Да это тоже вариант, но задача - сделать микросервис который работает с Rabbit и на него ещё накручу пару функций своих, поэтому .Net.
У меня на проекте примерно такой же, только с разными провайдерами работает, в том числе Mailchimp, и нет контроллеров, только потребляет сообщения из очереди.
Для запуска приложения, исходные данные берутся из файлов
appsettings.Development.json
иappsettings.json
. Эти файлы содержат конфигурационные значения, такие как настройки почты, которые используются для настройки приложения. В файлеappsettings.Development.json
содержатся значения, применяемые во время разработки, в то время какappsettings.json
содержит значения для других окружений, таких как продакшн
Ну вообще не совсем так.
Конфигурацию строит специальный билдер, она собирается в следующем порядке:
1.appsetting.json
2.appsetting.{ТЕКУЩЕЕ ОКРУЖЕНИЕ}.json
3.переменные окружения
Исходя из порядка по умолчанию appsetting.{ТЕКУЩЕЕ ОКРУЖЕНИЕ}.json переопределяет или создаёт конфигурационную секцию, которая будет использоваться только в текущем окружении, a appsetting.json содержит общую конфигурацию, которая будет использоваться в любом окружении.
Как рекомендация, данные, которые могут быть скомпрометированы (здесь это логин и пароль от смтп-клиента) лучше хранить именно в переменных окружения, чтобы усложнить их учетку к третьим лицам.
П.С.
Тэстовые данные для отправки
Мои глаза истекли кровью, на этом предложении)))
Спасибо за комментарий!
Почему проект называется в lowerCamelCase?
using (var client = new SmtpClient())
, а потомclient.Dispose();
, а зачем Dispose?Давно уже существует конструкция
using var
, имхо, но для глаза приятнее
Какие-то магические Bcc и Cc в конструкторе, что они означают? (если комментарии в полном коде у конструктора есть, то вопрос отпадает)
Не придирка, а просто вопросы:
не пробовали все файлы настроек складывать в отдельную папку? Имхо, но мне показалось это в разы удобнее, чем когда они находятся в корне.
не пробовали разделение настроек, чтобы не все в appsettings.json складывать? я обычно такие вещи разбиваю на логические куски, например: SerilogSettings.json (настройки для Serilog'a), MongoSettings.json (настройки для MongoDB), etc. В вашем примере хорошо (ИМХО!!!) подошло разделение конфига: appsettings.json, mailsettings.json
спасибо за клёвый комментарий!
...вот я вижу у вас в коде UseAuthorization
. А зачем? У вас есть авторизация? На чем она основана?
Или вот зачем вам сваггер?
Пожалуйста, обратите внимание, что все поля с адресами электронной почты (to, bcc, cc, from) должны быть заполнены при отправке письма. В противном случае, сервер может вернуть ошибку 500.
А почему 500, если это совершенно банальная ошибка валидации входных данных?
...или вот у вас есть настройка:
различные свойства, такие как [...] UseOAuth, которые позволяют задать соответствующие параметры для подключения и аутентификации к почтовому серверу Яндекса.
И я такой: хм, интересно, как у вас там OAuth сделан. А потом выясняется, что настройка-то нигде не используется, зато:
client.AuthenticationMechanisms.Remove("XOAUTH2");
А пароль при этом, небось, лежит в плейнтексте, потому что работы с секретами я у вас тоже не вижу.
Грустно это всё.
Метод MailService.SendAsync
нарушает сразу два принципа - "Single Responsibility" и "Dependency Inversion". Он делает сразу две вещи - создает MimeMessage
из MailData
и отправляет его в SmtpClient
, и делает это обращаясь к нему напрямую (new SmtpClient()
), а не через абстракцию. На практике результатом будет то, что, например, невозможно будет оттестировать создание MimeMessage
не отправляя при этом его в "настоящий" SMTP.
Микросервис отправки писем через smtp Yandex .Net Web Api MailKit