Pourquoi est-ce que «la propriété ne peut pas être affectée» s'affiche lors de l'envoi d'un e-mail SMTP?

274

Je ne comprends pas pourquoi ce code ne fonctionne pas. Je reçois une erreur indiquant que la propriété ne peut pas être affectée

MailMessage mail = new MailMessage();
SmtpClient client = new SmtpClient();            
client.Port = 25;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Host = "smtp.gmail.com";
mail.To = "[email protected]"; // <-- this one
mail.From = "[email protected]";
mail.Subject = "this is a test email.";
mail.Body = "this is my test email body";
client.Send(mail);
Sam Stephenson
la source
1
Nore que si vous essayez d'envoyer via gmail via SMTP, vous devez autoriser les applications moins sécurisées à accéder à votre compte support.google.com/accounts/answer/6010255?hl=en
Matthew Lock

Réponses:

363

mail.Toet mail.Fromsont en lecture seule. Déplacez-les vers le constructeur.

using System.Net.Mail;

...

MailMessage mail = new MailMessage("[email protected]", "[email protected]");
SmtpClient client = new SmtpClient();
client.Port = 25;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Host = "smtp.gmail.com";
mail.Subject = "this is a test email.";
mail.Body = "this is my test email body";
client.Send(mail);
MRB
la source
9
mail.To est en lecture seule, de ne l'est pas. public MailAddressCollection To {get; }
MRB
41
C'est parce que c'est une collection. Vous pouvez simplement appeler ajouter à cela
Oskar Kjellin
17
@Oskar D'accord, j'aurais donc dû être plus précis. Vous ne pouvez pas définir le mail.to à une adresse spécifique. Vous devez utiliser le constructeur ou appeler add. J'adressais uniquement le premier avertissement du compilateur: Erreur CS0200: la propriété ou l'indexeur 'System.Net.Mail.MailMessage.To' ne peut pas être affecté à - il est en lecture seule
MRB
9
@DougHauf Vous pouvez utiliser la classe SmtpClient avec un serveur smtp protégé par mot de passe. votre serveur smtp semble être un serveur interne, ce qui signifie que votre programme ne pourra se connecter à ce serveur smtp que lorsqu'il est sur le réseau. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke
4
SmtpClient implémente IDisposable, vous devriez donc probablement le changer en: using (SmtpClient client = new SmtpClient ()) {...}
Mark Miller
261

Ce :

mail.To = "[email protected]";

Devrait être:

mail.To.Add(new MailAddress("[email protected]"));
Mithrandir
la source
L'utilisation de ceci et du MailMessageconstructeur par défaut vous permet de définir le Tochamp sans définir le From, qui sera par défaut la valeur de l' élément <smtp> (Paramètres réseau)
bstoney
Quelqu'un peut-il me dire comment faire fonctionner cela pour mon propre serveur SMTP au lieu de Google SMTP? Je reçois une {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}erreur lorsque j'essaie de me connecter à mon serveur SMTP
YuDroid
@YuDroid Définissez correctement les propriétés Hostet . PortSmtpClient
Mithrandir
@Mithrandir Oui, je le configure correctement. J'ai configuré mon compte de messagerie SMTP dans Outlook et récupéré tous les paramètres nécessaires à partir de leur. L'hôte et le port sont déclarés dans le fichier Web.config et je le récupère au moment de l'exécution.
YuDroid
121

J'ai enfin réussi à travailler :)

using System.Net.Mail;
using System.Text;

...

// Command line argument must the the SMTP host.
SmtpClient client = new SmtpClient();
client.Port = 587;
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("[email protected]","password");

MailMessage mm = new MailMessage("[email protected]", "[email protected]", "test", "test");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

client.Send(mm);

désolé pour une mauvaise orthographe avant

Sam Stephenson
la source
5
Ne devrait-il pas y avoir un mm.Dispose ()?
Steam du
Btw, le port smtp par défaut est 25.
Steam
2
Je vous remercie! Même jusqu'à ce jour, cela a fonctionné, mais en utilisant Outlook à la place. [client.Host = "smtp-mail.outlook.com";]
compski
6
587 est smtp sécurisé.
user3800527
1
@ freej17 add MailAddress copy = new MailAddress ("[email protected]"); mm.CC.Add (copie);
Sam Stephenson
19
public static void SendMail(MailMessage Message)
{
    SmtpClient client = new SmtpClient();
    client.Host = "smtp.googlemail.com";
    client.Port = 587;
    client.UseDefaultCredentials = false;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.EnableSsl = true;
    client.Credentials = new NetworkCredential("[email protected]", "password");
    client.Send(Message); 
}
Mnyikka
la source
4
Cela ne résout pas du tout pourquoi l'affectation du PO aux MailMessage propriétés ne peut pas être effectuée.
ProfK
17

Voilà comment cela fonctionne pour moi. J'espère que vous le trouverez utile

