Tại sao tôi nhận được tài sản của Vik không thể được chỉ định khi gửi email SMTP?


274

Tôi không thể hiểu tại sao mã này không hoạt động. Tôi nhận được một lỗi nói rằng tài sản không thể được chỉ định

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 rằng nếu bạn đang cố gắng gửi qua gmail qua SMTP bạn cần phải cho phép các ứng dụng kém an toàn để truy cập tài khoản của bạn support.google.com/accounts/answer/6010255?hl=en
Matthew Khóa

Câu trả lời:


362

mail.Tomail.Fromchỉ đọc. Di chuyển chúng đến các nhà xây dựng.

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 là chỉ đọc, từ không. MailAddressCollection công khai Để {get; }
MRB

41
Đó là bởi vì đó là một bộ sưu tập. Bạn chỉ có thể gọi thêm vào nó
Oskar Kjellin

17
@Oskar Được rồi, vì vậy tôi nên được cụ thể hơn. Bạn không thể đặt mail.to đến một địa chỉ cụ thể. Bạn phải sử dụng hàm tạo hoặc gọi thêm. Tôi chỉ giải quyết cảnh báo trình biên dịch đầu tiên: Lỗi CS0200: Thuộc tính hoặc bộ chỉ mục 'System.Net.Mail.MailMessage.To' không thể được gán cho - nó chỉ được đọc
MRB

9
@DougHauf Bạn có thể sử dụng lớp SmtpClient với máy chủ smtp được bảo vệ bằng mật khẩu. máy chủ smtp của bạn dường như là một máy chủ nội bộ, điều đó có nghĩa là chương trình của bạn sẽ chỉ có thể kết nối với máy chủ smtp đó khi có trên mạng. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke 23/12/13

4
SmtpClient triển khai IDis Dùng một lần, vì vậy bạn có thể nên đổi nó thành: bằng cách sử dụng (SmtpClient client = new SmtpClient ()) {...}
Mark Miller

261

Điều này :

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

Nên là:

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

Sử dụng công cụ này và hàm tạo mặc định MailMessagecho phép bạn đặt Totrường mà không đặt trường From, sẽ mặc định thành giá trị trong <smtp> Element (Cài đặt mạng)
bstoney

Ai đó có thể cho tôi biết làm thế nào tôi có thể làm cho nó hoạt động cho máy chủ SMTP của riêng tôi thay vì Google SMTP không? Tôi đang {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}gặp lỗi khi tôi đang cố gắng kết nối với máy chủ SMTP của mình
YuDroid

@YuDroid Đặt chính xác HostPortcác thuộc tính của SmtpClientchính xác.
Mithrandir

@Mithrandir Có, tôi đang đặt chính xác. Tôi đã thiết lập tài khoản thư SMTP của mình trong Outlook và lấy tất cả các cài đặt cần thiết từ chúng. Máy chủ và Cổng được khai báo trong tệp Web.config và tôi đang tìm nạp thời gian chạy.
YuDroid

121

Cuối cùng cũng làm việc :)

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

xin lỗi về lỗi chính tả trước


5
Không nên có mm.Dispose ()?
Steam

Btw, cổng smtp mặc định là 25.
Steam

2
Cảm ơn bạn! Ngay cả cho đến ngày nay nó vẫn hoạt động nhưng sử dụng triển vọng thay thế. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 là an toàn smtp.
dùng3800527

1
@ freej17 thêm bản sao MailAddress = new MailAddress ("Notification_List@contoso.com"); mm.CC.Add (bản sao);
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
Điều này hoàn toàn không giải quyết được tại sao việc gán OP cho MailMessage các thuộc tính không thể được thực hiện.
ProfK

17

Đây là cách nó làm việc cho tôi. Hi vọng bạn tìm được thứ hữu dụng

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

Ở nhà tôi không có máy chủ công ty nội bộ cũng như triển vọng.com trên máy tính của mình. Tôi có một tài khoản triển vọng trực tuyến, tôi có thể sử dụng tài khoản đó cho Máy chủ không?
Doug Hauf

12

Trước tiên, hãy truy cập https://myaccount.google.com/lesssecurur lại và làm cho Cho phép các ứng dụng kém an toàn hơn thành sự thật .

Sau đó sử dụng mã dưới đây. Mã dưới đây sẽ chỉ hoạt động nếu địa chỉ email của bạn là từ 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

Nếu bạn muốn email và mật khẩu của bạn không xuất hiện trong mã của bạn và muốn máy chủ email của công ty bạn sử dụng thông tin đăng nhập windows của bạn, hãy sử dụng bên dưới.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Nguồn


Điều này giống như client.UseDefaultCredentials = true; mặc dù
Alexander

4

Điều này chỉ hoạt động với tôi vào tháng 3 năm 2017. Bắt đầu với giải pháp từ phía trên "Cuối cùng cũng có hiệu quả :)" lúc đầu không hoạt động.

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

Câu trả lời này có tính năng:

Đây là mã được trích xuất:

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

Lớp 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");

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


Mặc dù video này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi
afxentios

MSDN nêu cho UseDefaultCredentials tài sản đó "Nếu tài sản UseDefaultCredentials được thiết lập để sai, sau đó thiết lập giá trị trong thuộc tính Credentials sẽ được sử dụng cho các chứng chỉ khi kết nối với máy chủ." , do đó, bạn sẽ đặt thuộc tính UseDefaultCredentials thành false nếu bạn đã sử dụng thuộc tính Thông tin xác thực (thông tin tùy chỉnh).
Sergei Iashin 17/03/2017

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;

Xem qua bài viết này để biết thêm chi tiết


1

Chỉ cần thử điều này:

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 là một thư viện ứng dụng thư khách .NET đa nền tảng mã nguồn mở dựa trên MimeKit và được tối ưu hóa cho các thiết bị di động. Nó có nhiều tính năng và nâng cao tốt hơn System.Net. Gửi hỗ trợ Microsoft TNEF thông qua MimeKit.

Tải gói nuget từ đây .

Xem ví dụ này bạn có thể gửi thư

            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

gửi email bằng 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

Khởi tạo MailMessageđịa chỉ email của người gửi và người nhận. Nó phải là một cái gì đó như

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

Đọc đoạn mã đầy đủ về cách gửi email trong c #


0

điều này cũng sẽ làm việc ..

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
Vui lòng xem xét sử dụng câu trả lời của bạn để giải thích giải pháp và lý do tại sao người hỏi ban đầu gặp vấn đề thay vì chỉ đăng một bức tường mã. Điều này sẽ hữu ích hơn cho cả người hỏi ban đầu và khách truy cập trong tương lai để hiểu lý do tại sao vấn đề xảy ra ở nơi đầu tiên.
RedBassett

@RedBassett Cảm ơn bạn đã gợi ý. Tôi chỉ chỉnh sửa và đưa một số thông tin vào bình luận, lần sau tôi sẽ ghi nhớ bất cứ điều gì bạn nói.
Dutt93
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.