Jak ustawić nazwę użytkownika i hasło dla obiektu SmtpClient w .NET?

160

Widzę różne wersje konstruktora, jeden używa informacji z web.config, jeden określa hosta, a drugi hosta i port. Ale jak ustawić inną nazwę użytkownika i hasło niż plik web.config? Mamy problem polegający na tym, że nasz wewnętrzny smtp jest blokowany przez niektórych klientów o wysokim poziomie bezpieczeństwa i chcemy użyć ich serwera smtp, czy istnieje sposób na zrobienie tego z kodu zamiast z pliku web.config?

W takim przypadku jak użyłbym poświadczeń web.config, jeśli na przykład żadne dane nie są dostępne w bazie danych?

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
źródło

Odpowiedzi:

301

SmtpClient może być używany przez kod:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
pipelinecache
źródło
jeśli nie ustawię jednego, czy domyślnie użyje on tych z web.config?
CloudMeta
3
@pipelinecache Ryan ma rację, jeśli nie dostarczono żadnych danych uwierzytelniających, zajrzy na <system.net> <mailSettings> w web.config
Tomas
1
Uważam, że jeśli UseDefaultCredentialsjest ustawione na true, użyje wartości domyślnych, w przeciwnym razie najpierw zajrzy do Credentialswłaściwości, a następnie do pliku web.config. Jeśli żadna nie jest ustawiona, wiadomość e-mail zostanie wysłana anonimowo.
TheGateKeeper
1
Czy można bezpiecznie zakodować nazwę użytkownika i hasło w kodzie C #?
kudlatiger
3
Ostrzeżenie: jeśli ustawisz wartość „UseDefaultCredentials = false”, musisz to zrobić PRZED ustawieniem danych logowania, ponieważ zmiana ta unieważnia wszystkie istniejące zestawy danych logowania.
WhoIsRich
26

Posługiwać się NetworkCredential

Tak, po prostu dodaj te dwie linie do swojego kodu.

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

client.Credentials = credentials;
Gabe
źródło
4
dlaczego nie tylko jedna linijka?
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
źródło
4
powinieneś spróbować wysłać tylko kod relavent do odpowiedzi
johnny 5
1
Kontekst @ johnny5 nie jest największą zbrodnią na świecie
Shiv,
@shiv masz rację, ale kontekstem byłoby napisanie wyjaśnienia odpowiedzi, którego również nie ma tutaj.
johnny 5
1
@ johnny5 inne najpopularniejsze odpowiedzi nie mają wyjaśnień - przykład jest dość oczywisty, ponieważ kod jest samodokumentujący.
Shiv
@Shiv Najlepsze odpowiedzi są dokumentujące się same, ponieważ publikują tylko odpowiedni kod. Mój oryginalny komentarz ma tyle samo pozytywnych głosów, co ta odpowiedź, z jakiegoś powodu nie widzę powodu, dla którego miałbym przesiewać 15 linii kodu, podczas gdy potrzebne są tylko 2, aby odpowiedzieć na to pytanie, jeśli uznasz tę odpowiedź za przydatną, Głosuj na to. W przeciwnym razie nie ma sensu kłócić się o komentarz, który napisałem 2 lata temu, który inny okazał się przydatny
johnny 5
-2

Ponieważ nie wszyscy moi klienci używają uwierzytelnionych kont SMTP, uciekłem się do korzystania z konta SMTP tylko wtedy, gdy wartości kluczy aplikacji są podane w pliku web.config.

Oto kod 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
źródło