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


161

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

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

public static void CreateTestMessage1(string server, int port)
{
    string to = "jane@contoso.com";
    string from = "ben@contoso.com";
    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());
    }              
}

Ответы:


302

SmtpClient может использоваться кодом:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");

если я не установлю один, он будет использовать те из web.config по умолчанию?
CloudMeta

3
@pipelinecache Райан прав, если не предоставлены учетные данные, он будет смотреть <system.net> <mailSettings> в web.config
Томас

1
Я полагаю, что если UseDefaultCredentialsустановлено значение true, он будет использовать значения по умолчанию, в противном случае он сначала будет смотреть в Credentialsсвойстве, а затем в web.config. Если ничего не установлено, он отправит письмо анонимно.
TheGateKeeper

1
Безопасно ли кодировать имя пользователя и пароль в коде c #?
Кудлатигер

3
Предупреждение: если вы установите «UseDefaultCredentials = false», вы должны сделать это ПЕРЕД настройкой учетных данных, так как изменение обнуляет любые существующие установленные учетные данные.
WhoIsRich

26

использование NetworkCredential

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

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

client.Credentials = credentials;

4
почему не только одна строка?
JSON

7
SmtpClient MyMail = new SmtpClient();
            MailMessage MyMsg = new MailMessage();
            MyMail.Host = "mail.eraygan.com";
            MyMsg.Priority = MailPriority.High;
            MyMsg.To.Add(new MailAddress(Mail));
            MyMsg.Subject = Subject;
            MyMsg.SubjectEncoding = Encoding.UTF8;
            MyMsg.IsBodyHtml = true;
            MyMsg.From = new MailAddress("username", "displayname");
            MyMsg.BodyEncoding = Encoding.UTF8;
            MyMsg.Body = Body;
            MyMail.UseDefaultCredentials = false;
            NetworkCredential MyCredentials = new NetworkCredential("username", "password");
            MyMail.Credentials = MyCredentials;
            MyMail.Send(MyMsg);

4
Вы должны постить только соответствующий код ответа
Джонни 5

1
@ johnny5 контекст не самое большое преступление в мире
Шив

@shiv вы правы, но контекст будет писать объяснение ответа, которого также нет.
Джонни 5

1
@ johnny5 другие топовые ответы не имеют объяснений - пример довольно понятен, поскольку код самодокументируется.
Шив

@Shiv верхние ответы самодокументированы, потому что они публикуют только соответствующий код. Мой исходный комментарий содержит столько же голосов, сколько и этот ответ, по какой-то причине, я не понимаю, почему мне пришлось бы просеивать хотя бы 15 строк кода, когда для ответа на этот вопрос нужно только 2, если вы нашли этот ответ полезным, одобряю это. В противном случае, нет смысла спорить по поводу комментария, который я сделал 2 года назад, который был найден другим полезным
Джонни 5

-2

Поскольку не все мои клиенты используют аутентифицированные учетные записи 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.