MailMessage objeto_mail = new MailMessage();
SmtpClient client = new SmtpClient();
client.Port = 25;
client.Host = "smtp.internal.mycompany.com";
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("user", "Password");
objeto_mail.From = new MailAddress("[email protected]");
objeto_mail.To.Add(new MailAddress("[email protected]"));
objeto_mail.Subject = "Password Recover";
objeto_mail.Body = "Message";
client.Send(objeto_mail);
user2332898
la source
De chez moi, je n'ai pas de serveur interne ni de outlook.com sur mon ordinateur. J'ai un compte Outlook.com en ligne, puis-je l'utiliser pour l'hôte?
Doug Hauf
12

Tout d' abord aller à https://myaccount.google.com/lesssecureapps et faire Permettre des applications moins sécurisées vrai .

Utilisez ensuite le code ci-dessous. Ce code ci-dessous ne fonctionnera que si votre adresse e-mail de provenance provient de gmail.

static void SendEmail()
    {
        string mailBodyhtml =
            "<p>some text here</p>";
        var msg = new MailMessage("[email protected]", "[email protected]", "Hello", mailBodyhtml);
        msg.To.Add("[email protected]");
        msg.IsBodyHtml = true;
        var smtpClient = new SmtpClient("smtp.gmail.com", 587); //**if your from email address is "[email protected]" then host should be "smtp.hotmail.com"**
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new NetworkCredential("[email protected]", "password");
        smtpClient.EnableSsl = true;
        smtpClient.Send(msg);
        Console.WriteLine("Email Sent Successfully");
    }
Siddarth Kanted
la source
7

Si vous souhaitez que votre e-mail et votre mot de passe n'apparaissent pas dans votre code et que le serveur client de messagerie de votre entreprise utilise vos informations d'identification Windows ci-dessous.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

La source

DoodleKana
la source
C'est la même chose que client.UseDefaultCredentials = true; cependant
Alexander
4

Cela a juste fonctionné pour moi en mars 2017. A commencé avec la solution ci-dessus "Enfin, ça a fonctionné :)" qui n'a pas fonctionné au début.

SmtpClient client = new SmtpClient();
client.Port =  587;
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("<me>@gmail.com", "<my pw>");
MailMessage mm = new MailMessage(from_addr_text, to_addr_text, msg_subject, msg_body);
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

client.Send(mm);
Doug Null
la source
3

Cette réponse comprend:

Voici le code extrait:

    public async Task SendAsync(string subject, string body, string to)
    {
        using (var message = new MailMessage(smtpConfig.FromAddress, to)
        {
            Subject = subject,
            Body = body,
            IsBodyHtml = true
        })
        {
            using (var client = new SmtpClient()
            {
                Port = smtpConfig.Port,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Host = smtpConfig.Host,
                Credentials = new NetworkCredential(smtpConfig.User, smtpConfig.Password),
            })
            {
                await client.SendMailAsync(message);
            }
        }                                     
    }

Classe SmtpConfig:

public class SmtpConfig
{
    public string Host { get; set; }
    public string User { get; set; }
    public string Password { get; set; }
    public int Port { get; set; }
    public string FromAddress { get; set; }
}
Fabian Bigler
la source
2
MailMessage mm = new MailMessage(txtEmail.Text, txtTo.Text);
mm.Subject = txtSubject.Text;
mm.Body = txtBody.Text;
if (fuAttachment.HasFile)//file upload select or not
{
    string FileName = Path.GetFileName(fuAttachment.PostedFile.FileName);
    mm.Attachments.Add(new Attachment(fuAttachment.PostedFile.InputStream, FileName));
}
mm.IsBodyHtml = false;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.EnableSsl = true;
NetworkCredential NetworkCred = new NetworkCredential(txtEmail.Text, txtPassword.Text);
smtp.UseDefaultCredentials = true;
smtp.Credentials = NetworkCred;
smtp.Port = 587;
smtp.Send(mm);
Response.write("Send Mail");

Voir la vidéo: https://www.youtube.com/watch?v=bUUNv-19QAI

