¿Por qué obtengo "no se puede asignar la propiedad" al enviar un correo electrónico SMTP?


274

No puedo entender por qué este código no funciona. Recibo un error que dice que la propiedad no se puede asignar

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
Además, si está intentando enviar a través de gmail a través de SMTP, debe permitir que aplicaciones menos seguras accedan a su cuenta support.google.com/accounts/answer/6010255?hl=es
Matthew Lock,

Respuestas:


363

mail.Toy mail.Fromson de solo lectura. Moverlos al constructor.

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 es de solo lectura, desde no lo es. public MailAddressCollection To {get; }
MRB

41
Eso es porque es una colección. Puedes llamar a add to it
Oskar Kjellin

17
@Oskar Ok, entonces debería haber sido más específico. No puede configurar el mail.to a una dirección específica. Debe usar el constructor o llamar a add. Solo estaba abordando la primera advertencia del compilador: Error CS0200: La propiedad o indexador 'System.Net.Mail.MailMessage.To' no se puede asignar a - es de solo lectura
MRB

9
@DougHauf Puede usar la clase SmtpClient con un servidor smtp protegido con contraseña. su servidor smtp parece ser un servidor interno, lo que significa que su programa solo podrá conectarse a ese servidor smtp cuando esté en la red. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke

44
SmtpClient implementa IDisposable, por lo que probablemente debería cambiarlo a: using (SmtpClient client = new SmtpClient ()) {...}
Mark Miller

261

Esta :

mail.To = "user@hotmail.com";

Debiera ser:

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

El uso de este y el MailMessageconstructor predeterminado le permite establecer el Tocampo sin establecer el From, que por defecto será el valor en el elemento <smtp> (Configuración de red)
bstoney

¿Alguien puede decirme cómo puedo hacer que esto funcione para mi propio servidor SMTP en lugar de Google SMTP? Recibo un {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}error cuando intento conectarme a mi servidor SMTP
YuDroid

@YuDroid Establezca las propiedades Hosty Portde forma SmtpClientcorrecta.
Mithrandir

@ Mitrandir Sí, lo estoy configurando correctamente. He configurado mi cuenta de correo SMTP en Outlook y tomé todas las configuraciones necesarias de ellos. Host y Port se declaran en el archivo Web.config y lo estoy buscando en tiempo de ejecución.
YuDroid

121

Finalmente me puse a trabajar :)

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

perdón por la falta de ortografía antes


55
¿No debería haber un mm.Dispose ()?
Steam

Por cierto, el puerto SMTP predeterminado es 25.
Steam

2
¡Gracias! Incluso hasta el día de hoy funcionó, pero utilizando Outlook en su lugar. [client.Host = "smtp-mail.outlook.com";]
compski

66
587 es seguro smtp.
user3800527

1
@ freej17 agregar MailAddress copy = new MailAddress ("Notification_List@contoso.com"); mm.CC.Add (copia);
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); 
}

44
Esto no explica en absoluto por qué MailMessage no se puede hacer la asignación del OP a las propiedades.
ProfK

17

Así es como funciona para mí. Esperamos que te sea útil

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

Desde casa no tengo un servidor interno de la compañía ni outlook.com en mi computadora. Tengo una cuenta de outlook.com en línea, ¿podría usarla para el Host?
Doug Hauf

12

Primero vaya a https://myaccount.google.com/lesssecureapps y haga que Permitir aplicaciones menos seguras sea verdadero .

Luego usa el siguiente código. El siguiente código funcionará solo si su dirección de correo electrónico es 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 desea que su correo electrónico y contraseña no aparezcan en su código y desea que el servidor del cliente de correo electrónico de su empresa use sus credenciales de Windows, use a continuación.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Fuente


Esto es lo mismo que client.UseDefaultCredentials = true; aunque
Alexander

4

Esto funcionó para mí a partir de marzo de 2017. Comencé con la solución de arriba "Finalmente funcionó :)" que no funcionó al principio.

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

Esta respuesta presenta:

Aquí está el código extraído:

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

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

Ver video: https://www.youtube.com/watch?v=bUUNv-19QAI


Si bien este video puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace para referencia. Las respuestas solo de enlace pueden volverse inválidas si la página enlazada cambia
afxentios

msdn declaró para la propiedad UseDefaultCredentials que "Si la propiedad UseDefaultCredentials se establece en false, entonces el valor establecido en la propiedad Credentials se usará para las credenciales cuando se conecte al servidor". , por lo tanto, establecerá la propiedad UseDefaultCredentials en false si ha utilizado la propiedad Credentials (credenciales personalizadas).
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;

Lee este artículo para más detalles.


1

Solo necesito probar esto:

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 es una biblioteca de cliente de correo .NET multiplataforma de código abierto basada en MimeKit y optimizada para dispositivos móviles. Tiene más y mejores funciones avanzadas que System.Net.Mail Soporte de Microsoft TNEF a través de MimeKit.

Descargue el paquete nuget desde aquí .

Mira este ejemplo, puedes enviar correo

            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

enviar correo electrónico por 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

Inicialice MailMessagecon las direcciones de correo electrónico del remitente y del destinatario. Debería ser algo como

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

Lea el fragmento de código completo de cómo enviar correos electrónicos en C #


0

esto también funcionaría ...

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
Considere usar su respuesta para explicar la solución y por qué el autor de la pregunta original tenía un problema en lugar de simplemente publicar un muro de código. Esto será más útil tanto para el autor de la pregunta original como para los futuros visitantes para entender por qué ocurrió el problema en primer lugar.
RedBassett

@ RedBassett Gracias por la sugerencia. Acabo de editar y poner algo de información en los comentarios, la próxima vez que tenga en cuenta lo que sea que dijiste.
Dutt93
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.