Как установить имя пользователя и пароль для объекта SmtpClient в .NET?

Я вижу разные версии конструктора, одна использует информацию из web.config, одна указывает хост, а третья - хост и порт. Но как мне установить имя пользователя и пароль, отличные от файла web.config? У нас есть проблема, когда наш внутренний smtp блокируется некоторыми клиентами с высоким уровнем безопасности, и мы хотим использовать их сервер smtp, есть ли способ сделать это из кода вместо web.config?

В этом случае, как мне использовать учетные данные web.config, если, например, их нет в базе данных?

public static void CreateTestMessage1(string server, int port)
{
    string to = "[email protected]";
    string from = "[email protected]";
    string subject = "Using the new SMTP client.";
    string body = @"Using this new feature, you can send an e-mail message from an application very easily.";
    MailMessage message = new MailMessage(from, to, subject, body);
    SmtpClient client = new SmtpClient(server, port);
    // Credentials are necessary if the server requires the client 
    // to authenticate before it will send e-mail on the client's behalf.
    client.Credentials = CredentialCache.DefaultNetworkCredentials;

    try {
        client.Send(message);
    }
    catch (Exception ex) {
        Console.WriteLine("Exception caught in CreateTestMessage1(): {0}", 
                    ex.ToString());
    }              
}

person Ryan    schedule 04.05.2010    source источник


Ответы (4)


SmtpClient можно использовать с помощью кода:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
person pipelinecache    schedule 04.05.2010
comment
если я его не установлю, будет ли он использовать по умолчанию те, что указаны в web.config? - person Ryan; 04.05.2010
comment
Нет, это будет DefaultNetworkCredentials, если он указан, или ничего. - person pipelinecache; 05.05.2010
comment
@pipelinecache Райан прав, если учетные данные не предоставлены, он будет искать ‹system.net› ‹mailSettings› в web.config - person Tomas; 03.02.2012
comment
Я считаю, что если для UseDefaultCredentials установлено значение true, он будет использовать значения по умолчанию, в противном случае он сначала будет искать в свойстве Credentials, а затем в web.config. Если ничего не установлено, электронное письмо будет отправлено анонимно. - person TheGateKeeper; 18.06.2013
comment
Безопасно ли жестко закодировать имя пользователя и пароль в коде c #? - person kudlatiger; 04.01.2017
comment
Предупреждение: если вы установили UseDefaultCredentials = false, вы должны сделать это ПЕРЕД установкой учетных данных, так как изменение обнуляет все существующие учетные данные. - person WhoIsRich; 15.08.2017

Используйте 1_

Да, просто добавьте эти две строки в свой код.

var credentials = new System.Net.NetworkCredential("username", "password");

client.Credentials = credentials;
person Gabe    schedule 04.05.2010
comment
почему не одну строчку? - person JSON; 30.10.2018

Поскольку не все мои клиенты используют аутентифицированные учетные записи SMTP, я прибегал к использованию учетной записи SMTP только в том случае, если значения ключей приложения указаны в файле web.config.

Вот код VB:

sSMTPUser = ConfigurationManager.AppSettings("SMTPUser")
sSMTPPassword = ConfigurationManager.AppSettings("SMTPPassword")

If sSMTPUser.Trim.Length > 0 AndAlso sSMTPPassword.Trim.Length > 0 Then
    NetClient.Credentials = New System.Net.NetworkCredential(sSMTPUser, sSMTPPassword)

    sUsingCredentialMesg = "(Using Authenticated Account) " 'used for logging purposes
End If

NetClient.Send(Message)
person A. Varma    schedule 14.12.2016

person    schedule
comment
вам следует попробовать разместить в ответе только соответствующий код - person johnny 5; 10.02.2016
comment
Контекст @ johnny5 - не самое большое преступление в мире - person Shiv; 27.06.2018
comment
@shiv, вы правы, но контекст мог бы написать объяснение ответа, которого здесь также нет. - person johnny 5; 27.06.2018
comment
@ johnny5 другие популярные ответы не имеют объяснений - пример довольно понятен, так как код самодокументируется. - person Shiv; 27.06.2018
comment
@Shiv основные ответы самодокументируются, потому что они публикуют только соответствующий код. В моем исходном комментарии столько же голосов, сколько и в этом ответе, по какой-то причине я не понимаю, почему мне пришлось бы просеивать хотя бы 15 строк кода, когда для ответа на этот вопрос нужны только 2, если вы нашли этот ответ полезным, проголосовать за это. В противном случае, нет смысла спорить о комментарии, который я сделал 2 года назад, который был полезен другим. - person johnny 5; 27.06.2018