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 = "[email protected]"; // <-- this one
mail.From = "[email protected]";
mail.Subject = "this is a test email.";
mail.Body = "this is my test email body";
client.Send(mail);
Sam Stephenson
quelle
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("[email protected]", "[email protected]");
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);
MRB
quelle
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 = "[email protected]";

Sollte sein:

mail.To.Add(new MailAddress("[email protected]"));
Mithrandir
quelle
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("[email protected]","password");

MailMessage mm = new MailMessage("[email protected]", "[email protected]", "test", "test");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

client.Send(mm);

Entschuldigung für die schlechte Rechtschreibung vor

Sam Stephenson
quelle
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 ("[email protected]"); 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("[email protected]", "password");
    client.Send(Message); 
}
Mnyikka
quelle
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("[email protected]");
objeto_mail.To.Add(new MailAddress("[email protected]"));
objeto_mail.Subject = "Password Recover";
objeto_mail.Body = "Message";
client.Send(objeto_mail);
user2332898
quelle
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("[email protected]", "[email protected]", "Hello", mailBodyhtml);
        msg.To.Add("[email protected]");
        msg.IsBodyHtml = true;
        var smtpClient = new SmtpClient("smtp.gmail.com", 587); //**if your from email address is "[email protected]" then host should be "smtp.hotmail.com"**
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new NetworkCredential("[email protected]", "password");
        smtpClient.EnableSsl = true;
        smtpClient.Send(msg);
        Console.WriteLine("Email Sent Successfully");
    }
Siddarth Kanted
quelle
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

DoodleKana
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);
Doug Null
quelle
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; }
}
Fabian Bigler
quelle
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

Jishan Siddique
quelle
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

etwas
quelle
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);
}
Ahmed El-Hansy
quelle
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("[email protected]", "password");

                    smtpClient.Send(mailMessage);
                    Console.WriteLine("Success");
                }
            }
            catch (SmtpCommandException ex)
            {
                Console.WriteLine(ex.ToString());              
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());                
            }
Naveen
quelle
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);
        }
    }
Morteza Sefidi
quelle
0

das würde auch funktionieren ..

string your_id = "[email protected]";
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, "[email protected]", "subject", "body");
   client.Send(mm);
   Console.WriteLine("Email Sent");
 }
 catch (Exception e)
 {
   Console.WriteLine("Could not end email\n\n"+e.ToString());
 }
user3188978
quelle
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 = "[email protected]";
    string m_UserpassWord = "56436578";

    public void SendEmail(Customer _customers)
    {
        string emailID = gghdgfh@gmail.com;
        string userName = DemoUser;

        string emailFrom = "[email protected]";
        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);
            }
        }
    }
Dutt93
quelle
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