C # - электронная почта - предотвратить помнить учетные данные - PullRequest
0 голосов
/ 28 августа 2018

Я делал тесты для отправки электронного письма из 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());
        }

Как отключить автоматическое сохранение учетных данных? Или как стереть сохраненные учетные данные?

1 Ответ

0 голосов
/ 29 августа 2018

Способ работы SmtpClient в отношении этих двух свойств (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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...