web-dev-qa-db-fra.com

Envoyer un courrier électronique SMTP à l'aide de System.Net.Mail via Exchange Online (Office 365)

Nous testons la nouvelle version bêta d'Office 365 et j'ai un compte de messagerie sur le service Exchange Online. Maintenant, j'essaie de connecter une application métier capable d'envoyer des emails smtp à partir de mon compte test.

Toutefois, la plate-forme Exchange 365 requiert le cryptage TLS sur le port 587 et une "fonctionnalité" de System.Net.Mail qui n'autorise pas le chiffrement SSL implicite.

Quelqu'un a-t-il réussi à obtenir que C # envoie des mails via cette plate-forme?

J'ai le code de base suivant qui devrait envoyer le courrier - tout conseil serait apprécié.

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("recipent@anyaddress");
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

Correction de quelques fautes de frappe dans le code de travail ci-dessus:

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

J'ai deux applications Web utilisant le code ci-dessus et les deux fonctionnent bien sans aucun problème.

46
Sanjeev

Réponse rapide: l'adresse FROM doit correspondre exactement au compte à partir duquel vous envoyez, sinon vous obtiendrez une erreur. 5.7.1 Le client ne dispose pas des autorisations nécessaires pour envoyer cet expéditeur.

À mon avis, cela évite l’usurpation d’e-mails avec votre compte Office 365, sinon vous pourrez peut-être envoyer en tant que [email protected].

Une autre chose à essayer est dans l'authentification, remplissez le troisième champ avec le domaine, comme

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

Si cela ne fonctionne pas, vérifiez que vous pouvez vous connecter au compte à l'adresse suivante: https://portal.microsoftonline.com

Une autre chose à noter est que votre solution antivirus bloque peut-être l'accès par programme aux ports 25 et 587 en tant que solution anti-spam. Norton et McAfee peuvent bloquer en silence l’accès à ces ports. Activer uniquement le débogage Mail et Socket vous permettra de le remarquer (voir ci-dessous).

Une dernière chose à noter, le Envoyer la méthode est Asynchrone. Si vous appelez

Disposer

Réponse détaillée: Avec Visual Studio (VB.NET ou C # importent peu), j’ai créé un formulaire simple avec un bouton créant le message électronique, semblable à celui ci-dessus. Ensuite, j'ai ajouté ceci à application.exe.config (dans le répertoire bin/debug de mon projet). Cela permet à l’onglet Sortie d’avoir des informations de débogage détaillées.

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

Voici une note pour certains qui pourraient rechercher dans ce fil une réponse à ce problème. (Assurez-vous de lire les avertissements au bas avant de mettre en œuvre cette solution.) Je ne parvenais pas à envoyer des courriels à un client pour lequel mon abonnement MS Office 365 n'avait pas d'utilisateur ni de domaine. J'essayais de SMTP via mon [email protected] 365 mais le message électronique .NET était adressé à partir de [email protected] . C’est à ce moment que l’erreur "Le client 5.7.1 n’a pas d’autorisations" s’est affichée pour moi. Pour remédier à cela, la classe MailMessage avait besoin que la propriété Sender soit définie sur une adresse électronique dont les informations d'identification SMTP fournies étaient autorisées dans O365 à "Envoyer en tant que". J'ai choisi d'utiliser l'adresse électronique de mon compte principal ( [email protected] ) comme indiqué dans le code ci-dessous. N'oubliez pas que j'aurais pu utiliser N'IMPORTE QUELLE adresse e-mail que mon compte O365 était autorisé à "envoyer en tant que" (c'est-à-dire [email protected], [email protected], etc.).

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

Veuillez noter que SmtpClient est uniquement disponible et peut utiliser le bloc Using dans .NET Framework 4
Les utilisateurs de .NET Framework 2 à 3.5 doivent utiliser SmtpClient en tant que tels ...

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

L'en-tête de l'email résultant ressemblera à ceci:

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

- Soyez prudent -
Sachez que certains clients de messagerie peuvent afficher l'adresse de l'expéditeur sous forme de note. Par exemple, Outlook affichera quelque chose de ce type dans l'en-tête du volet de lecture:

Moi <[email protected]> au nom du client <[email protected]>

Toutefois, tant que le client de messagerie utilisé par le destinataire ne constitue pas un déchet total, l'adresse de réponse ne devrait pas être affectée. Répondre à doit toujours utiliser l'adresse de l'expéditeur. Pour couvrir toutes vos bases, vous pouvez également utiliser la propriété MailMessage.ReplyToList pour offrir au client toutes les occasions d'utiliser la bonne adresse de réponse.

Sachez également que certains serveurs de messagerie peuvent rejeter totalement les courriers électroniques envoyés au nom d'une autre société définissant des restrictions de stratégie de propriétaire de domaine. Veillez à effectuer des tests approfondis et à rechercher d'éventuels rebonds. Je peux vous dire que mon compte de messagerie personnel Hotmail (mail.live.com) rejettera les messages que j’envoie au nom d’un de mes clients, mais que d’autres clients acceptent. Bien que je soupçonne que cela a quelque chose à voir avec les enregistrements de domaine de mon client TXT "spf1"), je ne sais pas pourquoi il rejettera les courriels envoyés pour le compte d'un domaine plutôt que pour un autre. Peut-être que quelqu'un qui sait peut faire la lumière sur le sujet?

6
ShaneLS

Avez-vous vu cette? Envoi de courrier électronique à l'aide de Smtp.mail.microsoftonline.com

La définition de UseDefaultCredentials après la définition des informations d'identification reviendrait à réinitialiser votre propriété Credentials.

6
Phil Sayers

Office 365 utilise deux serveurs, le serveur smtp et protège le serveur étendu.

Le premier serveur est smtp.office365.com (propriété hôte du client smtp) et le second serveur est STARTTLS/smtp.office365.com (propriété TargetName du client smtp). Une autre chose est qu'il faut mettre Usedefaultcredential = false avant de définir 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)
4
Carlos Galíndez

J'ai porté le code c # utilisé auparavant pour travailler contre smtp.google.com:587 via Office365 sans succès. Essayé toutes les combinaisons de Credential avant/après l’utilisation de Ssl et de presque toutes les recommandations faites sur Internet - sans succès (erreur 5.7.1 ....).

Enfin, cette ligne vient de quelque part en dernier recours, juste avant .Send (message)

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

Depuis lors, chaque send () est un grand succès.

3
Joe Frank

Enfin, ça marche!

Mettez smtpClient.UseDefaultCredentials = false; après smtpClient.Credentials = credentials; alors le problème est résolu!

            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