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
SMTP를 통해 Gmail을 통해 전송하려는 경우 보안 수준이 낮은 앱이 계정에 액세스하도록 허용해야합니다. support.google.com/accounts/answer/6010255?hl=ko
— 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
mail.To는 읽기 전용이며 from은 아닙니다. public MailAddressCollection받는 사람 {get; }
— MRB

41
컬렉션이기 때문입니다. 당신은 그것에 추가 호출 할 수 있습니다
— Oskar Kjellin

17
@Oskar 좋아요, 좀 더 구체적으로 말해야합니다. mail.to를 특정 주소로 설정할 수 없습니다. 생성자를 사용하거나 add를 호출해야합니다. 첫 번째 컴파일러 경고 만 해결했습니다. 오류 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 at 10:10

누구든지 Google SMTP 대신 내 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 예 올바르게 설정하고 있습니다. Outlook에서 SMTP 메일 계정을 설정하고 필요한 모든 설정을 가져 왔습니다. 호스트와 포트는 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
mm.Dispose ()가 없어야합니까?
— Steam

Btw, 기본 smtp 포트는 25입니다.
— Steam

2
감사합니다! 오늘까지도 효과가 있었지만 대신 전망을 사용했습니다. [client.Host = "smtp-mail.outlook.com";]
— compski

6
587은 안전한 smtp입니다.
— user3800527

1
@ freej17 add MailAddress copy = 새 MailAddress ( "Notification_List@contoso.com"); mm.CC.Add (사본);
— 샘 스티븐슨

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 로 이동하여 보안 수준이 낮은 앱 허용을 true로 설정하십시오 .

그런 다음 아래 코드를 사용하십시오. 아래 코드는 이메일 주소가 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 년 3 월 현재 저에게 효과적이었습니다. 처음에는 작동하지 않는 "최종 작동 :)"의 솔루션으로 시작했습니다.

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 속성이 false로 설정된 경우 서버에 연결할 때 자격 증명 속성에 설정된 값이 자격 증명에 사용됩니다"라고 말했습니다. 따라서 신임 정보 특성 (사용자 정의 신임 정보)을 사용한 경우 UseDefaultCredentials 특성을 false로 설정해야합니다.
— 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은 MimeKit을 기반으로하며 모바일 장치에 최적화 된 오픈 소스 크로스 플랫폼 .NET 메일 클라이언트 라이브러리입니다. MimeKit을 통한 System.Net.Mail Microsoft TNEF 지원보다 더 나은 기능을 제공합니다.

여기서 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.