Тайм-аут Amazon WorkMail. net ядро ​​SmtpClient - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь отправить стандартное сообщение электронной почты через AWS WorkMail, используя SmtpClient в. NET Core. Конфигурация очень стандартна в соответствии с документацией Amazon: https://docs.amazonaws.cn/en_us/general/latest/gr/workmail.html

  "Smtp": {
    "MailServer": "smtp.mail.eu-west-1.awsapps.com",
    "MailPort": "465",
    "SenderName": "Us us us",
    "FromAddress": "email@domain.com",
    "Username": "email@domain.com",
    "Password": "Password1$",
    "EnableSsl": "true"
  },

Параметры вводятся, и SmtpClient создается правильно, а отправка электронного письма просто:

        var mail = new MailMessage
        {
            From = new MailAddress(_smtpSettings.FromAddress, _smtpSettings.SenderName),
            SubjectEncoding = Encoding.UTF8,
            BodyEncoding = Encoding.UTF8,
            IsBodyHtml = true,
            Body = message,
            Subject = subject,
            Priority = MailPriority.High
        };
        mail.To.Add(new MailAddress(sendToEmail));

        _smtpClient.Send(mail);

К сожалению, отправка всегда завершается ошибкой из-за тайм-аута шлюза. Мы попробовали переключиться на 587 на STARTTLS и указать имя пользователя без домена (@). На отправляющем сервере установлен надлежащий сертификат SSL, а почтовый сервер - это именно тот сервер, на котором установлен smtp. Хотя это не было бы подходящим решением, я также увеличил тайм-аут до 10 секунд (хотя это не было бы решением).

Есть идеи, что может быть не так? Я уже рву волосы. Кажется, проблема с AWS WorkMail.

Ответы [ 2 ]

1 голос
/ 10 мая 2020

Просто добавление к существующему комментарию. SMTPClient на самом деле устарел / не рекомендуется, но не помечен как таковой. См. Комментарии здесь (https://github.com/dotnet/dotnet-api-docs/issues/2986#issuecomment -430805681 )

По сути, это сводится к тому, что SmtpClient не обновлялся годами и в нем отсутствуют многие функции. Команда разработчиков. NET Core хотела отметить его как устаревший, но у некоторых разработчиков есть существующие проекты с включенными «Предупреждениями как ошибками». Это мгновенно остановит сборку любого проекта, в котором используется SmtpClient с включенными предупреждениями об ошибках. Итак ... Это вроде как устарел, но не отмечен так в некоторых официальных документах.

MailKit фактически подталкивается Microsoft к тому, чтобы люди могли использовать его, когда дело доходит до электронной почты. Большое спасибо некоторым разработчикам, которые не хотят использовать стороннюю библиотеку для такой "простой" и распространенной функции. По моему личному опыту, я считаю, что Mailkit великолепен и очень прост в использовании. Краткое руководство по началу работы находится здесь: https://dotnetcoretutorials.com/2017/11/02/using-mailkit-send-receive-email-asp-net-core/

0 голосов
/ 10 мая 2020

Итак, проблема в том, что это значение по умолчанию. NET Core SmtpClient не поддерживает StartSSL (неявный SSL), который является единственным вариантом, принятым WorkMail. Видите ли, WorkMail разрешает только соединения, которые начинаются с SSL, а SmtpClient сначала запускается с незашифрованного, а затем переключается на зашифрованный, если не может подключиться. SmtpClient и, как обычно бывает с Microsoft, они не признают это проблемой. Вы можете попробовать туннелирование, а лучше просто использовать одну из доступных библиотек. К сожалению, большинство из них платные, есть AIM, но он не работает с. NET Core, и я не хотел тратить время на перенос не моей собственной библиотеки на. NET Standard, поэтому в итоге я использовал Mailkit.

Есть некоторые проблемы с библиотекой, хотя, во-первых, перед отправкой вам нужно вызвать Connect, который принимает хост и порт в качестве параметра, это означает, что вы не можете просто ввести предварительно созданный smtpclient как singleton и создать его экземпляр в месте использования. Это круто, и отсутствие интерфейса также делает его незаменимым, что может испортить ваши интеграционные тесты. Более того, вы должны сделать некрасивую строку перед вызовом send вот так:

emailClient.AuthenticationMechanisms.Remove("XOAUTH2");

Но, по крайней мере, это работает.

...