我们公司正在将SMTP邮件服务器切换到Office 365.关键问题是新的SMTP服务器“smtp.office365.com”仅支持TLS加密。因此,我无法使用CredentialCache.DefaultNetworkCredentials
自动编码我的Windows登录密码。
var smtpClient = new SmtpClient("smtp.oldserver.com")
{
Credentials = CredentialCache.DefaultNetworkCredentials
};
const string from = "myemail@xyz.com";
const string recipients = "myemail@xyz.com";
smtpClient.Send(from, recipients, "Test Subject", "Test Body");
以前这个没有任何问题。但是,如果我现在将上述代码段更改为:
var smtpClient = new SmtpClient("smtp.office365.com");
smtpClient.EnableSsl = true;
smtpClient.Port = 587;
smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
我现在要:
Unhandled Exception: System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM
但是,如果我在代码中指定我的Windows登录用户名和密码,它可以正常工作:
smtpClient.Credentials = new NetworkCredential("myemail@xyz.com", "mypassword");
所以:
DefaultNetworkCredentials
对密码进行编码,但是在TLS加密下可以使用?答案 0 :(得分:5)
两个主题 - 凭据和加密 - 是无关的。 DefaultNetworkCredentials仅在邮件服务器和您的计算机属于同一“网络”或更准确,相同或连接的Active Directory服务器时才有效。我猜测旧的SMTP服务器是内部部署的,并且是您办公室网络的一部分。 O365服务器位于云中,不共享AD。
当您明确提供凭据时,它可以正常运行,因为O365可以对您进行身份验证。
有可能使用Azure Active Directory并以某种方式将其连接到您的内部部署Active Directory。我不熟悉细节,但我知道可以做到。我相信如果你正确设置它,DefaultNetworkCredentials将重新开始工作。
有关O365身份验证的详细信息:https://blogs.office.com/2014/05/13/choosing-a-sign-in-model-for-office-365/
如果您需要存储密码,则需要将其加密存储。请参阅此答案:Best way to store encryption keys in .NET C#
答案 1 :(得分:1)
在我的情况下,我加密了我存储这些凭据的web.config部分。我已经在我的数据库中存储了一个加密版本的凭证,并有一个例程在应用程序中解密它们。