Отправка электронной почты SMTP с помощью System.Net.Mail через Exchange Online (Office 365) - PullRequest
43 голосов
/ 05 июня 2011

Мы тестируем новую бета-версию Office 365, и у меня есть учетная запись электронной почты в службе Exchange Online.Теперь я пытаюсь подключить LOB-приложение, которое может отправлять SMTP-сообщения от моей тестовой учетной записи.

Однако платформе Exchange 365 требуется шифрование TLS на порту 587, и есть «особенность» System.Net.Mail, котораяне разрешает неявное шифрование SSL.

Кому-нибудь удалось заставить C # отправлять почту через эту платформу?

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

SmtpClient server = new SmtpClient("ServerAddress");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("username@mydomain.com", "password");
server.Timeout = 5000;
server.UseDefaultCredentials = false;

MailMessage mail = new MailMessage();
mail.From = new MailAddress("recipent@anyaddress");
mail.To.Add("username@mydomain.com");
mail.Subject = "test out message sending";
mail.Body = "this is my message body";
mail.IsBodyHtml = true;

server.Send(mail);

Ответы [ 7 ]

46 голосов
/ 02 августа 2013

Исправлено несколько опечаток в рабочем коде выше:

MailMessage msg = new MailMessage();
msg.To.Add(new MailAddress("someone@somedomain.com", "SomeOne"));
msg.From = new MailAddress("you@yourdomain.com", "You");
msg.Subject = "This is a Test Mail";
msg.Body = "This is a test message using Exchange OnLine";
msg.IsBodyHtml = true;

SmtpClient client = new SmtpClient();
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("your user name", "your password");
client.Port = 587; // You can use Port 25 if 587 is blocked (mine is!)
client.Host = "smtp.office365.com";
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
try
{
    client.Send(msg);
    lblText.Text = "Message Sent Succesfully";
}
catch (Exception ex)
{
    lblText.Text = ex.ToString();
}

У меня есть два веб-приложения, использующих приведенный выше код, и оба работают нормально, без каких-либо проблем.

12 голосов
/ 13 июля 2012

Быстрый ответ: адрес FROM должен точно соответствовать учетной записи, с которой вы отправляете, иначе вы получите ошибку 5.7.1 Клиент не имеет прав для отправки в качестве этого отправителя.

Я предполагаю, что это предотвращает подделку электронной почты с вашей учетной записью Office 365, в противном случае вы можете отправить ее как sballmer@microsoft.com.

Еще одна вещь, которую нужно попробовать, - это аутентификация.третье поле с доменом, например

Dim smtpAuth = New System.Net.NetworkCredential(
    "TheDude", "hunter2password", "MicrosoftOffice365Domain.com")

Если это не сработает, дважды проверьте, что вы можете войти в учетную запись по адресу: https://portal.microsoftonline.com

Еще одна вещьОтметим, что ваше антивирусное решение может блокировать программный доступ к портам 25 и 587 в качестве решения для защиты от спама.Norton и McAfee могут молча блокировать доступ к этим портам.Только включение отладки Почты и Сокетов позволит вам заметить это (см. Ниже).

Последнее, что следует отметить, метод Send - Асинхронный .Если вы позвоните по номеру

Dispose
сразу после вызова send, вы, скорее всего, закроете соединение до того, как письмо будет отправлено.Пусть ваш экземпляр smtpClient прослушивает событие OnSendCompleted и вызывает dispose оттуда.Вместо этого вы должны использовать метод SendAsync, метод Send не вызывает это событие.

Подробный ответ: В Visual Studio (VB.NET или C # не имеет значения) я создал простую форму сКнопка, которая создала почтовое сообщение, аналогично тому, что описано выше.Затем я добавил это в application.exe.config (в каталоге bin / debug моего проекта).Это позволяет вкладке «Вывод» иметь подробную информацию об отладке.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.Net">
                <listeners>
                    <add name="System.Net" />
                </listeners>
            </source>
            <source name="System.Net.Sockets">
                <listeners>
                    <add name="System.Net" />
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="System.Net" value="Verbose" />
            <add name="System.Net.Sockets" value="Verbose" />
        </switches>
        <sharedListeners>
            <add name="System.Net"
              type="System.Diagnostics.TextWriterTraceListener"
              initializeData="System.Net.log"
            />
        </sharedListeners>
        <trace autoflush="true" />
    </system.diagnostics>
</configuration>
6 голосов
/ 01 ноября 2011

Вы видели это? Отправка электронной почты с использованием Smtp.mail.microsoftonline.com

Установка UseDefaultCredentials после установки учетных данных приведет к сбросу свойства Credentials.

5 голосов
/ 09 ноября 2015

Вот примечание для некоторых, которые могут искать в этой теме ответ на эту проблему.(Обязательно прочтите предостережения внизу, прежде чем внедрять это решение.) У меня были проблемы с отправкой электронных писем для клиента, для которого в моей подписке MS Office 365 не было пользователя или домена.Я пытался выполнить SMTP через мою учетную запись Me@MyDomain.com 365, но почтовое сообщение .NET было адресовано Client@ClientDomain.com.Это когда у меня появляется ошибка «5.7.1 Клиент не имеет разрешений».Чтобы исправить ситуацию, классу MailMessage необходимо было задать для свойства Отправитель адрес электронной почты, для которого мои предоставленные учетные данные SMTP имели разрешение в O365 «Отправить как».Я решил использовать адрес своей основной учетной записи (Me@MyDomain.com), как показано в коде ниже.Имейте в виду, что я мог использовать ЛЮБОЙ адрес электронной почты, на который у моей учетной записи O365 было разрешение «отправить как» (т.е. Support@MyDomain.com, no-reply@MyDomain.com и т. Д.)

using System;
using System.Net.Mail;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         using (
            MailMessage message = new MailMessage
            {
               To = { new MailAddress("Recipient1@Recipient1Domain.com", "Recipient 1") },
               Sender = new MailAddress("Me@MyDomain.com", "Me"),
               From = new MailAddress("Client@ClientDomain.com", "Client"),
               Subject=".net Testing"
               Body="Testing .net emailing",
               IsBodyHtml=true,
            }
         )
         {
            using (
               SmtpClient smtp = new SmtpClient
               {
                  Host = "smtp.office365.com",
                  Port = 587,
                  Credentials = new System.Net.NetworkCredential("Me@MyDomain.com", "Pa55w0rd"),
                  EnableSsl = true
               }
            )
            {
               try { smtp.Send(message); }
               catch (Exception excp)
               {
                  Console.Write(excp.Message);
                  Console.ReadKey();
               }
            }
         }
      }
   }
}

