Làm cách nào để đặt tên người dùng và mật khẩu cho đối tượng SmtpClient trong .NET?


160

Tôi thấy các phiên bản khác nhau của hàm tạo, một phiên bản sử dụng thông tin từ web.config, một phiên bản chỉ định máy chủ lưu trữ và một máy chủ lưu trữ và cổng. Nhưng làm cách nào để đặt tên người dùng và mật khẩu thành một cái gì đó khác với web.config? Chúng tôi có vấn đề trong đó smtp nội bộ của chúng tôi bị chặn bởi một số khách hàng bảo mật cao và chúng tôi muốn sử dụng máy chủ smtp của họ, có cách nào để làm điều này từ mã thay vì web.config không?

Trong trường hợp này, làm thế nào tôi có thể sử dụng thông tin đăng nhập web.config nếu không có sẵn từ cơ sở dữ liệu?

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

Câu trả lời:


301

Mã SmtpClient có thể được sử dụng theo mã:

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

Nếu tôi không đặt thì nó sẽ sử dụng những cái từ web.config theo mặc định?
CloudMeta

3
@pipelinecache Ryan nói đúng, nếu không có thông tin đăng nhập, nó sẽ xem <system.net> <mailSinstall> trong web.config
Tomas

1
Tôi tin rằng nếu UseDefaultCredentialsđược đặt thành đúng, nó sẽ sử dụng các giá trị mặc định, nếu không, trước tiên nó sẽ tìm trong thuộc Credentialstính và sau đó trong web.config. Nếu không được đặt, nó sẽ gửi email nặc danh.
TheGateKeeper

1
Có an toàn với tên người dùng và mật khẩu mã cứng trong mã c # không?
kudlatiger

3
Cảnh báo: Nếu bạn đặt 'UseDefaultCredentials = false', bạn phải thực hiện TRƯỚC KHI cài đặt Thông tin xác thực, vì thay đổi sẽ loại bỏ mọi thông tin xác thực hiện có.
WhoIsRich

26

Sử dụng NetworkCredential

Đúng, chỉ cần thêm hai dòng này vào mã của bạn.

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

client.Credentials = credentials;

4
Tại sao không chỉ là một dòng?
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
bạn nên thử chỉ đăng mã liên quan đến câu trả lời
johnny 5

1
@ johnny5 bối cảnh không phải là tội ác lớn nhất trên thế giới
Shiv

@shiv bạn đúng, nhưng một bối cảnh sẽ viết một lời giải thích cho câu trả lời, điều này cũng không có ở đây.
ngày 5

1
@ johnny5 các câu trả lời hàng đầu khác không có giải thích - ví dụ này khá tự giải thích vì mã là tài liệu tự.
Shiv

@Shiv các câu trả lời hàng đầu là tự viết tài liệu vì họ chỉ đăng mã có liên quan. Nhận xét ban đầu của tôi có nhiều câu hỏi như câu trả lời này, vì một lý do, tôi không hiểu tại sao tôi phải sàng lọc 15 dòng mã, khi chỉ cần 2 câu trả lời cho câu hỏi này, nếu bạn thấy câu trả lời này hữu ích, nâng cao nó Mặt khác, những điều này không có lý do gì để tranh luận về một bình luận mà tôi đã đưa ra 2 năm trước mà những thứ khác được tìm thấy là hữu ích
johnny 5

-2

Vì không phải tất cả khách hàng của tôi đều sử dụng tài khoản SMTP được xác thực, tôi chỉ sử dụng tài khoản SMTP nếu giá trị khóa ứng dụng được cung cấp trong tệp web.config.

Đây là mã 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.