Mengapa saya mendapatkan "'properti tidak dapat ditentukan" ketika mengirim email SMTP?


274

Saya tidak mengerti mengapa kode ini tidak berfungsi. Saya mendapatkan pesan kesalahan yang mengatakan properti tidak dapat ditugaskan

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
Sebelumnya, jika Anda mencoba mengirim melalui gmail melalui SMTP, Anda harus mengizinkan aplikasi yang kurang aman untuk mengakses dukungan
Matthew Lock

Jawaban:


362

mail.Todan mail.Fromhanya dibaca. Pindahkan mereka ke konstruktor.

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 hanya bisa dibaca, dari tidak. publik MailAddressCollection To {get; }
MRB

41
Itu karena itu koleksi. Anda bisa menelepon add to it
Oskar Kjellin

17
@ Oke Oke, jadi saya seharusnya lebih spesifik. Anda tidak dapat mengatur mail.to ke alamat tertentu. Anda harus menggunakan konstruktor atau menambahkan panggilan. Saya hanya menangani peringatan kompiler pertama: Kesalahan CS0200: Properti atau pengindeks 'System.Net.Mail.MailMessage.To' tidak dapat ditugaskan ke - hanya dibaca
MRB

9
@DougHauf Anda dapat menggunakan kelas SmtpClient dengan server smtp yang dilindungi kata sandi. server smtp Anda tampaknya merupakan server internal yang berarti bahwa program Anda hanya akan dapat terhubung ke server smtp ketika itu ada di jaringan. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke

4
SmtpClient mengimplementasikan IDisposable, jadi Anda mungkin harus mengubahnya ke: using (SmtpClient client = new SmtpClient ()) {...}
Mark Miller

261

Ini:

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

Seharusnya:

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

Menggunakan ini dan MailMessagekonstruktor default memungkinkan Anda untuk mengatur Tobidang tanpa mengatur From, yang akan default ke nilai dalam <smtp> Elemen (Pengaturan Jaringan)
bstoney

Adakah yang bisa memberi tahu saya bagaimana saya bisa membuatnya bekerja untuk server SMTP saya sendiri dan bukan Google SMTP? Saya menerima {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}kesalahan ketika saya mencoba untuk terhubung ke server SMTP saya
YuDroid

@YuDroid Atur Hostdan Portproperti dari dengan SmtpClientbenar.
Mithrandir

@Mithrandir Ya saya mengaturnya dengan benar. Saya telah mengatur akun email SMTP saya di Outlook dan mengambil semua pengaturan yang diperlukan dari mereka. Host dan Port dideklarasikan dalam file Web.config dan saya mengambilnya runtime.
YuDroid

121

Akhirnya mulai bekerja :)

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

maaf tentang ejaan yang buruk sebelumnya


5
Bukankah seharusnya ada mm. Pilih ()?
Uap

Btw, port smtp default adalah 25.
Steam

2
Terima kasih! Bahkan sampai hari ini berhasil tetapi menggunakan outlook saja. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 adalah smtp aman.
user3800527

1
@ freej17 tambahkan MailAddress copy = baru MailAddress ("Notification_List@contoso.com"); mm.CC.Tambahkan (salin);
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
Ini sama sekali tidak membahas mengapa penetapan OP untuk MailMessage properti tidak dapat dilakukan.
ProfK

17

Beginilah cara kerjanya untuk saya. Semoga bermanfaat

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

Dari rumah saya tidak memiliki server perusahaan internal atau outlook.com di komputer saya. Saya memiliki akun outlook.com online, dapatkah saya menggunakannya untuk Host?
Doug Hauf

12

Pertama buka https://myaccount.google.com/lesssecureapps dan buat Izinkan aplikasi yang kurang aman menjadi kenyataan .

Kemudian gunakan kode di bawah ini. Kode di bawah ini hanya akan berfungsi jika alamat email Anda berasal dari 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

Jika Anda ingin surel dan kata sandi tidak muncul dalam kode Anda dan ingin server klien surel perusahaan Anda menggunakan kredensial windows Anda, gunakan di bawah ini.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Sumber


Ini sama dengan client.UseDefaultCredentials = true; meskipun
Alexander

4

Ini baru bekerja untuk saya pada Maret 2017. Dimulai dengan solusi dari atas "Akhirnya berhasil :)" yang tidak bekerja pada awalnya.

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

Fitur jawaban ini:

Berikut kode yang diekstrak:

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

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

Lihat Video: https://www.youtube.com/watch?v=bUUNv-19QAI


Meskipun video ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban khusus tautan dapat menjadi tidak valid jika halaman tertaut berubah
afxentios

msdn menyatakan untuk properti UseDefaultCredentials bahwa "Jika properti UseDefaultCredentials disetel ke false, maka nilai yang ditetapkan dalam properti Credentials akan digunakan untuk kredensial saat menghubungkan ke server." , oleh karena itu Anda harus mengatur properti UseDefaultCredentials menjadi false jika Anda telah menggunakan properti Credentials (kredensial khusus).
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;

Bacalah artikel ini untuk lebih jelasnya


1

Hanya perlu mencoba ini:

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 adalah pustaka klien lintas-platform .NET Open Source yang didasarkan pada MimeKit dan dioptimalkan untuk perangkat seluler. Ini memiliki lebih banyak dan memajukan fitur yang lebih baik daripada System.Net. Mail dukungan TNEF Microsoft melalui MimeKit.

Unduh paket nuget dari sini .

Lihat contoh ini Anda dapat mengirim email

            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

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

Inisialisasi MailMessagealamat email dengan pengirim dan penerima. Seharusnya seperti itu

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

Baca cuplikan kode lengkap tentang cara mengirim email di c #


0

ini akan bekerja juga ..

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
Harap pertimbangkan untuk menggunakan jawaban Anda untuk menjelaskan solusi dan mengapa penanya asli mengalami masalah alih-alih hanya memposting dinding kode. Ini akan lebih bermanfaat baik bagi penanya asli dan pengunjung masa depan untuk memahami mengapa masalah ini terjadi.
RedBassett

@RedBassett Terima kasih atas sarannya. Saya baru saja mengedit dan memasukkan beberapa informasi ke dalam komentar, lain kali saya ingat apa pun yang Anda katakan.
Dutt93
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.