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

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

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

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

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

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

SmtpClient server = new SmtpClient("ServerAddress");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("[email protected]", "password");
server.Timeout = 5000;
server.UseDefaultCredentials = false;

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

server.Send(mail);
4b9b3361

Ответ 1

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

MailMessage msg = new MailMessage();
msg.To.Add(new MailAddress("[email protected]", "SomeOne"));
msg.From = new MailAddress("[email protected]", "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();
}

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

Ответ 2

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

Мое предположение заключается в том, что предотвращает спуфинг электронной почты с вашей учетной записью Office 365, иначе вы можете отправить ее как [email protected]

Еще одна вещь, которую нужно попробовать - проверить подлинность, заполнить третье поле доменом, например

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

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

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

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

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

Подробный ответ: с Visual Studio (VB.NET или С# не имеет значения), я сделал простую форму с кнопкой, которая создала Mail Message, аналогично выше. Затем я добавил это в 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>

Ответ 4

Вот часть примечания для некоторых, которые могут искать этот поток для ответа на эту проблему. (Не забудьте прочитать предостережения внизу, прежде чем внедрять это решение.) У меня возникли проблемы с отправкой писем для клиента, к которому у моей подписки MS Office 365 не было пользователя или домена. Я пытался подключиться к SMTP через мою учетную запись [email protected] 365, но почтовое сообщение .NET было адресовано с [email protected] Это когда у меня возникла ошибка "5.7.1 Клиент не имеет прав доступа". Чтобы исправить, класс MailMessage должен был иметь свойство Отправитель, установленное на адрес электронной почты, с которым мои предоставленные учетные данные SMTP имели разрешение в O365 на "Отправить как". Я решил использовать свой основной адрес электронной почты ([email protected]), как показано в приведенном ниже коде. Имейте в виду, что я мог использовать ЛЮБОЙ адрес электронной почты, на который у моего аккаунта O365 было разрешение "отправить как" (т.е. [email protected], [email protected] и т.д.).

using System;
using System.Net.Mail;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         using (
            MailMessage message = new MailMessage
            {
               To = { new MailAddress("[email protected]", "Recipient 1") },
               Sender = new MailAddress("[email protected]", "Me"),
               From = new MailAddress("[email protected]", "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("[email protected]", "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("[email protected]", "Pa55w0rd"),
   EnableSsl = true
};
try { smtp.Send(message); }
catch (Exception excp)
{
   Console.Write(excp.Message);
   Console.ReadKey();
}

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

Authentication-Results: spf=none (sender IP is )  
   [email protected];  
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 <[email protected]>  
Sender: Me <[email protected]>  
To: Recipient 1 <[email protected]>  

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

Me < [email protected] > от имени Client < [email protected] >

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

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

Ответ 5

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

Первым сервером является smtp.office365.com(свойство Host of smtp client), а вторым сервером является STARTTLS/smtp.office365.com(свойство TargetName клиента smtp). Другое дело - поставить значение Usedefaultcredential = false перед установкой networkcredentials.

    client.UseDefaultCredentials = False
    client.Credentials = New NetworkCredential("[email protected]", "Password")
    client.Host = "smtp.office365.com"
    client.EnableSsl = true
    client.TargetName = "STARTTLS/smtp.office365.com"
    client.Port = 587

    client.Send(mail)

Ответ 6

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

Наконец-то эта строка появилась где-то в качестве последнего средства, непосредственно перед .Send(message)

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

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

Ответ 7

Наконец, Works!

Положите 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();