Bir SMTP e-postası gönderirken neden "" özellik atanamıyor "mesajı alıyorum?


274

Bu kodun neden çalışmadığını anlayamıyorum. Özellik atanamayacağını söyleyen bir hata alıyorum

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 aracılığıyla gmail yoluyla göndermeye çalışıyorsanız, support.google.com/accounts/answer/6010255?hl=tr
Matthew Lock

Yanıtlar:


362

mail.Tove mail.Fromsalt okunur. Onları yapıcıya taşıyın.

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
To salt okunur, den değil. public MailAddressCollection To {get; }
MRB

41
Çünkü bir koleksiyon. Sadece eklemek için arayabilirsiniz
Oskar Kjellin

17
@Oskar Tamam, bu yüzden daha spesifik olmalıydım. Mail.to'yu belirli bir adrese ayarlayamazsınız. Yapıcıyı kullanmalı veya add çağrısı yapmalısınız. Yalnızca ilk derleyici uyarısına yönelikti: Hata CS0200: Özellik veya dizinleyici 'System.Net.Mail.MailMessage.To' atanamıyor - salt okunur
MRB

9
@DougHauf SmtpClient sınıfını parola korumalı bir smtp sunucusuyla kullanabilirsiniz. smtp sunucunuz dahili bir sunucu gibi görünüyor, bu da programınızın yalnızca ağdayken o smtp sunucusuna bağlanabileceği anlamına gelir. client.Host = "mail.youroutgoingsmtpserver.com"; client.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
clifford.duke

4
SmtpClient IDisposable'ı uygular, bu yüzden muhtemelen bunu şu şekilde değiştirmeniz gerekir: using (SmtpClient client = new SmtpClient ()) {...}
Mark Miller

261

Bu :

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

Olmalı:

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

Bu kullanma ve varsayılan MailMessageyapıcı ayarlamak sağlar Toayarlamadan alanını Fromhangi değere varsayılan olarak, <SMTP> Eleman (Ağ Ayarları)
bstoney

Bunu Google SMTP yerine kendi SMTP sunucum için nasıl çalıştırabileceğimi kimse söyleyebilir mi? Ben alıyorum {"Unable to connect to the remote server"} {"The requested address is not valid in its context IP-ADDRESS:25"}benim SMTP sunucusuna bağlanmaya çalışıyorum hata
YuDroid

@YuDroid Hostve Portözelliklerini SmtpClientdoğru şekilde ayarlayın .
Mithrandir

@Mithrandir Evet Doğru ayarlıyorum. SMTP posta hesabımı Outlook'ta ayarladım ve gerekli tüm ayarları aldım. Host ve Port Web.config dosyasında bildirildi ve ben çalışma zamanı getiriyorum.
YuDroid

121

Sonunda çalıştım :)

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

daha önce kötü yazım için üzgünüm


5
Bir mm.Dispose () olmamalı mı?
buhar

Btw, varsayılan smtp portu 25'tir.
Steam

2
Teşekkür ederim! Bu güne kadar bile işe yaradı ama onun yerine bakış açısı kullandı. [client.Host = "smtp-mail.outlook.com";]
compski

6
587 güvenli smtp.
user3800527

1
@ freej17 MailAddress ekle copy = new MailAddress ("Notification_List@contoso.com"); mm.CC.Add (kopya);
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
Bu, OP'nin MailMessage özelliklere atamalarının neden yapılamadığını hiç göstermez.
ProfK

17

Benim için böyle çalışır. Umarım faydalı bulursun

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

Evden bilgisayarımda dahili bir şirket sunucum veya outlook.com yok. Çevrimiçi bir outlook.com hesabım var, bunu Ana Bilgisayar için kullanabilir miyim?
Doug Hauf

12

Önce https://myaccount.google.com/lesssecureapps adresine gidin ve Daha az güvenli uygulamalara izin ver'i doğru yapın .

Sonra aşağıdaki kodu kullanın. Aşağıdaki kod yalnızca e-posta adresiniz gmail adresinden geliyorsa çalışır.

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

E-postanızın ve şifrenizin kodunuzda görünmesini istemiyorsanız ve şirket e-posta istemcisi sunucunuzun Windows kimlik bilgilerinizi kullanmasını istiyorsanız aşağıda kullanın.

client.Credentials = CredentialCache.DefaultNetworkCredentials;

Kaynak


Bu, client.UseDefaultCredentials = true ile aynıdır; olsa da
Alexander

4

Bu benim için Mart 2017 itibariyle işe yaradı. Başlangıçta işe yaramayan "Nihayet işe başladı :)" yukarıdan çözümle başladı.

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

Bu cevap özellikleri:

İşte çıkarılan kod:

    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 Sınıfı:

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

Videoyu Görüntüle: https://www.youtube.com/watch?v=bUUNv-19QAI


Bu video soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantı verilen sayfa değişirse yalnızca bağlantı yanıtları geçersiz olabilir
afxentios

msdn , UseDefaultCredentials özelliği için "UseDefaultCredentials özelliği false olarak ayarlanırsa, sunucuya bağlanırken kimlik bilgileri için Kimlik Bilgileri özelliğinde ayarlanan değerin kullanılacağını" belirtir. bu nedenle, Kimlik Bilgileri özelliğini (özel kimlik bilgileri) kullandıysanız UseDefaultCredentials özelliğini false olarak ayarlamanız gerekir.
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;

Üzerinden gidin bu makalede daha fazla ayrıntı için


1

Bunu denemeniz yeterli:

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 tabanlı ve mobil cihazlar için optimize edilmiş bir Açık Kaynak platformlar arası .NET posta-istemci kitaplığıdır. System.Net'ten daha iyi ve gelişmiş özelliklere sahiptir.MailKit üzerinden Microsoft TNEF desteği.

Nuget paketini buradan indirin .

Posta gönderebileceğiniz bu örneğe bakın

            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 tarafından e-posta gönder

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İle gönderenin ve alıcının e-posta adreslerini başlatın . Gibi bir şey olmalı

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

C # e-posta göndermek için tam kod snippet'ini okuyun


0

bu da işe yarar ..

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
Lütfen çözümü ve orijinal askerin neden sadece bir kod duvarı göndermek yerine bir sorunla karşılaştığını açıklamak için yanıtınızı kullanmayı düşünün. Bu, hem orijinal asker hem de gelecekteki ziyaretçiler için sorunun neden ilk başta ortaya çıktığını anlaması için daha yararlı olacaktır.
RedBassett

@RedBassett Öneri için teşekkürler. Daha önce söyledikleriniz ne olursa olsun aklımda tuttuğumda, bazı bilgileri düzenledim ve yorumlara koydum.
Dutt93
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.