jishan siddique
la source
Bien que cette vidéo puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change
afxentios
msdn a déclaré pour la propriété UseDefaultCredentials que "Si la propriété UseDefaultCredentials est définie sur false, la valeur définie dans la propriété Credentials sera utilisée pour les informations d'identification lors de la connexion au serveur." , par conséquent, vous devez définir la propriété UseDefaultCredentials sur false si vous avez utilisé la propriété Credentials (informations d'identification personnalisées).
Sergei Iashin
1
smtp.Host = "smtp.gmail.com"; // the host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;

Parcourez cet article pour plus de détails

somesh
la source
1

Il suffit d'essayer ceci:

string smtpAddress = "smtp.gmail.com";
int portNumber = 587;
bool enableSSL = true;
string emailFrom = "companyemail";
string password = "password";
string emailTo = "Your email";
string subject = "Hello!";
string body = "Hello, Mr.";
MailMessage mail = new MailMessage();
mail.From = new MailAddress(emailFrom);
mail.To.Add(emailTo);
mail.Subject = subject;
mail.Body = body;
mail.IsBodyHtml = true;
using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
{
   smtp.Credentials = new NetworkCredential(emailFrom, password);
   smtp.EnableSsl = enableSSL;
   smtp.Send(mail);
}
Ahmed El-Hansy
la source
1

MailKit est une bibliothèque cliente mail multiplateforme Open Source basée sur MimeKit et optimisée pour les appareils mobiles. Il a plus de fonctionnalités avancées que le support System.Net.Mail Microsoft TNEF via MimeKit.

Téléchargez le paquet nuget ici .

Voir cet exemple, vous pouvez envoyer du courrier

            MimeMessage mailMessage = new MimeMessage();
            mailMessage.From.Add(new MailboxAddress(senderName, sender@address.com));
            mailMessage.Sender = new MailboxAddress(senderName, sender@address.com);
            mailMessage.To.Add(new MailboxAddress(emailid, emailid));
            mailMessage.Subject = subject;
            mailMessage.ReplyTo.Add(new MailboxAddress(replyToAddress));
            mailMessage.Subject = subject;
            var builder = new BodyBuilder();
            builder.TextBody = "Hello There";            
            try
            {
                using (var smtpClient = new SmtpClient())
                {
                    smtpClient.Connect("HostName", "Port", MailKit.Security.SecureSocketOptions.None);
                    smtpClient.Authenticate("[email protected]", "password");

                    smtpClient.Send(mailMessage);
                    Console.WriteLine("Success");
                }
            }
            catch (SmtpCommandException ex)
            {
                Console.WriteLine(ex.ToString());              
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
            }
Naveen
la source
1

envoyer un e-mail par smtp

public void EmailSend(string subject, string host, string from, string to, string body, int port, string username, string password, bool enableSsl)
    {
        try
        {
            MailMessage mail = new MailMessage();
            SmtpClient smtpServer = new SmtpClient(host);
            mail.Subject = subject;
            mail.From = new MailAddress(from);
            mail.To.Add(to);
            mail.Body = body;
            smtpServer.Port = port;
            smtpServer.Credentials = new NetworkCredential(username, password);
            smtpServer.EnableSsl = enableSsl;
            smtpServer.Send(mail);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
Morteza Sefidi
la source
0

cela fonctionnerait aussi ..

string your_id = "[email protected]";
string your_password = "password";
try
{
   SmtpClient client = new SmtpClient
   {
     Host = "smtp.gmail.com",
     Port = 587,
     EnableSsl = true,
     DeliveryMethod = SmtpDeliveryMethod.Network,
     Credentials = new System.Net.NetworkCredential(your_id, your_password),
     Timeout = 10000,
   };
   MailMessage mm = new MailMessage(your_iD, "[email protected]", "subject", "body");
   client.Send(mm);
   Console.WriteLine("Email Sent");
 }
 catch (Exception e)
 {
   Console.WriteLine("Could not end email\n\n"+e.ToString());
 }
user3188978
la source
0
 //Hope you find it useful, it contain too many things

    string smtpAddress = "smtp.xyz.com";
    int portNumber = 587;
    bool enableSSL = true;
    string m_userName = "[email protected]";
    string m_UserpassWord = "56436578";

    public void SendEmail(Customer _customers)
    {
        string emailID = gghdgfh@gmail.com;
        string userName = DemoUser;

        string emailFrom = "[email protected]";
        string password = "qwerty";
        string emailTo = emailID;

        // Here you can put subject of the mail
        string subject = "Registration";
        // Body of the mail
        string body = "<div style='border: medium solid grey; width: 500px; height: 266px;font-family: arial,sans-serif; font-size: 17px;'>";
        body += "<h3 style='background-color: blueviolet; margin-top:0px;'>Aspen Reporting Tool</h3>";
        body += "<br />";
        body += "Dear " + userName + ",";
        body += "<br />";
        body += "<p>";
        body += "Thank you for registering </p>";            
        body += "<p><a href='"+ sURL +"'>Click Here</a>To finalize the registration process</p>";
        body += " <br />";
        body += "Thanks,";
        body += "<br />";
        body += "<b>The Team</b>";
        body += "</div>";
       // this is done using  using System.Net.Mail; & using System.Net; 
        using (MailMessage mail = new MailMessage())
        {
            mail.From = new MailAddress(emailFrom);
            mail.To.Add(emailTo);
            mail.Subject = subject;
            mail.Body = body;
            mail.IsBodyHtml = true;
            // Can set to false, if you are sending pure text.

            using (SmtpClient smtp = new SmtpClient(smtpAddress, portNumber))
            {
                smtp.Credentials = new NetworkCredential(emailFrom, password);
                smtp.EnableSsl = enableSSL;
                smtp.Send(mail);
            }
        }
    }
Dutt93
la source
2
Veuillez envisager d'utiliser votre réponse pour expliquer la solution et pourquoi le demandeur d'origine rencontrait un problème au lieu de simplement publier un mur de code. Cela sera plus utile à la fois pour le demandeur d'origine et les futurs visiteurs de comprendre pourquoi le problème s'est produit en premier lieu.
RedBassett
@RedBassett Merci pour la suggestion. Je viens d'éditer et de mettre des informations dans les commentaires, la prochaine fois je garderai à l'esprit quelles que soient les choses que vous aurez dites.
Dutt93