Обратите внимание, что SmtpClient предназначен только для одноразового использования и может использовать блок Using в .NET Framework 4
Пользователи .NET Framework 2 до 3.5 должны использовать SmtpClient как таковой ...

SmtpClient smtp = new SmtpClient
{
   Host = "smtp.office365.com",
   Port = 587,
   Credentials = new System.Net.NetworkCredential("Me@MyDomain.com", "Pa55w0rd"),
   EnableSsl = true
};
try { smtp.Send(message); }
catch (Exception excp)
{
   Console.Write(excp.Message);
   Console.ReadKey();
}

Заголовок полученного электронного письма будет выглядеть примерно так:

Authentication-Results: spf=none (sender IP is )  
   smtp.mailfrom=Me@MyDomain.com;  
Received: from MyPC (192.168.1.1) by  
   BLUPR13MB0036.namprd13.prod.outlook.com (10.161.123.150) with Microsoft SMTP  
   Server (TLS) id 15.1.318.9; Mon, 9 Nov 2015 16:06:58 +0000  
MIME-Version: 1.0  
From: Client <Client@ClientDomain.com>  
Sender: Me <Me@MyDomain.com>  
To: Recipient 1 <Recipient1@Recipient1Domain.com>  

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

Meот имени Клиента

Однако, поскольку почтовый клиент, который использует получатель, не является полным мусором, это не должно влиять на адрес ответа.Для ответа по-прежнему следует использовать адрес отправителя.Чтобы покрыть все ваши базы, вы также можете использовать свойство MailMessage.ReplyToList, чтобы предоставить клиенту любую возможность использовать правильный адрес ответа.

Также следует помнить, что некоторые почтовые серверы могут категорически отвергать любые электронные письма, отправленные от имени другой компании, которая размещает ограничения политики владельца домена.Обязательно тщательно проверьте и поищите любые отскок назад.Я могу сказать вам, что моя личная учетная запись электронной почты Hotmail (mail.live.com) будет отклонять сообщения, которые я отправляю от имени определенного моего клиента, но другие клиенты проходят нормально.Хотя я подозреваю, что это как-то связано с записями TXT «spf1» домена моего клиента, у меня нет ответа на вопрос, почему он будет отклонять электронные письма, отправленные от имени одного домена, по сравнению с другим.Может быть, кто-то, кто знает, может пролить свет на эту тему?

4 голосов
/ 24 июля 2015

Office 365 использует два сервера, SMTP-сервер и защищенный расширенный сервер.

Первый сервер - smtp.office365.com (свойство Host клиента smtp), а второй сервер - STARTTLS / smtp.office365.com (свойство TargetName клиента smtp). Еще одна вещь должна поставить Usedefaultcredential = false перед установкой networkcredentials.

    client.UseDefaultCredentials = False
    client.Credentials = New NetworkCredential("user@domain.com", "Password")
    client.Host = "smtp.office365.com"
    client.EnableSsl = true
    client.TargetName = "STARTTLS/smtp.office365.com"
    client.Port = 587

    client.Send(mail)
2 голосов
/ 12 июня 2014

Я перенес код c #, используемый для работы с smtp.google.com:587, чтобы работать через office365 без успеха. Пробовал все комбинации Credential до / после использования Ssl и почти все рекомендации, сделанные в Интернете - без успеха (ошибка 5.7.1 ....).

Наконец получил эту строку откуда-то в крайнем случае, как раз перед .Send (сообщение)

smtpClient.TargetName = "STARTTLS/smtp.office365.com";

С тех пор каждый send () имеет большой успех.

1 голос
/ 28 ноября 2012

Наконец-то, работает!

Положить smtpClient.UseDefaultCredentials = false; после smtpClient.Credentials = credentials; тогда проблема решена!

            SmtpClient smtpClient = new SmtpClient(smtpServerName);                          
            System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(smtpUName, smtpUNamePwd);

            smtpClient.Credentials = credentials;
            smtpClient.UseDefaultCredentials = false;  <-- Set This Line After Credentials

            smtpClient.Send(mailMsg);
            smtpClient = null;
            mailMsg.Dispose();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...