webentwicklung-frage-antwort-db.com.de

SMTP-E-Mail mit System.Net.Mail über Exchange Online (Office 365) senden

Wir testen die neue Beta-Version von Office 365, und ich habe ein E-Mail-Konto beim Exchange Online-Dienst. Jetzt versuche ich, eine LOB-Anwendung zu verbinden, die SMTP-E-Mails von meinem Testkonto senden kann.

Die Exchange 365-Plattform erfordert jedoch eine TLS-Verschlüsselung an Port 587, und es gibt eine 'Funktion' von System.Net.Mail das implizite SSL-Verschlüsselung nicht zulässt.

Hat es jemand geschafft, C # dazu zu bringen, E-Mails über diese Plattform zu senden?

Ich habe den folgenden Basiscode, der die E-Mail senden soll - für Ratschläge wäre ich dankbar.

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);
43
Adam Stewart

Einige Tippfehler im obigen Arbeitscode wurden behoben:

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();
}

Ich habe zwei Webanwendungen, die den obigen Code verwenden, und beide funktionieren problemlos.

46
Sanjeev

Schnelle Antwort: Die FROM-Adresse muss genau mit dem Konto übereinstimmen, von dem aus Sie senden. Andernfalls wird eine Fehlermeldung angezeigt. 5.7.1 Der Client hat keine Berechtigung zum Senden als dieser Absender.

Ich vermute, dass E-Mail-Spoofing mit Ihrem Office 365-Konto verhindert wird, andernfalls können Sie möglicherweise eine E-Mail an [email protected] senden.

Eine andere Sache zu versuchen, ist in der Authentifizierung, füllen Sie das dritte Feld mit der Domain, wie

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

Wenn dies nicht funktioniert, überprüfen Sie, ob Sie sich unter folgender Adresse bei Ihrem Konto anmelden können: https://portal.microsoftonline.com

Beachten Sie außerdem, dass Ihre Antivirus-Lösung möglicherweise den programmgesteuerten Zugriff auf die Ports 25 und 587 als Antispam-Lösung blockiert. Norton und McAfee blockieren möglicherweise unbeaufsichtigt den Zugriff auf diese Ports. Nur wenn Sie das Mail- und Socket-Debugging aktivieren, werden Sie es bemerken (siehe unten).

Eine letzte Sache zu beachten, die Senden Methode ist Asynchron. Wenn Sie anrufen

Entsorgen

Detaillierte Antwort: Mit Visual Studio (VB.NET oder C # spielt keine Rolle) habe ich ein einfaches Formular mit einer Schaltfläche erstellt, mit der die E-Mail-Nachricht erstellt wurde, ähnlich wie oben. Dann habe ich dies zur application.exe.config hinzugefügt (im bin/debug-Verzeichnis meines Projekts). Dadurch kann die Registerkarte Ausgabe detaillierte Debug-Informationen enthalten.

<?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>
12
The Dude

Hier ist eine Randnotiz für einige, die diesen Thread nach einer Antwort auf dieses Problem durchsuchen. (Lesen Sie unbedingt die Vorsichtsmaßnahmen unten, bevor Sie diese Lösung implementieren.) Ich hatte Probleme beim Senden von E-Mails für einen Client, für den mein MS Office 365-Abonnement keinen Benutzer oder keine Domäne hatte. Ich habe versucht, über mein [email protected] 365-Konto SMTP zu verwenden, aber die .NET-E-Mail-Nachricht wurde von aus adressiert. [email protected] . In diesem Fall ist der Fehler "5.7.1 Client hat keine Berechtigungen" für mich aufgetreten. Um Abhilfe zu schaffen, musste für die MailMessage -Klasse die Sender -Eigenschaft auf eine E-Mail-Adresse festgelegt sein, für die meine angegebenen SMTP-Anmeldeinformationen in O365 die Berechtigung "Senden als" hatten. Ich habe die E-Mail-Adresse meines Hauptkontos ( [email protected] ) wie im folgenden Code angegeben verwendet. Denken Sie daran, ich hätte JEDE E-Mail-Adresse verwenden können, unter der mein O365-Konto die Berechtigung zum "Senden als" hatte (d. H. [email protected], [email protected] usw.).

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();
               }
            }
         }
      }
   }
}

Bitte beachten Sie, dass SmtpClient nur verfügbar ist und den Using-Block in .NET Framework 4 verwenden kann
Benutzer von .NET Framework 2 bis 3.5 sollten SmtpClient als solches verwenden ...

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();
}

Der Header der resultierenden E-Mail sieht ungefähr so ​​aus:

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]>  

- Sei vorsichtig -
Beachten Sie, dass einige E-Mail-Clients die Absenderadresse möglicherweise als Notiz anzeigen. Beispielsweise zeigt Outlook in der Kopfzeile des Lesebereichs Folgendes an:

Ich <[email protected]> im Namen des Kunden <[email protected]>

Solange der E-Mail-Client, den der Empfänger verwendet, kein vollständiger Papierkorb ist, sollte sich dies jedoch nicht auf die Antwortadresse auswirken. "Antworten an" sollte weiterhin die Absenderadresse verwenden. Um alle Ihre Grundlagen abzudecken, können Sie auch die MailMessage.ReplyToList-Eigenschaft verwenden, um dem Client die Möglichkeit zu geben, die richtige Antwortadresse zu verwenden.

Beachten Sie auch, dass einige E-Mail-Server möglicherweise E-Mails ablehnen, die im Namen eines anderen Unternehmens gesendet werden, das Richtlinieneinschränkungen für Domaininhaber aufstellt. Testen Sie das Gerät sorgfältig und achten Sie auf mögliche Rückschläge. Ich kann Ihnen sagen, dass mein persönliches Hotmail-E-Mail-Konto (mail.live.com) Nachrichten ablehnt, die ich für einen bestimmten Kunden von mir sende, andere Kunden jedoch in Ordnung sind. Obwohl ich vermute, dass dies etwas mit den Domain TXT "spf1" -Datensätzen meines Kunden zu tun hat, weiß ich nicht, warum E-Mails abgelehnt werden, die für eine Domain im Vergleich zu einer anderen Domain gesendet wurden. Vielleicht kann jemand, der es weiß, Licht ins Dunkel bringen?

6
ShaneLS

Hast du das gesehen? Senden einer E-Mail über Smtp.mail.microsoftonline.com

Durch das Festlegen der UseDefaultCredentials nach dem Festlegen der Credentials wird Ihre Credentials-Eigenschaft zurückgesetzt.

6
Phil Sayers

Office 365 verwendet zwei Server, einen SMTP-Server und einen erweiterten Server.

Der erste Server ist smtp.office365.com (Eigenschaft Host des smtp-Clients) und der zweite Server ist STARTTLS/smtp.office365.com (Eigenschaft TargetName des smtp-Clients). Eine andere Sache ist, Usedefaultcredential = false zu setzen, bevor Networkcredentials gesetzt werden.

    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)
4

Ich habe C # -Code portiert, der für die Arbeit mit smtp.google.com:587 verwendet wurde, um ohne Erfolg über office365 zu arbeiten. Versucht alle Kombinationen von Credential vor/nach der Verwendung von SSL und fast jede Empfehlung im Internet - ohne Erfolg (bekam 5.7.1 .... Fehler).

Endlich diese Zeile von irgendwoher als letztes Mittel bekommen, kurz bevor .Send (message)

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

Seitdem ist jeder send () ein großer Erfolg.

3
Joe Frank

Endlich funktioniert!

Stellen smtpClient.UseDefaultCredentials = false; nach smtpClient.Credentials = credentials; dann Problem behoben!

            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();
1
Yeong