Perché ricevo "'impossibile assegnare la proprietà" quando invio un'e-mail SMTP?


274

Non riesco a capire perché questo codice non funzioni. Viene visualizzato un errore che indica che la proprietà non può essere assegnata

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 che se si sta tentando di inviare tramite Gmail tramite SMTP è necessario consentire alle app meno sicure di accedere al proprio account support.google.com/accounts/answer/6010255?hl=it
Matthew Lock,

Risposte:


362

mail.Toe mail.Fromsono di sola lettura. Spostali nel costruttore.

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 è di sola lettura, da non lo è. public MailAddressCollection Per {get; }
MRB

41
Questo perché è una collezione. Puoi semplicemente chiamare aggiungi ad esso
Oskar Kjellin

17
@Oskar Va bene, quindi avrei dovuto essere più specifico. Non è possibile impostare mail.to su un indirizzo specifico. È necessario utilizzare il costruttore o call add. Stavo solo affrontando il primo avviso del compilatore: Errore CS0200: Proprietà o indicizzatore 'System.Net.Mail.MailMessage.To' non può essere assegnato a - è di sola lettura
MRB

9
@DougHauf È possibile utilizzare la classe SmtpClient con un server smtp protetto da password. il tuo server SMTP sembra essere un server interno, il che significa che il tuo programma sarà in grado di connettersi a quel server SMTP solo quando è sulla rete. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke il

4
SmtpClient implementa IDisposable, quindi probabilmente dovresti cambiarlo in: using (SmtpClient client = new SmtpClient ()) {...}
Mark Miller

261

Questo :

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

Dovrebbe essere:

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

L'uso di questo e del MailMessagecostruttore predefinito consente di impostare il Tocampo senza impostare il From, che verrà impostato automaticamente sul valore nell'elemento <smtp> (Impostazioni di rete)
bstoney

Qualcuno può dirmi come posso farlo funzionare per il mio server SMTP invece di Google SMTP? Ricevo un {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}errore quando provo a connettermi al mio server SMTP
YuDroid,

@YuDroid Impostare correttamente Hoste le Portproprietà di SmtpClient.
Mithrandir,

@Mithrandir Sì, lo sto impostando correttamente. Ho configurato il mio account di posta SMTP in Outlook e ho preso tutte le impostazioni necessarie dalla loro. L'host e la porta sono dichiarati nel file Web.config e lo sto recuperando in fase di esecuzione.
YuDroid

121

Finalmente ho funzionato :)

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

mi dispiace per la scarsa ortografia prima


5
Non dovrebbe esserci un mm.Dispose ()?
Steam

A proposito, la porta smtp predefinita è 25.
Steam

2
Grazie! Anche fino ad oggi ha funzionato ma usando outlook. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 è sicuro smtp.
user3800527

1
@ freej17 aggiungi 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); 
}

4
Questo non risolve affatto il motivo per cui l'assegnazione dell'OP alle MailMessage proprietà non può essere eseguita.
ProfK

17

Funziona così per me. Spero lo trovi 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);

Da casa non ho un server aziendale interno né outlook.com sul mio computer. Ho un account outlook.com online, posso usarlo per l'host?
Doug Hauf,

12

Per prima cosa vai su https://myaccount.google.com/lesssecureapps e rendi True le app meno sicure .

Quindi utilizzare il codice seguente. Questo codice di seguito funzionerà solo se il tuo indirizzo e-mail proviene da 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 vuoi che la tua e-mail e la tua password non compaiano nel tuo codice e desideri che il tuo server client di posta elettronica aziendale utilizzi le tue credenziali di Windows, usa di seguito.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

fonte


È uguale a client.UseDefaultCredentials = true; però
Alexander

4

Questo ha funzionato per me a partire da marzo 2017. Iniziato con una soluzione dall'alto "Finalmente ho funzionato :)" che all'inizio non ha funzionato.

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

Questa risposta presenta:

Ecco il codice estratto:

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

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


Sebbene questo video possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia
afxentios

msdn ha dichiarato per la proprietà UseDefaultCredentials che "Se la proprietà UseDefaultCredentials è impostata su false, il valore impostato nella proprietà Credentials verrà utilizzato per le credenziali durante la connessione al server." , pertanto è necessario impostare la proprietà UseDefaultCredentials su false se si fosse utilizzata la proprietà Credentials (credenziali personalizzate).
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;

Leggi questo articolo per maggiori dettagli


1

Devo solo provare questo:

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 è una libreria di client e-mail .NET multipiattaforma open source basata su MimeKit e ottimizzata per i dispositivi mobili. Ha più funzionalità avanzate rispetto al supporto Microsoft TNEF di System.Net.Mail tramite MimeKit.

Scarica il pacchetto nuget da qui .

Vedi questo esempio è possibile inviare posta

            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

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

Inizializza gli MailMessageindirizzi email con mittente e destinatario. Dovrebbe essere qualcosa del genere

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

Leggi lo snippet di codice completo su come inviare e-mail in c #


0

anche questo funzionerebbe ..

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
Prendi in considerazione l'idea di utilizzare la tua risposta per spiegare la soluzione e perché il richiedente originale stava riscontrando un problema invece di pubblicare semplicemente un wall of code. Ciò sarà più utile sia per chi chiede originale che per i futuri visitatori per capire perché il problema si è verificato in primo luogo.
RedBassett,

@RedBassett Grazie per il suggerimento. Ho appena modificato e inserito alcune informazioni nei commenti, la prossima volta terrò a mente qualunque cosa tu abbia detto.
Dutt93,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.