Чому я отримую "" властивість не можна призначити "під час надсилання електронного листа 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, вам потрібно дозволити менш захищеним програмам отримати доступ до вашого акаунта support.google.com/accounts/answer/6010255?hl=uk
Метью Блокування

Відповіді:


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 читається тільки, з ні. загальнодоступна пошта MailAddressCollection To {get; }
MRB

41
Це тому, що це колекція. Ви можете просто зателефонувати додати до нього
Оскар Келлін

17
@Oskar Добре, тому я повинен був бути більш конкретним. Ви не можете встановити 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, тому, ймовірно, слід змінити його на: використання (клієнт SmtpClient = новий SmtpClient ()) {...}
Марк Міллер

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 Так, я правильно його встановлюю. Я налаштував свій обліковий запис пошти 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
Чи не повинно бути мм.
Паровий

Btw, за замовчуванням порт SMTP - 25.
Steam

2
Дякую! До цього дня це працювало, але замість цього використовували перспективи. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 - безпечна smtp.
користувач3800527

1
@ freej17 додати копію MailAddress = новий 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
Це зовсім не стосується того, чому присвоєння ОП MailMessage властивостям неможливо.
ПрофК

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 в Інтернеті, чи можу я використовувати його для хоста?
Даг Хауф

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; хоча
Олександр

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


Хоча це відео може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідок. Відповіді лише на посилання можуть стати недійсними, якщо
змінена

msdn заявив для властивості UseDefaultCredentials, що "Якщо для властивості UseDefaultCredentials встановлено значення false, то значення, задане у властивості Credentials, буде використовуватися для облікових даних при підключенні до сервера." , отже, слід встановити властивість UseDefaultCredentials значення false, якщо ви використовували властивість Credentials (спеціальні облікові дані).
Сергій Іашин

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.

Завантажте пакунок нугету звідси .

Дивіться цей приклад ви можете відправляти пошту

            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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.