Подтвердить что ты не робот

Отправка электронной почты с помощью Smtp.mail.microsoftonline.com

Контекст:

У нас была небольшая компания, в которой не было Exchange Server (или кого-то, кто бы ему выделил), но нам все равно нужно было отправлять/отправлять электронные письма.

Мы решили использовать Microsoft Online Services (MOS)


Цель:

У нас есть веб-сервер (Windows Server 2003 R2 с IIS 6.0) и мы развернули приложение MCV на С# ASP.Net.

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

Согласно документации нам нужно использовать порт (587) и убедиться, что транспортный уровень безопасности (TLS) включен. Кроме того, используемый адрес FROM должен относиться к типу "Достоверный", как это происходит при двойной проверке через Центр онлайн-администрирования Microsoft


Код:

Код С#, который у меня есть, должен быть тривиальным:

SmtpClient server = new SmtpClient("Smtp.mail.microsoftonline.com");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("[email protected]", "123abc");
server.UseDefaultCredentials = false;

MailMessage mail = new MailMessage();
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");
mail.Subject = "test subject";
mail.Body = "this is my message body";
mail.IsBodyHtml = true;

try
{
    server.Send(mail);
}
catch (Exception ex)
{
    throw ex;
}

Ошибка:

Я создал простое приложение winform с приведенным выше кодом для проверки отправки электронных писем... Я тестировал приложение winform локально на моем компьютере (Windows XP) и на сервере.

В обеих попытках я получаю следующее сообщение об ошибке:

SMTP-сервер требует безопасного соединения, или клиент не был аутентифицирован. Ответ сервера: 5.7.1 Клиент не прошел проверку подлинности.

После того, как я некоторое время гуглил, я все еще не нашел причину, по которой... Кроме того, большинство ответов, которые я нашел, содержат ссылку на консоль управления Exchange, которую мы, похоже, не имеем (или не установили), поэтому мы используете Microsoft Online Services...


Вопросы:

1) Как платящий клиент MOS, я понимаю, что мне не нужно устанавливать (или иметь) консоль управления Exchange на нашем сервере… на самом деле, это не должно иметь никакого значения для достижения моей задачи.

2) Я также пытался включить TLS в нашем IIS 6.0, но безрезультатно...

3) Мы цепляемся за соломинку, потому что то, что мы делаем, выглядит как-то поразительно тривиально…

4) Должны ли мы просто отказаться от идеи использования SMTP-сервера MOS и использовать другой? Такие как Gmails? Если так... то зачем платить ежемесячную плату за MOS?

Если у кого-нибудь есть помощь или совет, которые могут помочь мне пролить свет на это, это было бы здорово!

С уважением Винс



ВАУ... Я думаю, что мы нашли виновника!!!

Комментируя эту строку кода:

//server.UseDefaultCredentials = false;

Все заработало!

Теперь я могу отправлять электронные письма внутри и за пределами нашего домена...

Больше всего меня озадачивает то, что, согласно документации, значение этого свойства UseDefaultCredentials по умолчанию установлено в false

.Итак… когда я вручную устанавливаю значение false, оно не работает, но когда я комментирую строку (которая также устанавливает значение false из-за значения по умолчанию), оно работает!

Если это известная проблема или у кого-то есть ответ на этот вопрос, мне было бы интересно узнать!

4b9b3361

Ответ 1

В режиме Reflector on UseDefaultCredentials вы также увидите, что он также изменяет значение trasnport.Credentials, поэтому, когда вы вызвали это свойство с ложным значением, он изменил учетные данные транспорта на null. проблема в том, что вы вызвали это свойство после установки учетных данных в строке до этого, он аннулировал учетные данные.

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

Ответ 2

вы можете попробовать этот образец

      private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        try
        {
            MailMessage myMessage = new MailMessage();
            SmtpClient myClient = new SmtpClient("yourserver");
            myClient.Port = "587";
            myClient.Host = "your server";
            myClient.UseDefaultCredentials = false;
            myClient.Credentials = new System.Net.NetworkCredential("username", "password");


            myMessage.From = new MailAddress("sender");
            myMessage.To.Add("recipient");
            myMessage.Subject = "Subject email";
            myMessage.Body = "body email";
            myClient.EnableSsl = true;
            myClient.Send(myMessage);
        }

        catch (Exepiton ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }

Bye

Ответ 3

5.7.1 не является проблемой аутентификации, а проблемой реле. Чтобы кто-либо не мог использовать ваш сервер (или учетную запись, в зависимости от ситуации), smtp-сервер настроен только на то, чтобы разрешать почту пользователям вне вашего домена, если он отправляется с авторизируемого адреса. Убедитесь, что адрес, который вы указали здесь.

mail.From = new MailAddress("[email protected]");

совпадает с тем, который вы аутентифицируете как. Кроме того, убедитесь, что домен указанного адреса указан в списке разрешенных доменов.

Ответ 4

Что сработало для меня, так это то, что предлагал отправить SMTP-письмо с помощью System.Net.Mail через Exchange Online (Office 365), об изменении электронной почты "из", чтобы быть таким же, как логин для stmp-адреса

И

сделав то, что предложил Винс в конце Отправка электронной почты с помощью Smtp.mail.microsoftonline.com для комментирования "smtpClient.UseDefaultCredentials = false;"

Ответ 5

Обязательно дважды проверьте правильность вашего имени пользователя. Он не обязательно совпадает с вашим адресом электронной почты. Например, адрес отправителя может быть "[email protected]", но имя пользователя может быть "mail-svc @yourdomain.onmicrosoft.com", в зависимости от того, какие у вас настройки и интеграция с Azure Active Directory и т.д.