Отправка электронной почты с помощью Smtp.mail.microsoftonline.com - PullRequest
11 голосов
/ 12 июля 2011

Контекст:

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

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


Цель:

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

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

В соответствии с документацией нам нужно использовать порт (587) и убедиться, что транспортный уровень безопасности (TLS) включен. Кроме того, используемый адрес FROM должен относиться к типу «Официальный», который используется при двойной проверке через Центр администрирования Microsoft Online


Код:

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

SmtpClient server = new SmtpClient("Smtp.mail.microsoftonline.com");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("xxx@domain.com", "123abc");
server.UseDefaultCredentials = false;

MailMessage mail = new MailMessage();
mail.From = new MailAddress("xxx@domain.com");
mail.To.Add("johndoe@domain.com");
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 и использовать другой? Такие как Gmail? Если так ... то зачем платить ежемесячную плату за MOS?

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

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



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

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

//server.UseDefaultCredentials = false;

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 10 августа 2011

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

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

3 голосов
/ 12 июля 2011

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

      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

0 голосов
/ 28 мая 2014

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

И

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

0 голосов
/ 12 июля 2011

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

mail.From = new MailAddress("xxx@domain.com");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...