使用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;”