Como definir o nome de usuário e a senha do objeto SmtpClient no .NET?

160

Vejo versões diferentes do construtor, uma usa informações de web.config, uma especifica o host e outra o host e a porta. Mas como faço para definir o nome de usuário e a senha como algo diferente do web.config? Temos o problema em que nosso smtp interno é bloqueado por alguns clientes de alta segurança e queremos usar seu servidor smtp. Existe uma maneira de fazer isso a partir do código, em vez de web.config?

Nesse caso, como eu usaria as credenciais web.config se nenhuma estiver disponível no banco de dados, por exemplo?

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
fonte

Respostas:

301

O SmtpClient pode ser usado pelo código:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
pipelinecache
fonte
se eu não definir um, ele usará os do web.config por padrão?
CloudMeta
3
@pipelinecache Ryan está certo, se nenhuma credencial fornecida for exibida, <system.net> <mailSettings> em web.config
Tomas
1
Eu acredito que se UseDefaultCredentialsfor definido como true, ele usará os padrões, caso contrário, ele primeiro procurará na Credentialspropriedade e depois no web.config. Se nenhum estiver definido, o e-mail será enviado anonimamente.
TheGateKeeper
1
É seguro codificar o nome de usuário e a senha no código c #?
precisa saber é o seguinte
3
Aviso: Se você definir 'UseDefaultCredentials = false', deverá fazê-lo ANTES de definir credenciais, pois a alteração anula qualquer conjunto de credenciais existentes.
precisa saber é o seguinte
26

Usar NetworkCredential

Sim, basta adicionar essas duas linhas ao seu código.

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

client.Credentials = credentials;
Gabe
fonte
4
por que não apenas uma linha?
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
fonte
4
você deve tentar a postar código só relavent para a resposta
johnny 5
1
@ contexto johnny5 não é o maior crime do mundo
Shiv
@shiv você está correto, mas um contexto estaria escrevendo uma explicação da resposta, que também não está aqui.
johnny 5
1
@ johnny5 as outras respostas principais não têm explicações - o exemplo é bastante auto-explicativo, pois o código é auto-documentado.
Shiv
@Shiv, as principais respostas são auto-documentadas porque postam apenas o código relevante. Meu comentário original tem tantos votos positivos quanto esta resposta, por um motivo, não vejo por que eu precisaria filtrar 15 linhas de código, quando são necessários apenas 2 para responder a essa pergunta, se você achou útil, voto positivo. Caso contrário, não adianta discutir sobre um comentário que fiz há 2 anos, que outro foi útil
johnny 5 /
-2

Como nem todos os meus clientes usam contas SMTP autenticadas, usei a conta SMTP apenas se os valores da chave do aplicativo forem fornecidos no arquivo web.config.

Aqui está o código 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
fonte