【问题标题】:C# - email - prevent remember credentialsC# - 电子邮件 - 防止记住凭据
【发布时间】:2019-02-03 13:44:47
【问题描述】:

我正在测试从 C# 发送电子邮件,因为它使用以下代码:

        MailMessage message = new MailMessage();
        message.To.Add("user@gmail.com");
        message.From = new MailAddress("me@server.com");
        message.Subject = "Test subject";
        message.Body = "Test body";

        SmtpClient client = new SmtpClient("server");
        client.Timeout = 10000;
        client.EnableSsl = true;
        client.UseDefaultCredentials = false;

        NetworkCredential credentials = new NetworkCredential("me@server.com", "CorrectPassword");
        client.Credentials = credentials;
        try
        {
            client.Send(message); // OK
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception caught in CreateTestMessage2(): {0}",  ex.ToString());
        }

然后,尝试开始控制连接中断和主要是无效密钥的异常,但注意即使使用错误的密钥,邮件仍然发送。

        NetworkCredential credentials = new NetworkCredential("me@server.com", "BadPassword");
        client.Credentials = credentials;
        try
        {
            client.Send(message); // OK, the email has been sent
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception caught in CreateTestMessage2(): {0}",  ex.ToString());
        }

如何禁用自动保存凭据?或者,如何删除存储的凭据?

【问题讨论】:

  • 如果您根本不设置凭据会发生什么,它还会发送吗?
  • 是的,邮件还是发了,挺奇怪的
  • 关于这个stackoverflow.com/a/27896967,多次使用SmtpClient.UseDefaultCredentials = false可能对你有帮助。
  • @Angel - 如果它回答了您的问题,请考虑接受提供的答案,因为它可能会在未来帮助其他人。

标签: c# email system.net.mail


【解决方案1】:

SmtpClient 关于这 2 个属性(UseDefaultCredentials 和 Credentials)的工作方式由 MS 的代码决定。以下是它们的实现方式:

public bool UseDefaultCredentials {
            get {
                return (transport.Credentials is SystemNetworkCredential) ? true : false;
            }
            set {
                if (InCall) {
                    throw new InvalidOperationException(SR.GetString(SR.SmtpInvalidOperationDuringSend));
                }

                transport.Credentials = value ? CredentialCache.DefaultNetworkCredentials : null;
            }
        }


        public ICredentialsByHost Credentials {
            get {
                return transport.Credentials;
            }
            set {
                if (InCall) {
                    throw new InvalidOperationException(SR.GetString(SR.SmtpInvalidOperationDuringSend));
                }

                transport.Credentials = value;
            }
        }

这让我前一阵子很吃惊,因为我在设置凭据后将默认设置为 false,但我无法让 gmail 进行身份验证。如果您更深入地查看 SmtpClient 和 SmtpTransport 周围的代码,该代码似乎只在第一次发送请求期间建立一次连接。因此,您似乎无法在同一客户端期间“再次”设置凭据。如果我正确阅读了代码,即使在第一次发送请求后再次调用 UseDefaultCredentials 也将不起作用。据我所知,这段代码是导致它发生的原因:

private void GetConnection()
    {
        if (!_transport.IsConnected)
        {
            _transport.GetConnection(_host, _port);
        }
    }

这里是 MS 开源代码的链接,如果您想深入了解它在做什么。

https://source.dot.net/#System.Net.Mail/System/Net/Mail/SmtpClient.cs https://source.dot.net/#System.Net.Mail/System/Net/Mail/SmtpTransport.cs

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2012-02-22
    • 2013-06-22
    • 1970-01-01
    • 2021-12-14
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多