C# 通过Exchange Online(Office 365)使用System.Net.Mail发送SMTP电子邮件

C# 通过Exchange Online(Office 365)使用System.Net.Mail发送SMTP电子邮件,c#,exchange-server,office365,sendmail,system.net.mail,C#,Exchange Server,Office365,Sendmail,System.net.mail,我们正在测试新的Office 365测试版,我在Exchange Online服务上有一个邮件帐户。现在我正在尝试连接一个LOB应用程序,它可以从我的测试帐户发送smtp电子邮件 但是,Exchange 365平台需要在端口587上进行TLS加密,并且System.Net.Mail的一个“功能”不允许隐式SSL加密 有人能通过这个平台让C#发送邮件吗 我有以下的基本代码,应该发送邮件-任何建议将不胜感激 SmtpClient server = new SmtpClient("ServerAddr

我们正在测试新的Office 365测试版,我在Exchange Online服务上有一个邮件帐户。现在我正在尝试连接一个LOB应用程序,它可以从我的测试帐户发送smtp电子邮件

但是,Exchange 365平台需要在端口587上进行TLS加密,并且
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);
你看到这个了吗?


设置凭据后设置UseDefaultCredentials将重置您的凭据属性。

快速回答:发件人地址必须与您从中发送的帐户完全匹配,否则将出现错误5.7.1客户端没有作为此发件人发送的权限

我的猜测是,这可以防止使用Office 365帐户进行电子邮件欺骗,否则您可能可以作为电子邮件发送sballmer@microsoft.com.

另一个尝试是在身份验证中,用域填充第三个字段,如

Dim smtpAuth = New System.Net.NetworkCredential(
    "TheDude", "hunter2password", "MicrosoftOffice365Domain.com")
如果不起作用,请再次检查您是否可以登录以下帐户:

还有一点需要注意的是,作为反垃圾邮件解决方案,您的防病毒解决方案可能会阻止对端口25和587的编程访问。Norton和McAfee可能会以静默方式阻止对这些端口的访问。只有启用邮件和套接字调试才能让您注意到它(请参见下文)

最后要注意的是,Send方法是异步的。如果您在呼叫send后立即呼叫Dispose,则很可能在发送邮件之前关闭了连接。让您的smtpClient实例侦听OnSendCompleted事件,并从那里调用dispose。您必须改用SendAsync方法,Send方法不会引发此事件

Dispose
详细回答:使用Visual Studio(VB.NET或C#不重要),我制作了一个简单的表单,其中包含一个创建邮件消息的按钮,类似于上面的按钮。然后我将其添加到application.exe.config(在我的项目的bin/debug目录中)。这使“输出”选项卡具有详细的调试信息。


最后,成功了

Put
smtpClient.UseDefaultCredentials=false
smtpClient.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();
SmtpClient SmtpClient=新的SmtpClient(smtpServerName);
System.Net.NetworkCredential credentials=新的System.Net.NetworkCredential(smtpUName,smtpUNamePwd);
smtpClient.Credentials=凭证;

smtpClient.UseDefaultCredentials=false 修复了上面工作代码中的一些拼写错误:

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();
}
我有两个使用上述代码的web应用程序,它们都可以正常工作,没有任何问题。

我已经将用于对抗smtp.google.com:587的c#代码移植到office365上,但没有成功。尝试了使用Ssl之前/之后的所有凭证组合,以及在Internet上提出的几乎所有建议-未成功(获得5.7.1…错误)

最后,作为最后手段,我从某处收到了这封信,就在之前。发送(消息)


从那时起,每个send()都取得了巨大的成功。

Office 365使用两台服务器,smtp服务器和protect extended sever

第一个服务器是smtp.office365.com(smtp客户端的属性主机),第二个服务器是STARTTLS/smtp.office365.com(smtp客户端的属性TargetName)。另一件事是在设置networkcredentials之前必须先将Usedefaultcredential=false

    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)

下面是一些可能正在搜索此线程以寻找此问题答案的人的旁注。(在实施此解决方案之前,请务必阅读底部的注意事项。)我在为我的MS Office 365订阅没有用户或域的客户端发送电子邮件时遇到问题。我正试图通过我的邮件发送SMTPMe@MyDomain.com365帐户,但.NET邮件是从Client@ClientDomain.com. 这是当我弹出“5.7.1客户端没有权限”错误时。要解决此问题,MailMessage类需要将Sender属性设置为我提供的SMTP凭据在O365中具有“作为发送”权限的电子邮件地址。我选择使用我的主帐户电子邮件(Me@MyDomain.com)如下面的代码所示。请记住,我可以使用我的O365帐户有权“发送身份”的任何电子邮件地址(即。Support@MyDomain.com,没有-reply@MyDomain.com(等)

请注意,SmtpClient是一次性的,并且能够使用.NET Framework 4中的Using块
.NETFramework2到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>  
身份验证结果:spf=none(发送方IP为)
smtp.mailfrom=Me@MyDomain.com;  
收到:从MyPC(192.168.1.1)收到
BLUPR13MB0036.namprd13.prod.outlook.com(10.161.123.150)和Microsoft SMTP
服务器(TLS)id 15.1.318.9;2015年11月9日星期一16:06:58+0000
MIME版本:1.0
发件人:客户
发送者:我
收件人:收件人1
--小心--
请注意,某些邮件客户端可能会将发件人地址显示为备注。例如,Outlook将在阅读窗格的标题中沿以下几行显示内容:

我代表客户

但是,只要收件人使用的电子邮件客户端不完全是垃圾,这就不会影响回复地址。回复对象仍应使用发件人地址。为了覆盖所有基础,您还可以利用MailMessage.ReplyToList属性为客户端提供使用正确回复地址的所有机会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>  
            using (SmtpClient client = new SmtpClient()
            {
                Host = "smtp.office365.com",
                Port = 587,
                UseDefaultCredentials = false, // This require to be before setting Credentials property
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Credentials = new NetworkCredential("alias@fulldomain.com", "password"), // you must give a full email address for authentication 
                TargetName = "STARTTLS/smtp.office365.com", // Set to avoid MustIssueStartTlsFirst exception
                EnableSsl = true // Set to avoid secure connection exception
            })
            {

                MailMessage message = new MailMessage()
                {
                    From = new MailAddress("alias@fulldomain.com"), // sender must be a full email address
                    Subject = subject,
                    IsBodyHtml = true,
                    Body = "<h1>Hello World</h1>",
                    BodyEncoding = System.Text.Encoding.UTF8,
                    SubjectEncoding = System.Text.Encoding.UTF8,

                };
                var toAddresses = recipients.Split(',');
                foreach (var to in toAddresses)
                {
                    message.To.Add(to.Trim());
                }

                try
                {
                    client.Send(message);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
            }