Як встановити ім'я користувача та пароль для об'єкта SmtpClient в .NET?


160

Я бачу різні версії конструктора, одна використовує інформацію з 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());
    }              
}

Відповіді:


301

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
Tomas

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

1
Чи безпечно жорсткий код ім'я користувача та пароль у c # коді?
kudlatiger

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
вам слід спробувати опублікувати лише відповідні код відповіді
johnny 5

1
@ johnny5 контекст не є найбільшим злочином у світі
Шив

@shiv ви праві, але контекст буде писати пояснення відповіді, чого також тут немає.
Johnny 5,

1
@ johnny5 в інших головних відповідях пояснень немає - приклад досить зрозумілий, оскільки код - це самодокументація.
Шив

@Shiv топ відповіді - це самодокументування, оскільки вони розміщують лише відповідний код. У моєму первісному коментарі є стільки ж результатів, скільки у цій відповіді, чомусь я не бачу, чому мені доведеться просіяти хоч 15 рядків коду, коли для відповіді на це питання потрібно лише 2, якщо ви вважаєте, що ця відповідь корисна, підкреслити це. В іншому випадку, немає сенсу сперечатися з приводу коментаря, який я зробив 2 роки тому, який інший знайшов корисним
johnny 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.