Comment définir le nom d'utilisateur et le mot de passe pour l'objet SmtpClient dans .NET?

161

Je vois différentes versions du constructeur, l'une utilise les informations de web.config, l'autre spécifie l'hôte et l'autre l'hôte et le port. Mais comment définir le nom d'utilisateur et le mot de passe sur quelque chose de différent de web.config? Nous avons le problème où notre smtp interne est bloqué par certains clients de haute sécurité et nous voulons utiliser leur serveur smtp, existe-t-il un moyen de le faire à partir du code au lieu de web.config?

Dans ce cas, comment utiliserais-je les informations d'identification web.config si aucune n'est disponible dans la base de données, par exemple?

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
la source

Réponses:

302

Le SmtpClient peut être utilisé par code:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
pipelinecache
la source
si je n'en définit pas, utilisera-t-il ceux de web.config par défaut?
CloudMeta
3
@pipelinecache Ryan a raison, si aucune information d'identification n'est fournie, il regardera <system.net> <mailSettings> dans web.config
Tomas
1
Je crois que si UseDefaultCredentialsest défini sur true, il utilisera les valeurs par défaut, sinon il cherchera d'abord dans la Credentialspropriété, puis dans le web.config. Si aucun n'est défini, il enverra l'e-mail de manière anonyme.
TheGateKeeper
1
Est-il sûr de coder en dur le nom d'utilisateur et le mot de passe dans le code C #?
kudlatiger
3
Avertissement: Si vous définissez 'UseDefaultCredentials = false', vous devez le faire AVANT de définir les informations d'identification, car la modification annule tout jeu d'informations d'identification existant.
WhoIsRich
26

Utilisation NetworkCredential

Oui, ajoutez simplement ces deux lignes à votre code.

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

client.Credentials = credentials;
Gabe
la source
4
pourquoi pas une seule ligne?
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
la source
4
vous devriez essayer de poster uniquement du code pertinent à la réponse
johnny 5
1
@ johnny5 le contexte n'est pas le plus grand crime au monde
Shiv
@shiv vous avez raison, mais un contexte serait d'écrire une explication de la réponse, qui n'est pas non plus ici.
johnny 5
1
@ johnny5 les autres réponses principales n'ont pas d'explications - l'exemple est assez explicite car le code est auto-documenté.
Shiv
@Shiv les meilleures réponses sont auto-documentées car elles ne publient que le code pertinent. Mon commentaire d'origine a autant de votes positifs que cette réponse, pour une raison, je ne vois pas pourquoi je devrais passer au crible 15 lignes de code, alors que seulement 2 sont nécessaires pour répondre à cette question, si vous avez trouvé cette réponse utile, votez. Sinon, cela ne sert à rien de se disputer à propos d'un commentaire que j'ai fait il y a 2 ans et que d'autres ont trouvé utile
johnny 5
-2

Étant donné que tous mes clients n'utilisent pas de comptes SMTP authentifiés, j'ai eu recours au compte SMTP uniquement si les valeurs de clé d'application sont fournies dans le fichier web.config.

Voici le code 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
la source