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 = "user@hotmail.com"; // <-- this one
mail.From = "you@yourcompany.com";
mail.Subject = "this is a test email.";
mail.Body = "this is my test email body";
client.Send(mail);

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("you@yourcompany.com", "user@hotmail.com");
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);

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 = "user@hotmail.com";

Devrait être:

mail.To.Add(new MailAddress("user@hotmail.com"));

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("user@gmail.com","password");

MailMessage mm = new MailMessage("donotreply@domain.com", "sendtomyemail@domain.co.uk", "test", "test");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

client.Send(mm);

désolé pour une mauvaise orthographe avant


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 ("Notification_List@contoso.com"); 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("myemail@gmail.com", "password");
    client.Send(Message); 
}

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("from@server.com");
objeto_mail.To.Add(new MailAddress("to@server.com"));
objeto_mail.Subject = "Password Recover";
objeto_mail.Body = "Message";
client.Send(objeto_mail);

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("from@gmail.com", "to1@gmail.com", "Hello", mailBodyhtml);
        msg.To.Add("to2@gmail.com");
        msg.IsBodyHtml = true;
        var smtpClient = new SmtpClient("smtp.gmail.com", 587); //**if your from email address is "from@hotmail.com" then host should be "smtp.hotmail.com"**
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new NetworkCredential("from@gmail.com", "password");
        smtpClient.EnableSsl = true;
        smtpClient.Send(msg);
        Console.WriteLine("Email Sent Successfully");
    }

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


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

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

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


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


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

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("user@name.com", "password");

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

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

0

Initialisez l' MailMessageadresse e-mail de l'expéditeur et du destinataire. Cela devrait être quelque chose comme

string from = "codeforwin@gmail.com";  //Senders email   
string to = "reciever@gmail.com";  //Receiver's email  
MailMessage msg = new MailMessage(from, to); 

Lire l'extrait de code complet sur la façon d'envoyer des e-mails en c #


0

cela fonctionnerait aussi ..

string your_id = "your_id@gmail.com";
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, "recepient@gmail.com", "subject", "body");
   client.Send(mm);
   Console.WriteLine("Email Sent");
 }
 catch (Exception e)
 {
   Console.WriteLine("Could not end email\n\n"+e.ToString());
 }

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 = "support@xyz.com";
    string m_UserpassWord = "56436578";

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

        string emailFrom = "qwerty@gmail.com";
        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);
            }
        }
    }

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.