Dlaczego dostaję „nie można przypisać właściwości” podczas wysyłania wiadomości e-mail SMTP?


274

Nie rozumiem, dlaczego ten kod nie działa. Pojawia się błąd informujący, że właściwości nie można przypisać

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
Teraz, jeśli próbujesz wysyłać pocztę przez Gmaila za pomocą SMTP, musisz zezwolić mniej bezpiecznym aplikacjom na dostęp do swojego konta support.google.com/accounts/answer/6010255?hl=pl
Matthew Lock

Odpowiedzi:


362

mail.Toi mail.Fromsą tylko do odczytu. Przenieś je do konstruktora.

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 jest tylko do odczytu, z nie jest. public MailAddressCollection Aby {dostać; }
MRB

41
To dlatego, że jest to kolekcja. Możesz po prostu zadzwonić dodaj do niego
Oskar Kjellin

17
@Oskar Okay, więc powinienem być bardziej szczegółowy. Nie można ustawić mail.to na określony adres. Musisz użyć konstruktora lub wezwania add. Zwracałem się tylko do pierwszego ostrzeżenia kompilatora: Błąd CS0200: Właściwość lub indeksator „System.Net.Mail.MailMessage.To” nie może być przypisany - jest tylko do odczytu
MRB

9
@DougHauf Możesz używać klasy SmtpClient z chronionym hasłem serwerem smtp. twój serwer smtp wydaje się być serwerem wewnętrznym, co oznaczałoby, że twój program będzie mógł połączyć się z tym serwerem smtp tylko wtedy, gdy jest on podłączony do sieci. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke

4
SmtpClient implementuje IDisposable, więc prawdopodobnie powinieneś zmienić to na: using (klient SmtpClient = nowy SmtpClient ()) {...}
Mark Miller

261

To:

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

Powinien być:

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

Użycie tego i domyślnego MailMessagekonstruktora pozwala ustawić Topole bez ustawiania wartości Fromdomyślnej na wartość w elemencie <smtp> (Ustawienia sieciowe)
bstoney, 10.10.16

Czy ktoś może mi powiedzieć, jak mogę to zrobić dla mojego własnego serwera SMTP zamiast Google SMTP? Otrzymuję {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}błąd, gdy próbuję połączyć się z serwerem SMTP
YuDroid

@YuDroid Ustaw Hosti Portwłaściwości SmtpClientpoprawnie.
Mithrandir

@Mithrandir Tak Ustawiam to poprawnie. Skonfigurowałem swoje konto pocztowe SMTP w Outlooku i wybrałem z nich wszystkie niezbędne ustawienia. Host i Port są zadeklarowane w pliku Web.config, a ja pobieram go w środowisku wykonawczym.
YuDroid

121

W końcu zaczęło działać :)

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

przepraszam za złą pisownię wcześniej


5
Czy nie powinno być mm.Dispose ()?
Steam

Btw, domyślny port smtp to 25.
Steam

2
Dziękuję Ci! Nawet do dziś działało, ale zamiast tego używało programu Outlook. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 jest bezpieczny smtp.
user3800527

1
@ freej17 dodaj MailAddress copy = new MailAddress („Notification_List@contoso.com”); mm.CC.Add (kopia);
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
Nie dotyczy to wcale, dlaczego przypisanie PO do MailMessage właściwości nie może być wykonane.
ProfK

17

Tak to dla mnie działa. Mam nadzieję, że uznasz to za przydatne

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

Z domu nie mam wewnętrznego serwera firmowego ani outlook.com na moim komputerze. Mam konto online outlook.com, czy mogę użyć go do hosta?
Doug Hauf,

12

Najpierw idź do https://myaccount.google.com/lesssecureapps i uczynić Pozwól mniej bezpieczne aplikacje prawdą .

Następnie użyj poniższego kodu. Poniższy kod będzie działał tylko wtedy, gdy Twój adres e-mail pochodzi z Gmaila.

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

Jeśli chcesz, aby Twój adres e-mail i hasło nie pojawiały się w kodzie i chcesz, aby serwer klienta poczty e-mail w firmie używał poświadczeń systemu Windows, skorzystaj z poniższej instrukcji.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Źródło


Jest to to samo, co client UseDefaultCredentials = true; chociaż
Alexander

4

To działało dla mnie od marca 2017 r. Zacząłem od rozwiązania z góry „Nareszcie działam :)”, które początkowo nie działał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

Ta odpowiedź zawiera:

Oto wyodrębniony kod:

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

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

Zobacz wideo: https://www.youtube.com/watch?v=bUUNv-19QAI


Chociaż ten film wideo może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj podstawowe części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko link mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie
afxentios

msdn stwierdził dla właściwości UseDefaultCredentials, że „Jeśli właściwość UseDefaultCredentials ma wartość false, wówczas wartość ustawiona we właściwości Credentials zostanie użyta dla poświadczeń podczas łączenia się z serwerem”. , dlatego należy ustawić właściwość UseDefaultCredentials na wartość false, jeśli użyto właściwości Credentials (niestandardowe poświadczenia).
Siergiej 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;

Przejrzyj ten artykuł, aby uzyskać więcej informacji


1

Po prostu spróbuj tego:

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 to wieloplatformowa biblioteka klienta pocztowego .NET oparta na MimeKit i zoptymalizowana pod kątem urządzeń mobilnych. Ma więcej i zaawansowane funkcje lepsze niż obsługa Microsoft TNEF System.Net.Mail za pośrednictwem MimeKit.

Pobierz pakiet nuget stąd .

Zobacz ten przykład, w którym możesz wysyłać pocztę

            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

wyślij e-mail 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

Zainicjuj MailMessageadres e-mail nadawcy i odbiorcy. Tak powinno być

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

Przeczytaj pełny fragment kodu, jak wysyłać e-maile w języku c #


0

to też działałoby ..

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
Rozważ skorzystanie z odpowiedzi, aby wyjaśnić rozwiązanie i dlaczego pierwotny pytający napotkał problem, zamiast po prostu opublikować ścianę kodu. Będzie to bardziej przydatne zarówno dla pierwotnego pytającego, jak i przyszłych odwiedzających, aby zrozumieć, dlaczego problem wystąpił w pierwszej kolejności.
RedBassett,

@RedBassett Dzięki za sugestię. Właśnie dokonałem edycji i umieściłem pewne informacje w komentarzach, następnym razem będę pamiętać o tym, co powiedziałeś.
Dutt93
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.