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

时间:2011-07-11 20:20:10

标签: c# email

上下文:

我们是一家没有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)它可以正常工作!

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

5 个答案:

答案 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的集成等。