编写C#代码以使用office 365发送电子邮件

编写C#代码以使用office 365发送电子邮件,c#,email,office365,C#,Email,Office365,这对我来说似乎应该很简单,但我无法让它工作。我可以轻松发送代码如下的电子邮件: [OperationBehavior(Impersonation = ImpersonationOption.Required)] public static void sendEmail(string toEmail, string toName, string subject, string body) { MailAddress from = new MailAddre

这对我来说似乎应该很简单,但我无法让它工作。我可以轻松发送代码如下的电子邮件:

    [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public static void sendEmail(string toEmail, string toName, string subject, string body)
    {

        MailAddress from = new MailAddress("TizzyFoe@MyCompany.com", "Mr Tizzy Foe");
        const string UserName = "TizzyFoe@MyCompanyInc.com";
        const string password = "ThisIsMyRealPassword";
        const string host = "smtp.office365.com";

        MailMessage msg = new MailMessage();
        msg.To.Add(new MailAddress(toEmail, toName));
        msg.From = from;
        msg.Subject = subject;
        msg.Body = body;
        msg.IsBodyHtml = true;

        SmtpClient client = new SmtpClient();
        client.UseDefaultCredentials = true;
        //client.Credentials = (System.Net.ICredentialsByHost)System.Net.CredentialCache.DefaultCredentials;
        //client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        client.Credentials = new System.Net.NetworkCredential(UserName, password);
        client.Port = 587;
        client.Host = host;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = true;
        client.Send(msg);

    }
但是,出于各种明显的原因,将我的密码输入这样的代码是不好的

所以我想做的是说,好的,这个程序在我的笔记本电脑上运行,我以我的身份登录。所以程序不能访问我的凭据。你可以看到我评论了两次失败的尝试:

        //client.Credentials = (System.Net.ICredentialsByHost)System.Net.CredentialCache.DefaultCredentials;
        //client.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
这两种情况都会导致此异常:

SMTP服务器需要安全连接,或者客户端未连接 认证的。服务器响应为:5.7.57 SMTP;客户不是 已通过身份验证,可在从发送邮件期间发送匿名邮件

也许我的程序只能访问无法传递到office365服务器的某些加密版本的凭据?我对安全概念有一定的了解,但这已经超出了我的理解范围


我觉得这不可能那么难。我知道有些应用程序可以通过office 365自动发送电子邮件。现在,我只是将我的代码作为一个控制台应用程序进行测试,但我的想法是最终我会创建一个windows服务来运行它。也许windows服务可以传递凭据?

DefaultCredentials表示当前用户的windows帐户。设置
client.UseDefaultCredentials=false
以使用用户名/密码组合更改该值对行为没有结果。当我指定我的姓名和密码时,无论是真是假,都会发送电子邮件。如果我使用System.Net.CredentialCache.DefaultNetworkCredentials,则不会发送电子邮件。我认为您混淆了不同类型的凭据。当您使用
DefaultCredentials
时,将使用您的Windows帐户,而不是用户名/密码。仅当邮件服务器与您的帐户在同一域中运行或在受信任域中运行时,此操作才有效。NET不会解密并发送您的密码,而是发送一个帐户令牌。这与访问服务器上的文件共享没有什么不同。Office 365帐户与您的本地帐户无关,即使部分完整帐户名相同,例如:
myname@outlook.com
vs
MYDOMAIN\myname
你把我弄丢了。。。这些信息是否有助于解决问题?如果是,我应该如何设置相关参数(UseDefaultCredentials和Credentials)?我的Office 365帐户和本地windows帐户相同,至少用户名和密码相同。如果我按control alt delete并更改密码,我需要使用outlook.office.com上的新密码。但对我来说,这些账户在幕后可能是不同的,这是有道理的。。。当我访问那个网站时,它不能自动让我登录,因为我已经登录了windows。也许不发送解密密码就无法进入office 365。。。但如果是这样的话,还必须有一些解决办法。