这里有一个小提示,对于那些可能正在寻找此问题答案的人来说(在实施此解决方案之前,请务必阅读底部的注意事项)。我遇到了一个问题,即无法向一个客户发送电子邮件,因为我的 MS Office 365 订阅中不存在该客户的用户或域名。我试图通过我的 Me@MyDomain.com 365 帐户进行 SMTP,但 .NET 邮件信息的地址是从 Client@ClientDomain.com 发送的。这就是当我遇到“5.7.1 客户端没有权限”错误时发生的情况。为了解决这个问题,需要将 MailMessage 类的 Sender 属性设置为一个我的 SMTP 凭据允许“发送作为”的电子邮件地址。在下面的代码中,我选择使用我的主帐户电子邮件 (Me@MyDomain.com)。请记住,我可以使用任何我的 O365 帐户具有“发送作为”权限的电子邮件地址(例如,Support@MyDomain.com,no-reply@MyDomain.com 等)。
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();
}
}
}
}
}
}
请注意,SmtpClient仅在.NET Framework 4中可用,并可使用Using块进行处理。
使用.NET Framework 2到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>
--请小心--
请注意,某些邮件客户端可能会将发件人地址显示为备注。例如,在阅读窗格的标题中,Outlook将显示以下内容:
我 <Me@MyDomain.com> 代表 客户 <Client@ClientDomain.com>
然而,只要收件人使用的电子邮件客户端不是完全垃圾,这不应该影响回复地址。回复地址仍应使用发件人地址。为了涵盖所有情况,您还可以利用MailMessage.ReplyToList属性,为客户提供正确的回复地址。
此外,请注意,一些电子邮件服务器可能会直接拒绝代表另一个公司发送的任何邮件,并引用域所有者策略限制。一定要进行彻底的测试并查找任何退信。我可以告诉您,我的个人Hotmail(mail.live.com)电子邮件帐户是会拒绝我代表某个客户发送的消息之一,但其他客户则可以通过。虽然我怀疑这与我的客户的域TXT“spf1”记录有关,但我不知道为什么它会拒绝代表一个域发送的电子邮件而不是另一个域。也许知道的人可以给我们解释一下?
UseDefaultCredentials = false
行移动到前面。https://dev59.com/Wuo6XIcBkEYKwwoYOR0q#14021685 - jeroenh