Envoyer un courriel SMTP en utilisant le système.Net.Courrier par échange en ligne (Bureau 365))

nous testons la nouvelle version bêta de Office 365, et j'ai un compte mail sur le service Exchange Online. Maintenant j'essaie de connecter une application LOB qui peut envoyer des emails smtp à partir de mon compte test.

cependant, la plate-forme Exchange 365 nécessite le cryptage TLS sur le port 587, et il y a une "caractéristique" de System.Net.Mail qui ne permet pas le cryptage SSL implicite.

est-ce que quelqu'un a réussi à obtenir C# envoyant 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("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);
38
demandé sur Rowland Shaw 2011-06-05 21:50:05

7 réponses

a fixé quelques fautes de frappe dans le code de travail ci-dessus:

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

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

39
répondu Sanjeev 2016-12-19 09:41:40

réponse rapide: L'adresse de FROM doit correspondre exactement au compte que vous envoyez à partir, ou vous obtiendrez une erreur 5.7.1 le Client n'a pas les permissions d'envoyer comme cet expéditeur.

mon avis est que empêche la mystification d'e-mail avec votre compte bureau 365, sinon vous pourriez être en mesure d'envoyer comme sballmer@microsoft.com.

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 deux fois que vous pouvez vous connecter au compte à: https://portal.microsoftonline.com

une autre chose à noter est que votre solution Antivirus peut bloquer l'accès programmatique aux ports 25 et 587 comme solution anti-spam. Norton et McAfee peuvent silencieusement bloquer l'accès à ces ports. Seul le fait d'activer le débogage par courrier électronique et Socket vous permettra de le remarquer (voir ci-dessous).

une dernière chose à noter, la méthode envoyer est asynchrone . Si vous appelez

Dispose
immédiatement après avoir appelé send, il est plus que probable que vous fermiez votre connexion avant que le courrier ne soit envoyé. Demandez à votre instance smtpClient d'écouter L'événement OnSendCompleted, et d'appeler dispose à partir de là. Vous devez utiliser la méthode SendAsync à la place, la méthode Send N'élève pas cet événement.

Réponse Détaillée: Avec Visual Studio (VB.NET or C# doesn't matter), j'ai fait un formulaire simple avec un bouton qui a créé le Message de courrier, semblable à celui ci-dessus. Ensuite, j'ai ajouté ceci à la demande.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>
11
répondu The Dude 2012-07-16 15:51:18

vous avez vu ça? envoyer un e-mail en utilisant Smtp.mail.microsoftonline.com

définir les UseDefaultCredentials après avoir défini les Credentials serait réinitialiser votre propriété Credentials.

5
répondu Phil Sayers 2017-05-23 10:31:34

Voici une note pour certains qui cherchent dans ce thread une réponse à ce problème. (Assurez-vous de lire les mises en garde au bas de la page avant de mettre en œuvre cette solution.) J'avais de la difficulté à envoyer des e-mails pour un client auquel mon abonnement MS Office 365 n'avait pas d'utilisateur ou de domaine. J'essayais de SMTP à travers mon Me@MyDomain.com compte 365 mais le message. net a été adressé de Client@ClientDomain.com . C'est lorsque l'erreur" 5.7.1 Client n'a pas de permissions " est apparue pour moi. Pour remédier à cette situation, la classe MailMessage devait avoir la propriété Sender réglée à une adresse e-mail que mes justificatifs SMTP fournis avaient la permission dans O365 d' "envoyer sous". J'ai choisi d'utiliser mon adresse e-mail principale ( ) Me@MyDomain.com ) comme indiqué dans le code ci-dessous. Gardez à l'esprit que j'aurais pu utiliser N'importe quelle adresse e-mail que mon compte O365 avait la permission d ' "envoyer sous" (c.-à-d. Support@MyDomain.com, no-reply@MyDomain.com, etc.)

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

s'il vous Plaît noter SmtpClient n'est disponible et en mesure d'utiliser l'Aide du bloc .NET Framework 4

Les utilisateurs de .net Framework 2 à 3.5 doivent utiliser SmtpClient en tant que tel...

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

l'en-tête de l'email résultante ressemblera à quelque chose comme ceci:

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>  

-- Soyez Prudent --

Soyez conscient que certains clients de messagerie peuvent afficher l'adresse de L'expéditeur sous forme de note. Par exemple Outlook affichera quelque chose le long de ces lignes dans l'en-tête du Panneau de lecture:

Me au nom du Client

cependant, tant que le client de messagerie que le destinataire utilise n'est pas un déchet total, cela ne devrait pas affecter la réponse à l'adresse. Répondre À toujours utiliser l'adresse De l'expéditeur. Pour couvrir toutes vos bases, vous pouvez également utiliser le MailMessage.Propriété ReplyToList pour permettre au client d'utiliser la bonne adresse de réponse.

aussi, soyez conscient que certains serveurs de messagerie peuvent rejeter catégoriquement tous les e-mails qui sont envoyés au nom d'une autre société siège des Restrictions de la Politique de propriétaire de domaine. Assurez-vous de bien tester et de rechercher tout rebond. Je peux vous dire que mon Hotmail personnel (mail.live.com) compte de messagerie est celui qui rejettera les messages que j'envoie au nom d'un certain client du mien mais d'autres clients passent par amende. Bien que je soupçonne que cela ait quelque chose à voir avec les enregistrements de domaine de mon client TXT "spf1", Je n'ai pas de réponse quant à la raison pour laquelle il rejettera les e-mails envoyés au nom d'un domaine par rapport à un autre. Peut-être que quelqu'un qui sait peut nous éclairer sur le sujet?

5
répondu ShaneLS 2016-06-16 14:13:54

Office 365 utiliser deux serveurs, serveur smtp et de protéger étendu sever.

le premier serveur est smtp.office365.com (propriété hôte du client smtp) et le second serveur est STARTTL/smtp.bureau365.com (propriété TargetName du client smtp). Une autre chose est de mettre Usedefaultcredential =false Avant de définir 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)
3
répondu Carlos Galíndez 2015-07-24 08:31:46

j'ai porté le code c utilisé contre smtp.google.com: 587 travailler via l'office365 sans succès. Essayé toutes les combinaisons de justificatifs avant/après L'utilisation de Ssl et presque toutes les recommandations faites sur Internet - w / o succès (got 5.7.1 .... erreur.)

a finalement obtenu cette ligne de quelque part en dernier recours, juste avant .Send(message)

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

depuis lors-chaque envoi () est un grand succès.

2
répondu Joe Frank 2014-06-11 22:24:06

Enfin, Ça Marche!

Mettre smtpClient.UseDefaultCredentials = false; après smtpClient.Credentials = credentials; ensuite, problème 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
répondu Yeong 2012-11-28 00:42:40