使用Smtp.mail.microsoftonline.com发送电子邮件

11

背景:

我们是一家规模较小的公司,没有Exchange服务器(或专职员工),但仍需要发送和接收电子邮件。

我们决定使用Microsoft Online Services (MOS)


目标:

我们有一个Web服务器(Windows Server 2003 R2 with IIS 6.0)并部署了一个C# ASP.Net MCV应用程序。

每当用户创建帐户时,Web应用程序都需要发送电子邮件。

根据文档,我们需要使用端口(587)并确保启用传输层安全(TLS)。此外,使用的FROM地址必须是“Authoritative”类型,在我通过Microsoft Online Administration Center进行双重检查时也是如此。


代码:

我拥有的C#代码应该很简单,如下所示:

SmtpClient server = new SmtpClient("Smtp.mail.microsoftonline.com");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("xxx@domain.com", "123abc");
server.UseDefaultCredentials = false;

MailMessage mail = new MailMessage();
mail.From = new MailAddress("xxx@domain.com");
mail.To.Add("johndoe@domain.com");
mail.Subject = "test subject";
mail.Body = "this is my message body";
mail.IsBodyHtml = true;

try
{
    server.Send(mail);
}
catch (Exception ex)
{
    throw ex;
}
错误:

我创建了一个简单的winform应用程序,使用上述代码来测试发送邮件… 我在我的计算机(Windows XP)和服务器上进行了本地的winform应用程序测试。

无论哪种尝试,我都不断收到以下错误消息:

SMTP服务器需要安全连接或客户端未经身份验证。 服务器响应为:5.7.1客户端未经身份验证。

通过谷歌搜索一段时间后,我仍然没有找到原因…此外,我找到的大多数答案都提到了我们似乎没有(或未安装)的Exchange管理控制台,这就是为什么我们使用Microsoft在线服务的原因…


问题:

1)作为MOS的付费客户,我的最初理解是我不应该在我们的服务器上安装(或拥有)Exchange管理控制台…实际上,为了完成我的任务,这应该是完全无关紧要的。

2)我还尝试在我们的IIS 6.0中启用TLS,但无济于事…

3)我们在这里像抓住稻草一样,因为我们所做的看起来非常微不足道…

4)我们应该放弃使用MOS的SMTP服务器并使用另一个吗? 比如Gmail的? 如果是这样,为什么要费心为MOS支付每月的费用呢?

如果有任何人能给我提供帮助/建议来帮助我解决这个问题,那将太棒了!

真诚地, Vince



哇…我相信我们找到了罪魁祸首!!!

通过注释掉这行代码:

//server.UseDefaultCredentials = false;

一切都开始正常工作了!

现在我可以发送内部和外部域的电子邮件了...

最令我困惑的是,根据文档,UseDefaultCredentials属性的默认值应该是false

所以...当我手动将其设置为false时它不起作用,但是当我注释掉这行代码(它也会因其默认值而被设置为false)时它就可以工作了!

如果这是一个已知的问题,或者有人能够回答这个问题,我很想知道!


代码看起来没问题。看起来用户名和/或密码是错误的。[链接](http://social.msdn.microsoft.com/Forums/sl-SI/ncl/thread/fbd6ae73-fbab-4873-8ca2-3ab02406e1d7) - dtb
如何启用***传输层安全性 (TLS)***? - Kiquenet
5个回答

7

在 Reflector 上查看 UseDefaultCredentials 属性,您可以看到它还会更改 transport.Credentials 值,因此当您使用 false 值调用此属性时,它将传输凭据更改为 null。 问题在于,在设置凭据的前一行调用此属性后, 它使凭据无效。

因此,最重要的是,在设置凭据并在此之后调用此属性之前,不应该这样做。


4
在微软方面,这似乎是一个糟糕的设计选择。对我来说,这些属性看起来联系过于紧密。如果人们遇到这个问题,我不会感到惊讶。很好发现! - David Peterson

3
你可以尝试这个示例。
      private void Button1_Click(System.Object sender, System.EventArgs e)
    {
        try
        {
            MailMessage myMessage = new MailMessage();
            SmtpClient myClient = new SmtpClient("yourserver");
            myClient.Port = "587";
            myClient.Host = "your server";
            myClient.UseDefaultCredentials = false;
            myClient.Credentials = new System.Net.NetworkCredential("username", "password");


            myMessage.From = new MailAddress("sender");
            myMessage.To.Add("recipient");
            myMessage.Subject = "Subject email";
            myMessage.Body = "body email";
            myClient.EnableSsl = true;
            myClient.Send(myMessage);
        }

        catch (Exepiton ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }

再见


注释掉这一行: //server.UseDefaultCredentials = false; 似乎解决了问题!谢谢 - Vlince

0

5.7.1不是一个身份验证问题,而是一个中继问题。为了防止任何人使用您的服务器(或帐户,视情况而定),SMTP服务器被配置为仅允许来自授权地址的邮件发送到您域名之外的用户。请验证您在此处列出的地址。

mail.From = new MailAddress("xxx@domain.com");

与您进行身份验证的域相同。此外,请确保列出的地址域在授权域列表中。


注释掉这一行代码: //server.UseDefaultCredentials = false; 似乎解决了问题!谢谢。 - Vlince
我在哪里可以找到“权威域名列表”? - Dieter
1
@Dieter,如果您正在使用Exchange Online,那么它应该在EAC > 邮件流 > 已接受域中。如果您使用的是其他邮件系统,则需要查看文档。 - Mitch

0

0
请务必仔细检查您的用户名是否正确。它不一定与您的发件人电子邮件地址相同。例如,发件人地址可能是“no-reply@yourdomain.com”,但用户名可能是“mail-svc@yourdomain.onmicrosoft.com”,这取决于您的设置和与 Azure Active Directory 的集成等因素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接