Warum erhalte ich beim Senden einer SMTP-E-Mail die Meldung "Eigenschaft kann nicht zugewiesen werden"?


274

Ich kann nicht verstehen, warum dieser Code nicht funktioniert. Ich erhalte die Fehlermeldung, dass die Eigenschaft nicht zugewiesen werden kann

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
Wenn Sie versuchen, über Google Mail über SMTP zu senden, müssen Sie weniger sicheren Apps den Zugriff auf Ihr Konto ermöglichen. Support.google.com/accounts/answer/6010255?hl=de
Matthew Lock

Antworten:


362

mail.Tound mail.Fromsind schreibgeschützt. Verschieben Sie sie zum Konstruktor.

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 ist schreibgeschützt, von ist nicht. public MailAddressCollection To {get; }
MRB

41
Das liegt daran, dass es eine Sammlung ist. Sie können einfach hinzufügen, um es hinzuzufügen
Oskar Kjellin

17
@Oskar Okay, ich hätte genauer sein sollen. Sie können mail.to nicht auf eine bestimmte Adresse einstellen. Sie müssen den Konstruktor verwenden oder add aufrufen. Ich habe nur die erste Compiler-Warnung angesprochen: Fehler CS0200: Eigenschaft oder Indexer 'System.Net.Mail.MailMessage.To' kann nicht zugewiesen werden - es ist schreibgeschützt
MRB

9
@DougHauf Sie können die SmtpClient-Klasse mit einem kennwortgeschützten SMTP-Server verwenden. Ihr SMTP-Server scheint ein interner Server zu sein, was bedeuten würde, dass Ihr Programm nur dann eine Verbindung zu diesem SMTP-Server herstellen kann, wenn es sich im Netzwerk befindet. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
Clifford.duke

4
SmtpClient implementiert IDisposable, daher sollten Sie es wahrscheinlich ändern in: using (SmtpClient client = new SmtpClient ()) {...}
Mark Miller

261

Dies :

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

Sollte sein:

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

Wenn Sie diesen und den Standardkonstruktor MailMessageverwenden, können Sie das ToFeld festlegen , ohne das From
festzulegen. Dies

Kann mir jemand sagen, wie ich dies für meinen eigenen SMTP-Server anstelle von Google SMTP zum Laufen bringen kann? Ich {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}
erhalte

@YuDroid Stellen Sie die Hostund PortEigenschaften des SmtpClientkorrekt ein.
Mithrandir

@Mithrandir Ja, ich stelle es richtig ein. Ich habe mein SMTP-E-Mail-Konto in Outlook eingerichtet und alle erforderlichen Einstellungen von deren übernommen. Host und Port sind in der Datei Web.config deklariert und ich rufe sie zur Laufzeit ab.
YuDroid

121

Endlich funktioniert :)

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

Entschuldigung für die schlechte Rechtschreibung vor


5
Sollte es keine mm.Dispose () geben?
Steam

Übrigens ist der Standard-SMTP-Port 25.
Steam

2
Danke dir! Bis heute hat es funktioniert, aber stattdessen Outlook verwendet. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 ist sicher smtp.
user3800527

1
@ freej17 MailAddress hinzufügen copy = new MailAddress ("Notification_List@contoso.com"); mm.CC.Add (Kopie);
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
Dies spricht überhaupt nicht an, warum die Zuordnung des OP zu MailMessage Eigenschaften nicht möglich ist.
ProfK

17

So funktioniert es bei mir. Ich hoffe, Sie finden es nützlich

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

Von zu Hause aus habe ich weder einen internen Unternehmensserver noch Outlook.com auf meinem Computer. Ich habe ein Outlook.com-Konto online. Kann ich das für den Host verwenden?
Doug Hauf

12

Zuerst gehen Sie zu https://myaccount.google.com/lesssecureapps und machen Weniger sichere Apps zulassen wahr .

Verwenden Sie dann den folgenden Code. Der folgende Code funktioniert nur, wenn Ihre E-Mail-Adresse von Google Mail stammt.

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

Wenn Sie möchten, dass Ihre E-Mail-Adresse und Ihr Kennwort nicht in Ihrem Code angezeigt werden und Ihr Unternehmens-E-Mail-Client-Server Ihre Windows-Anmeldeinformationen verwenden soll, verwenden Sie unten.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Quelle


Dies ist dasselbe wie client.UseDefaultCredentials = true; obwohl
Alexander

4

Dies funktionierte nur für mich ab März 2017. Begonnen mit der Lösung von oben "Endlich funktioniert :)", die zunächst nicht funktionierte.

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

Diese Antwort enthält:

Hier ist der extrahierte Code:

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

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

Video anzeigen : https://www.youtube.com/watch?v=bUUNv-19QAI


Während dieses Video die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert
afxentios

msdn gab für die UseDefaultCredentials-Eigenschaft Folgendes an: "Wenn die UseDefaultCredentials-Eigenschaft auf false festgelegt ist, wird der in der Credentials-Eigenschaft festgelegte Wert für die Anmeldeinformationen verwendet, wenn eine Verbindung zum Server hergestellt wird." Daher müssen Sie die UseDefaultCredentials-Eigenschaft auf false setzen, wenn Sie die Credentials-Eigenschaft (benutzerdefinierte Anmeldeinformationen) verwendet haben.
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;

Weitere Informationen finden Sie in diesem Artikel


1

Ich muss es nur versuchen:

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 ist eine plattformübergreifende Open Source .NET-Mail-Client-Bibliothek, die auf MimeKit basiert und für mobile Geräte optimiert ist. Es bietet mehr und erweiterte Funktionen, die besser sind als die Unterstützung von System.Net.Mail Microsoft TNEF über MimeKit.

Laden Sie das Nuget-Paket hier herunter .

In diesem Beispiel können Sie E-Mails senden

            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

E-Mail per SMTP senden

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

Initialisieren MailMessageSie die E-Mail-Adressen von Absender und Empfänger. Es sollte so etwas sein

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

Lesen Sie den vollständigen Code-Ausschnitt zum Senden von E-Mails in c #


0

das würde auch funktionieren ..

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
Bitte verwenden Sie Ihre Antwort, um die Lösung zu erklären und zu erklären, warum der ursprüngliche Fragesteller auf ein Problem gestoßen ist, anstatt einfach eine Codewand zu veröffentlichen. Dies ist sowohl für den ursprünglichen Fragesteller als auch für zukünftige Besucher nützlicher, um zu verstehen, warum das Problem überhaupt aufgetreten ist.
RedBassett

@ RedBassett Danke für den Vorschlag. Ich habe gerade einige Informationen bearbeitet und in Kommentare eingefügt. Beim nächsten Mal denke ich an alles, was Sie erzählt haben.
Dutt93
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.