C# 通过Exchange Online(Office 365)使用System.Net.Mail发送SMTP电子邮件
我们正在测试新的Office 365测试版,我在Exchange Online服务上有一个邮件帐户。现在我正在尝试连接一个LOB应用程序,它可以从我的测试帐户发送smtp电子邮件 但是,Exchange 365平台需要在端口587上进行TLS加密,并且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
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);
}
}