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

上下文:

我们是一家没有Exchange Server(或任何致力于它的人)的小公司,但我们仍需要/发送电子邮件。

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


目标:

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

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

根据文档,我们需要使用端口(587)并确保启用传输层安全性(TLS)。 此外,正在使用的FROM地址必须是“权威”类型,当我通过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服务器需要安全连接或客户端未经过身份validation。 服务器响应为:5.7.1客户端未经过身份validation。

谷歌搜索了一段时间后,我仍然没有找到原因…此外,我发现的大部分答案都是对Exchange管理控制台的引用,我们似乎没有(或安装),因此我们为什么正在使用Microsoft在线服务…


问题:

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

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

3)我们正在抓住这里的稻草,因为我们似乎做的事情看上去非常微不足道……

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

如果任何人有任何帮助/建议,可以帮助我阐明这一点,那将是伟大的!

真诚的文斯



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

通过评论这行代码:

 //server.UseDefaultCredentials = false; 

一切都开始起作用了!

我现在能够在域内外发送电子邮件…

令我困惑的是,根据文档,此UseDefaultCredentials属性的默认值设置为false

所以…当我手动将其设置为false时它不起作用但是当我对该行进行注释时(由于其默认值也将其设置为false)它可以工作!

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

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

所以底线,您不应该设置凭据并在之后调用此属性。

你可以尝试这个样本

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

再见

5.7.1不是身份validation问题,而是中继问题。 为了防止任何人使用您的服务器(或帐户,视情况而定),smtp服务器被配置为仅允许向域外的用户发送邮件,如果它来自授权地址。 validation您在此处列出的地址

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

与您认证的那个相同。 此外,请确保列出的地址域位于授权域列表中。

什么对我有用的是,该家伙建议通过Exchange Online(Office 365)使用System.Net.Mail发送SMTP电子邮件 ,将电子邮件“从”地址更改为与stmp地址的登录名相同

做文斯最后建议发送电子邮件使用Smtp.mail.microsoftonline.com评论“smtpClient.UseDefaultCredentials = false;”