เหตุใดฉันจึงได้รับ“ 'ไม่สามารถกำหนดคุณสมบัติ” เมื่อส่งอีเมล SMTP


274

ฉันไม่เข้าใจว่าทำไมรหัสนี้ใช้งานไม่ได้ ฉันได้รับข้อผิดพลาดว่าทรัพย์สินไม่สามารถกำหนดได้

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
หากว่าคุณพยายามส่งผ่าน gmail ผ่าน SMTP คุณต้องอนุญาตแอปที่ปลอดภัยน้อยกว่าให้เข้าถึงบัญชีของคุณได้ที่support.google.com/accounts/answer/6010255?hl=th
Matthew Lock

คำตอบ:


362

mail.Toและmail.Fromอ่านได้อย่างเดียว ย้ายไปยังตัวสร้าง

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
เมลหากต้องการอ่านอย่างเดียวจากไม่ใช่ MailAddressCollection สาธารณะถึง {รับ; }
MRB

41
นั่นเป็นเพราะมันเป็นคอลเลกชัน คุณสามารถโทรเพิ่มได้เลย
Oskar Kjellin

17
@ ออสการ์โอเคดังนั้นฉันควรจะเจาะจงมากขึ้น คุณไม่สามารถตั้งค่า mail.to เป็นที่อยู่เฉพาะ คุณต้องใช้ตัวสร้างหรือการโทรเพิ่ม ฉันกำลังพูดถึงคำเตือนคอมไพเลอร์ครั้งแรกเท่านั้น: ข้อผิดพลาด CS0200: คุณสมบัติหรือตัวทำดัชนี 'System.Net.Mail.MailMessage.To' ไม่สามารถกำหนดได้ - เป็นแบบอ่านอย่างเดียว
MRB

9
@DougHauf คุณสามารถใช้คลาส SmtpClient กับเซิร์ฟเวอร์ smtp ที่ป้องกันด้วยรหัสผ่าน เซิร์ฟเวอร์ smtp ของคุณดูเหมือนจะเป็นเซิร์ฟเวอร์ภายในซึ่งหมายความว่าโปรแกรมของคุณจะสามารถเชื่อมต่อกับเซิร์ฟเวอร์ smtp นั้นเมื่ออยู่ในเครือข่ายเท่านั้น client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke

4
SmtpClient ใช้ IDisposable ดังนั้นคุณควรเปลี่ยนเป็น: using (SmtpClient client = new SmtpClient ()) {... }
Mark Miller

261

นี้ :

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

ควรจะเป็น:

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

การใช้สิ่งนี้และคอนMailMessageสตรัคเตอร์เริ่มต้นช่วยให้คุณสามารถตั้งค่าToฟิลด์โดยไม่ต้องตั้งค่าFromซึ่งจะใช้ค่าเริ่มต้นเป็นค่าในองค์ประกอบ <smtp> (การตั้งค่าเครือข่าย)
bstoney

ใครช่วยบอกฉันฉันจะทำให้การทำงานนี้สำหรับเซิร์ฟเวอร์ SMTP ของฉันเองแทนที่จะเป็น Google SMTP ได้อย่างไร ฉันได้รับ{"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}ข้อผิดพลาดเมื่อฉันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ SMTP ของฉัน
YuDroid

@YuDroid ตั้งค่าHostและPortคุณสมบัติของSmtpClientอย่างถูกต้อง
Mithrandir

@Mithrandir ใช่ฉันตั้งอย่างถูกต้อง ฉันได้ตั้งค่าบัญชีอีเมล SMTP ใน Outlook และดึงการตั้งค่าที่จำเป็นทั้งหมดจากพวกเขา มีการประกาศโฮสต์และพอร์ตในไฟล์ Web.config และฉันกำลังเรียกข้อมูลรันไทม์
YuDroid

121

ในที่สุดก็ทำงาน :)

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

ขออภัยเกี่ยวกับการสะกดคำที่ไม่ดีมาก่อน


5
ไม่ควรจะมี mmDispose ()?
Steam

Btw พอร์ต smtp เริ่มต้นคือ 25
Steam

2
ขอบคุณ! แม้กระทั่งทุกวันนี้ก็ใช้งานได้ แต่ใช้มุมมองแทน [client.Host = "smtp-mail.outlook.com";]
compski

6
587 ปลอดภัย smtp
user3800527

1
@ freej17 เพิ่ม MailAddress copy = MailAddress ใหม่ ("Notification_List@contoso.com"); mm.CC.Add (สำเนา);
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
ที่อยู่นี้ไม่ได้เลยว่าทำไมการกำหนด OP ถึงMailMessage คุณสมบัติไม่สามารถทำได้
ProfK

