Bagaimana cara mengatur nama pengguna dan kata sandi untuk objek SmtpClient di .NET?

161

Saya melihat berbagai versi konstruktor, satu menggunakan info dari web.config, satu menentukan host, dan satu host dan port. Tetapi bagaimana cara mengatur nama pengguna dan kata sandi untuk sesuatu yang berbeda dari web.config? Kami memiliki masalah ketika smtp internal kami diblokir oleh beberapa klien keamanan tinggi dan kami ingin menggunakan server smtp mereka, apakah ada cara untuk melakukan ini dari kode alih-alih web.config?

Dalam hal ini bagaimana saya akan menggunakan kredensial web.config jika tidak ada yang tersedia dari database, misalnya?

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());
    }              
}
CloudMeta
sumber

Jawaban:

302

SmtpClient dapat digunakan dengan kode:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
pipelinecache
sumber
jika saya tidak mengaturnya, apakah akan menggunakan yang dari web.config secara default?
CloudMeta
3
@pipelinecache Ryan benar, jika tidak ada kredensial yang diberikan, itu akan melihat <system.net> <mailSettings> di web.config
Tomas
1
Saya percaya jika UseDefaultCredentialsdisetel ke true, ia akan menggunakan default, jika tidak maka pertama-tama akan terlihat di Credentialsproperti dan kemudian di web.config. Jika tidak ada yang disetel akan mengirim email secara anonim.
TheGateKeeper
1
Apakah aman untuk nama sandi dan kata sandi hard code dalam kode c #?
kudlatiger
3
Peringatan: Jika Anda menetapkan 'UseDefaultCredentials = false' Anda harus melakukannya SEBELUM mengatur Kredensial, karena perubahan tersebut akan menghapus semua kredensial yang ada.
WhoIsRich
26

Menggunakan NetworkCredential

Yap, cukup tambahkan dua baris ini ke kode Anda.

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

client.Credentials = credentials;
Gabe
sumber
4
mengapa tidak hanya satu baris?
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);
M.Alaghemand
sumber
4
Anda harus mencoba memposting hanya kode yang relevan ke jawabannya
johnny 5
1
@ konteks johnny5 bukan kejahatan terbesar di dunia
Shiv
@shiv Anda benar, tetapi konteksnya adalah menulis penjelasan tentang jawabannya, yang juga tidak ada di sini.
johnny 5
1
@ johnny5 jawaban teratas lainnya tidak memiliki penjelasan - contohnya cukup jelas karena kodenya adalah dokumentasi sendiri.
Shiv
@Shiv jawaban teratas mendokumentasikan diri sendiri karena hanya memposting kode yang relevan. Komentar asli saya memiliki banyak upvotes seperti jawaban ini, karena suatu alasan, saya tidak mengerti mengapa saya harus menyaring 15 baris kode, ketika hanya 2 yang diperlukan untuk menjawab pertanyaan ini, jika Anda menemukan jawaban ini berguna, buktikan itu. Kalau tidak, ini tidak ada gunanya berdebat tentang komentar yang saya buat 2 tahun yang lalu yang ditemukan bermanfaat
johnny 5
-2

Karena tidak semua klien saya menggunakan akun SMTP yang diautentikasi, saya terpaksa menggunakan akun SMTP hanya jika nilai kunci aplikasi diberikan dalam file web.config.

Berikut adalah kode 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)
A. Varma
sumber