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.