วิธีตั้งค่าชื่อผู้ใช้และรหัสผ่านสำหรับวัตถุ 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 Ryan ถูกต้องหากไม่มีข้อมูลประจำตัวที่ให้มาก็จะดูที่ <system.net> <mailSettings> ใน web.config
Tomas

1
ฉันเชื่อว่าถ้าUseDefaultCredentialsตั้งค่าเป็นจริงมันจะใช้ค่าเริ่มต้นมิฉะนั้นจะดูใน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
คุณควรลองโพสต์โค้ด relavent เพียงคำตอบ
johnny 5

1
@ บริบท johnny5 ไม่ได้เป็นความผิดทางอาญาที่ใหญ่ที่สุดในโลก
ชีฟ

@ shiv คุณถูกต้อง แต่บริบทจะเขียนคำอธิบายของคำตอบซึ่งก็ไม่ได้อยู่ที่นี่
johnny 5

1
@ johnny5 คำตอบยอดนิยมอื่น ๆ ไม่มีคำอธิบาย - ตัวอย่างนี้อธิบายได้ด้วยตนเองเพราะรหัสคือการทำเอกสารด้วยตนเอง
ชีฟ

@Shiv คำตอบยอดนิยมคือการจัดทำเอกสารด้วยตนเองเพราะจะโพสต์เฉพาะรหัสที่เกี่ยวข้อง ความคิดเห็นดั้งเดิมของฉันมี upvotes มากเช่นเดียวกับคำตอบนี้ด้วยเหตุผลฉันไม่เห็นว่าทำไมฉันถึงต้องกรองรหัส 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.