上下文:
我们是一家没有Exchange Server(或任何专门致力于此服务器的人)的小公司,但我们仍然需要/发送电子邮件。
我们决定使用 Microsoft Online Services(MOS)
目标:
我们有一个Web服务器(带有IIS 6.0的Windows Server 2003 R2)并部署了一个C#ASP.Net MCV应用程序。
每次用户创建帐户时,Web应用程序都需要发送电子邮件。
根据documentation我们需要使用端口(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服务器需要安全连接或客户端未经过身份验证。服务器响应为:5.7.1客户端未经过身份验证。
谷歌搜索了一段时间后,我仍然没有找到原因...此外,我发现的大多数答案都是参考 Exchange管理控制台,我们不这样做似乎已经(或安装)了我们使用Microsoft Online Services的原因......
问题:
1)作为MOS的付费客户,我最初的理解是我不应该在我们的服务器上安装(或拥有)Exchange管理控制台......事实上,为了完成我的任务,这应该是完全无关紧要的
2)我也尝试在IIS 6.0中启用TLS,但无济于事......
3)我们正在抓住这里的稻草,因为我们似乎做的事情看起来像是一件非常微不足道的事......
4)我们是否应该放弃使用MOS的SMTP服务器并使用另一个服务器的想法?比如Gmail的?如果是这样......那么为什么还要为MOS支付月费?
如果任何人有任何帮助/建议可以帮助我阐明这一点,那就太棒了!
此致 文斯
哇......我相信我们找到了罪魁祸首 !!!
通过评论这行代码:
//server.UseDefaultCredentials = false;
一切都开始起作用了!
我现在可以在域内外发送电子邮件了......
最令我困惑的是,根据文档,此UseDefaultCredentials
属性的默认值设置为 false
所以...当我手动将其设置为 false 时,它不起作用,但是当我对该行进行注释时(由于其默认值也将其设置为false)它可以正常工作!
如果这是一个已知问题,或者如果有人有答案,我很想知道!
答案 0 :(得分:6)
在UseDefaultCredentials属性中查看Reflector,您可以看到它也更改了trasnport.Credentials值,因此当您使用false值调用此属性时,它会将传输凭据更改为null。 问题是您在此之前的行中设置凭据后调用此属性, 它使凭证无效。
如此底线,您不应该设置凭据并在之后调用此属性。
答案 1 :(得分: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());
}
}
再见
答案 2 :(得分:0)
5.7.1不是身份验证问题,而是中继问题。为了防止任何人使用您的服务器(或帐户,视情况而定),smtp服务器被配置为仅允许向域外的用户发送邮件,如果它来自授权地址。验证您在此处列出的地址
mail.From = new MailAddress("xxx@domain.com");
与您要验证的那个相同。此外,请确保列出的地址域位于授权域列表中。
答案 3 :(得分:0)
对我来说有用的是这个家伙建议Send SMTP email using System.Net.Mail via Exchange Online (Office 365),更改电子邮件"来自"地址与stmp地址的登录名
相同AND
执行Vince最后提出的Sending email using Smtp.mail.microsoftonline.com评论" smtpClient.UseDefaultCredentials = false;"
答案 4 :(得分:0)
请务必仔细检查您的用户名是否正确。它不一定与您的电子邮件地址相同。例如,发件人地址可能是“ no-reply@yourdomain.com”,但用户名可能是“ mail-svc @ yourdomain。 onmicrosoft.com ”,这取决于您的设置以及与Azure Active Directory的集成等。