17

นี่คือวิธีการทำงานสำหรับฉัน หวังว่าคุณจะพบว่ามีประโยชน์

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

จากที่บ้านฉันไม่มีเซิร์ฟเวอร์ของ บริษัท ภายในหรือ outlook.com บนคอมพิวเตอร์ของฉัน ฉันมีบัญชี outlook.com ออนไลน์ฉันสามารถใช้มันเพื่อโฮสต์ได้หรือไม่
Doug Hauf

12

แรกไปที่https://myaccount.google.com/lesssecureappsและให้อนุญาตให้แอปที่ปลอดภัยน้อยจริง

จากนั้นใช้รหัสด้านล่าง รหัสด้านล่างนี้จะใช้งานได้ก็ต่อเมื่อจากที่อยู่อีเมลของคุณมาจาก 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

หากคุณต้องการให้อีเมลและรหัสผ่านไม่ปรากฏในรหัสของคุณและต้องการให้เซิร์ฟเวอร์ไคลเอนต์อีเมล บริษัท ของคุณใช้ข้อมูลรับรอง windows ของคุณใช้ด้านล่าง

client.Credentials = CredentialCache.DefaultNetworkCredentials;

แหล่ง


สิ่งนี้เหมือนกับ client.UseDefaultCredentials = true แม้ว่า
Alexander

4

สิ่งนี้ใช้ได้กับฉันเมื่อเดือนมีนาคม 2017 เริ่มต้นด้วยวิธีแก้ปัญหาจากด้านบน "ในที่สุดก็เริ่มทำงาน :)" ซึ่งไม่ได้ผลในตอนแรก

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

คุณสมบัติคำตอบนี้:

นี่คือรหัสสกัด:

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

คลาส 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");

ดูวิดีโอ: https://www.youtube.com/watch?v=bUUNv-19QAI


แม้ว่าวิดีโอนี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงก์อย่างเดียวอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
afxentios

msdnระบุไว้สำหรับคุณสมบัติ UseDefaultCredentials ที่"ถ้าคุณสมบัติ UseDefaultCredentials ถูกตั้งค่าเป็นเท็จค่าที่ตั้งในคุณสมบัติหนังสือรับรองจะถูกใช้เป็นข้อมูลประจำตัวเมื่อเชื่อมต่อกับเซิร์ฟเวอร์" ดังนั้นคุณจะต้องตั้งค่าคุณสมบัติ UseDefaultCredentials เป็นเท็จหากคุณใช้คุณสมบัติข้อมูลรับรอง (หนังสือรับรองที่กำหนดเอง)
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;

อ่านบทความนี้สำหรับรายละเอียดเพิ่มเติม


1

เพียงแค่ต้องลอง:

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 เป็นไลบรารีไคลเอนต์จดหมายข้ามแพลตฟอร์ม. NET แบบโอเพ่นซอร์สที่ใช้ MimeKit และปรับให้เหมาะสมสำหรับอุปกรณ์มือถือ มันมีคุณสมบัติมากขึ้นและก้าวหน้ากว่า System.Net.Mail รองรับ Microsoft TNEF ผ่าน MimeKit

ดาวน์โหลดแพคเกจ nuget จากที่นี่

ดูตัวอย่างนี้คุณสามารถส่งจดหมาย

            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

ส่งอีเมลโดย 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

เริ่มต้นMailMessageด้วยที่อยู่อีเมลของผู้ส่งและผู้รับ มันควรจะเป็นสิ่งที่ชอบ

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

อ่านตัวอย่างโค้ดแบบเต็มของวิธีการส่งอีเมลใน c #


0

มันก็ใช้ได้เหมือนกัน ..

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
โปรดลองใช้คำตอบของคุณเพื่ออธิบายวิธีแก้ปัญหาและสาเหตุที่ผู้ถามเดิมกำลังพบเจอปัญหาแทนที่จะเพียงแค่โพสต์ข้อความ สิ่งนี้จะมีประโยชน์มากขึ้นสำหรับทั้งผู้ถามดั้งเดิมและผู้มาเยี่ยมชมในอนาคตเพื่อทำความเข้าใจว่าทำไมปัญหาเกิดขึ้นตั้งแต่แรก
RedBassett

@ RedBassett ขอบคุณสำหรับคำแนะนำ ฉันเพิ่งแก้ไขและใส่ข้อมูลลงในความคิดเห็นในครั้งต่อไปที่ฉันจำสิ่งที่คุณบอก
Dutt93
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.