Por que recebo “'a propriedade não pode ser atribuída” ao enviar um email SMTP?


274

Não consigo entender por que esse código não está funcionando. Eu recebo um erro dizendo que a propriedade não pode ser atribuída

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
Mas se você estiver tentando enviar pelo gmail via SMTP, precisará permitir que aplicativos menos seguros acessem sua conta support.google.com/accounts/answer/6010255?hl=pt-BR
Matthew Lock

Respostas:


362

mail.Toe mail.Fromsão somente leitura. Mova-os para o construtor.

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 é somente leitura, de não é. public MailAddressCollection To {get; }
MRB

41
Isso é porque é uma coleção. Você pode simplesmente ligar para adicionar a ele
Oskar Kjellin

17
@ Ok, Ok, então eu deveria ter sido mais específico. Você não pode definir o mail.to para um endereço específico. Você deve usar o construtor ou chamar add. Eu estava endereçando apenas o primeiro aviso do compilador: Erro CS0200: A propriedade ou o indexador 'System.Net.Mail.MailMessage.To' não pode ser atribuído a - é somente leitura
MRB

9
@DougHauf Você pode usar a classe SmtpClient com um servidor smtp protegido por senha. seu servidor smtp parece ser um servidor interno, o que significa que seu programa só poderá se conectar a esse servidor smtp quando estiver na rede. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
Clifford.duke

4
SmtpClient implementa IDisposable, então você provavelmente deve alterá-lo para: usando (cliente SmtpClient = new SmtpClient ()) {...}
Mark Miller

261

Este :

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

Deveria estar:

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

Usando este e o padrão MailMessageconstrutor permite que você defina o Tocampo sem definir o Fromque será o padrão para o valor no <smtp> Elemento (configurações de rede)
bstoney

Alguém pode me dizer como posso fazer isso funcionar para meu próprio servidor SMTP em vez do Google SMTP? Estou recebendo {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}erro quando estou tentando me conectar ao meu servidor SMTP
YuDroid 28/12

@YuDroid Defina as propriedades Hoste corretamente. PortSmtpClient
Mithrandir

@Mithrandir Sim, estou configurando corretamente. Eu configurei minha conta de email SMTP no Outlook e peguei todas as configurações necessárias. Host e Port são declarados no arquivo Web.config e estou buscando o tempo de execução.
YuDroid 02/01

121

Finalmente comecei a trabalhar :)

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

desculpe pela ortografia ruim antes


5
Não deve haver um mm.Dispose ()?
Steam

Btw, a porta smtp padrão é 25.
Steam

2
Obrigado! Até o dia de hoje, funcionou, mas usando o Outlook. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 é smtp seguro.
user3800527

1
@ freej17 add MailAddress copy = new MailAddress ("Notification_List@contoso.com"); mm.CC.Add (cópia);
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
Isso não explica por que a atribuição do OP às MailMessage propriedades não pode ser feita.
ProfK

17

É assim que funciona para mim. Espero que você ache ú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);

Em casa, não tenho um servidor interno da empresa nem o outlook.com no meu computador. Eu tenho uma conta no outlook.com online, posso usá-la para o Host?
Doug Hauf

12

Primeiro, acesse https://myaccount.google.com/lesssecureapps e torne Permitir aplicativos menos seguros verdadeiros .

Em seguida, use o código abaixo. Este código abaixo funcionará apenas se o seu endereço de e-mail for do 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

Se você deseja que seu email e senha não apareçam no seu código e deseja que o servidor do cliente de email da empresa use suas credenciais do Windows, use abaixo.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Fonte


É o mesmo que client.UseDefaultCredentials = true; embora
Alexander

4

Isso funcionou para mim em março de 2017. Começou com a solução acima "Finalmente comecei a trabalhar :)", que não funcionou no começo.

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 resposta apresenta:

Aqui está o 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);
            }
        }                                     
    }

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

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


Embora este vídeo possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente de link podem se tornar inválidas se a página vinculada for alterada
afxentios

msdn declarou para a propriedade UseDefaultCredentials que "Se a propriedade UseDefaultCredentials estiver configurada como false, o valor definido na propriedade Credentials será usado para as credenciais ao se conectar ao servidor". , portanto, você deve definir a propriedade UseDefaultCredentials como false se você tiver usado a propriedade Credentials (credenciais personalizadas).
Sergei Iashin 17/03/19

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;

Consulte este artigo para obter mais detalhes


1

Só precisa tentar o seguinte:

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

O MailKit é uma biblioteca cliente de email .NET de plataforma cruzada de código aberto baseada no MimeKit e otimizada para dispositivos móveis. Possui mais recursos avançados que o suporte ao System.Net.Mail do Microsoft TNEF via MimeKit.

Faça o download do pacote nuget aqui .

Veja este exemplo, você pode enviar e-mail

            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 email 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

Inicialize os MailMessageendereços de email do remetente e do destinatário. Deve ser algo como

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

Leia o trecho de código completo de como enviar emails em c #


0

isso funcionaria também ..

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 sua resposta para explicar a solução e por que o solicitante original estava com um problema em vez de simplesmente postar um mural de código. Isso será mais útil para o solicitante original e futuros visitantes para entender por que o problema ocorreu em primeiro lugar.
RedBassett

@RedBassett Obrigado pela sugestão. Acabei de editar e colocar algumas informações nos comentários, da próxima vez, lembro das coisas que você disse.
Dutt93
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.