it-swarm-tr.com

C # ile Gmail SMTP sunucusu üzerinden e-posta gönderme

Nedense ne kabul edilen cevap ne de başkaları benim için " .NET'te Gmail üzerinden e-posta gönderme " için çalışıyor. Neden çalışmıyorlar?

GÜNCELLEME: Diğer sorudaki tüm cevapları (kabul edildi ve aksi halde) denedim, ancak hiçbiri çalışmıyor.

Bunun başkaları için işe yarayıp yaramadığını bilmek istiyorum, aksi takdirde Google daha önce olmuş bir şeyi değiştirmiş olabilir.

SmtpDeliveryMethod.Network kullanan bir kod parçasını denediğimde, hızlıca SmtpException Send (message) mesajı alıyorum. Mesaj

SMTP sunucusu güvenli bir bağlantı gerektirir veya istemcinin kimliği doğrulanmadı.

Sunucu yanıtı şuydu:

5.5.1 Kimlik Doğrulama Gerekli. Daha fazla bilgi için "<- cidden, orada bitiyor.

GÜNCELLEME:

Bu uzun zaman önce sorduğum bir soru ve kabul edilen cevap, farklı projelerde defalarca kullandığım kod.

Bir Codeplex'te EmailSender projesi oluşturmak için bu yayındaki fikirlerden ve diğer EmailSender projelerinden bazılarını aldım. Test edilebilirlik için tasarlanmıştır ve GoDaddy ve Gmail gibi en sevdiğim SMTP servislerini destekliyor.

234
CVertex

AŞAĞIDAKİBUNUN GERÇEKLEŞTİRİLMESİ GERÇEKLEŞTİRİLECEKSORULARINIZATÜM ELSE BAŞARISIZ:

Tam olarak aynı hatayı aldım, Google'ın yeni parola strengh ölçüm algoritmasının mevcut şifremi çok zayıf olarak kabul ederek değiştiğini ve bana bunun hakkında bir şey söylemediğini (bir mesaj veya uyarı bile değil) değiştirdiğini ortaya koydu. ? Yardım edip etmeyeceğini görmek için şifremi değiştirmeyi seçtim (boşuna olan her şeyi denedi) ve şifremi değiştirdiğimde işe yaradı!

Daha sonra, bir deneme için, ne olacağını görmek için şifremi önceki şifremle değiştirmeyi denedim ve Gmail aslında bunu yapmama izin vermedi, bunun nedeni olarak "üzgünüm bu değişikliği seçtiğiniz şekilde kaydetmenize izin veremiyoruz. şifre çok zayıf "ve eski şifremi geri döndürmeme izin vermedi. Bundan yanlış olduğunu düşündüm, çünkü a) şifrenizi her x ayda bir veya b) bir kez değiştirmeniz gerekir. Daha önce de söylediğim gibi, şifre güç algoritmaları değişti ve bu nedenle başka bir yerde oturum açmaya çalışırken herhangi bir şey söylememiş olsalar bile zayıf şifre kabul edilmedi! Bu (2 numaralı) en olası senaryodur, çünkü zayıf şifrem 4 ay kadar eskiydi ve Gmail’de kullanmama izin verdi.

Bu konuda hiçbir şey söylememeleri oldukça kötü, ama mantıklı. Kaçırılan e-postaların çoğu, gmail dışında bir yazılım kullanarak oturum açtığından ve Gmail’i Gmail’in dışında kullanmak istiyorsanız daha güçlü bir parola almanız gerektiğini tahmin ediyorum.

Umarım bu yardımcı olur!

67

Yukarıdaki diğer sorun giderme adımlarına ek olarak, GMail hesabınızda iki faktörlü kimlik doğrulamasını etkinleştirdiyseniz (ayrıca iki aşamalı doğrulama olarak da bilinir), uygulamaya özel bir şifre oluşturmalı ve bu yeni oluşturulan şifreyi SMTPile doğrulamak için kullanmalıdır.

Bir tane oluşturmak için: https://www.google.com/settings/ adresini ziyaret edin ve Şifreyi oluşturmak için uygulamaları ve siteleri yetkilendirme öğesini seçin.

65
John Rasch
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Gmail Ayarına Bağlantı

enter image description here

51
Suhail Mumtaz Awan

Söz konusu durumların birçoğundan dolayı gmail hesabımdan da e-posta gönderirken bazı sorunlar yaşadım. İşte nasıl çalıştığımın ve aynı zamanda esnek kalmamın bir özeti:

  • Öncelikle GMail hesabınızı ayarlayın:
    • IMAP'yi etkinleştirin ve doğru maksimum sayıda iletiyi belirtin (burada bunu yapabilirsiniz)
    • Şifrenizin en az 7 karakter ve güçlü olduğundan emin olun (Google’a göre)
    • Önce bir kod kodu girmeniz gerekmediğinden emin olun. Bunu, tarayıcınızdan bir test e-postası göndererek yapabilirsiniz.
  • Web.config'te (veya app.config'de değişiklik yapın, henüz denemedim, ancak bir windows uygulamasında çalışmanın kolay olduğunu düşünüyorum):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="[email protected]" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    Host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="[email protected]"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

Ve şimdi ne zaman e-posta göndermek istediğinizde tek yapmanız gereken şey SSLMail.SendMail:

örneğin. PasswordRecovery denetimine sahip bir Sayfada:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

Veya kodunuzun herhangi bir yerinde çağırabilirsiniz:

SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})

Umarım bu, bu yazıyla karşılaşan herkese yardımcı olur! (VB.NET kullandım, ancak herhangi bir .NET diline dönüştürmenin önemsiz olduğunu düşünüyorum.)

29
Sebas

Ah ... Bu şaşırtıcı ... Önce herhangi bir nedenden dolayı bir e-posta gönderemedim. Ancak bu iki çizginin sırasını aşağıdaki gibi değiştirdikten sonra mükemmel çalışıyor.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");

Umarım bu yardım !!! :)

13
Wirol
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","test","testbody")

"SMTP sunucusu güvenli bir bağlantı gerektirir veya istemci kimliği doğrulanmadı." Gibi bir hata alırsanız Sunucu yanıtı: 5.5.1 Kimlik Doğrulama Gerekli. Daha fazla bilgi edinin "adresinden önce aldığım gibi, SMTPClientObj.UseDefaultCredentials = False satırının dahil edildiğinden emin olun ve SMTPClientObj.Credentials önce satır olmalıdır.

Bu 2 satırı ters yönde değiştirmeye çalıştım ve 5.5.1 Kimlik Doğrulama Gerekli hatası döndürüldü.

13
Terry Chng

Bunu düzeltmek için basit adımlar:

1) Gmail'inizde oturum açın

2) Bu sayfaya gidin https://www.google.com/settings/security/lesssecureapps & "Aç" olarak ayarlayın

10
Kevin

Aynı sorunu yaşadım, ancak virüs korumamın giden "spam" e-postalarını engelliyor olduğu ortaya çıktı. Bunu kapatmak, GMail yoluyla SMTP e-postası göndermek için 587 numaralı bağlantı noktasını kullanmama izin verdi.

9
user464329

Sorun, gmail üzerinden gönderilebilecek teknik özelliklerden biri değil. Bu çoğu durumda işe yarar. Bir makinenin göndermesini sağlayamazsanız, bunun nedeni genellikle makinenin kontrollerde en az bir kez bir insanla kimliği doğrulanmamış olmasıdır.

Çoğu kullanıcının karşılaştığı sorun, Google’ın giden sınırlarını her zaman değiştirmeye karar vermesidir. Çözümünüze her zaman savunma kodu eklemelisiniz. Hataları görmeye başlarsanız, gönderme hızınızdan çıkın ve bir süre göndermeyi bırakın. Google’ı göndermeyi denemeye devam ederseniz, bazen tekrar göndermeden önce gecikme sürenize fazladan zaman ekler.

Mevcut sistemimde yaptığım şey, her bir mesaj arasında 1,5 saniyelik bir gecikmeyle göndermek. Ardından herhangi bir hata alırsam 5 dakika durun ve sonra tekrar başlayın. Bu genellikle çalışır ve hesabın sınırlarına kadar göndermenize izin verir (son kontrolün günlük müşteri girişleri için 2.000 olduğunu kontrol ettim).

9
Jason Short

Bunun için hangi .NET sürümünün gerektiğinden emin değilim çünkü eglasius, eşleşen bir enableSsl ayarı olmadığını belirtti. bu yapılandırma benim için işe yaradı (ve herhangi bir programlı yapılandırma kullanmanızı gerektirmez):

<system.net>
  <mailSettings>
    <smtp from="[email protected]" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" Host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
    </smtp>
  </mailSettings>
</system.net>

Önce Gmail hesabınızda POP veya IMAP’ı etkinleştirmeniz gerekebilir: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Önce normal bir posta istemcisiyle denemeyi öneririm ...

8
Wiebe Tijsma

Burada sizin için başka hiçbir şey çalışmadıysa, üçüncü taraf uygulamalardan gmail hesabınıza erişime izin vermeniz gerekebilir. Bu benim sorunumdu. Erişime izin vermek için aşağıdakileri yapın:

  1. Gmail hesabınıza giriş yapın.
  2. Bu sayfayı ziyaret edin https://accounts.google.com/DisplayUnlockCaptcha ve erişime izin vermek için düğmesine tıklayın.
  3. Bu sayfayı ziyaret edin https://www.google.com/settings/security/lesssecureapps ve daha az güvenli uygulamalara erişimi etkinleştirin.

Bu benim için çalıştı umarım başkası için işe yarar!

8
Celt

Kurumsal VPN bağlantısı kullanıyordum. Başvurumdan e-posta gönderemememin nedeni buydu. VPN ile bağlantısını kesersem çalışır.

6
Ned

@Andres Pompiglio: Evet doğru, şifrenizi en az bir kere değiştirmeniz gerekir. Bu kod gayet iyi çalışıyor:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

VE işlevini kullanarak aşağıdakileri yapabilirsiniz:

Response.Write(SendMail(recipient Address, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

Aynı hatayı alıyordum ve yukarıdaki çözümlerin hiçbiri yardımcı olmadı.

Benim sorunum, kodu, hiçbir zaman gmail hesabına giriş yapmak için kullanılmamış bir uzak sunucudan çalıştırıyor olmamdı.

Uzak sunucuda bir tarayıcı açtım ve oradan gmail'e giriş yaptım. Bu yeni bir yer olduğundan beri benim olduğumu doğrulamak için bir güvenlik sorusu sordu. Güvenlik kontrolünü yaptıktan sonra kodla doğrulamayı başardım.

5
Vlad Tamas

Ayrıca giriş yapmak için kullandığım hesabın bir nedenden dolayı google tarafından devre dışı bırakıldığını tespit ettim. Şifremi sıfırladığımda (eskisi gibi), sonra e-postaları gayet iyi gönderebildim. Ayrıca 5.5.1 mesajı alıyordum.

5
RKL

Hesabınız için daha az güvenli uygulamaları açın: https://www.google.com/settings/security/lesssecureapps

5
Burak Kalkan

Ayrıca birçok çözümü denedim ama işe yarayacak bazı değişiklikler yapın

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

yukarıdaki parametrelerin smtpclient ile gmail iş

5
Suresh

Sizin için başka bir olası çözüm. IMAP üzerinden gmail’e bağlanmada benzer sorunlar yaşıyordum. Karşılaştığım tüm çözümleri denedikten sonra, burada ve başka yerlerde okuyacağınız SO (örneğin, IMAP'yi etkinleştirin, https: // hesapları) kullanarak postalarınıza daha az güvenli erişim sağlayın. google.com/b/0/displayunlockcaptcha ve benzeri), aslında bir kez daha yeni bir gmail hesabı oluşturdum.

Orijinal testimde, oluşturduğum ilk gmail hesabını ana gmail hesabıma bağladım. Bu, yanlış hesaba google tarafından başvurulmakta olduğu hatalı davranışlarla sonuçlandı. Örneğin, çalışan https://accounts.google.com/b/0/displayunlockcaptcha bu amaçla oluşturduğum hesap yerine ana hesabımı açtı.

Yeni bir hesap oluşturduğumda ve ana hesabıma bağlayamadığımda, yukarıdaki tüm uygun adımları uyguladıktan sonra, bunun iyi çalıştığını buldum!

Bunu henüz doğrulamamıştım (yani çoğaltılmış), ancak görünüşe göre benim için yaptı ... umarım yardımcı olur.

4
sinewave440hz

Aynı hatayı aradım ("SMTP sunucusu güvenli bir bağlantı gerektiriyor veya müşteri kimliği doğrulanmadı. Sunucu yanıtı şuydu: 5.5.1 Kimlik Doğrulama Gerekli. Daha fazla bilgi edinin") ve şunu öğrendim: yanlış şifre kullanıyordu. Giriş bilgilerimi düzelttim ve doğru şekilde gönderildi.

Bunun geç olduğunu biliyorum, ama belki bu başka birine yardımcı olabilir.

4
Albert Bori
  1. Öncelikle gmail hesap ayarlarınızı kontrol edin ve "Daha az güvenli uygulamalar için erişim" --- 'den Açın enter image description here

Hesabınıza erişmek için Gmail gibi güvenli bir uygulama kullanmanızı kesinlikle öneririz. Google tarafından yapılan tüm uygulamalar bu güvenlik standartlarına uygundur. Daha az güvenli bir uygulama kullanmak, diğer yandan, hesabınızı savunmasız bırakabilir. Daha fazla bilgi edin.

  1. Ayarlamak

    smtp.UseDefaultCredentials = false;
    

    önce

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    
4
reza.cse08

Bulduğum bir diğer şey de şifrenizi en az bir kere değiştirmeniz gerektiğidir. Ve güvenli bir seviye şifresi kullanmaya çalışın (aynı kullanıcıyı şifre, 123456 vb. İle kullanmayın).

4
Andres Pompiglio

Bu sorunu çözdüm. Görünüşe göre bu mesaj birden fazla hata türünde kullanılıyor. Benim sorunum maksimum 500 gönderilen postama ulaşmamdı.

hesaba giriş yapın ve el ile posta göndermeyi deneyin. Sınıra ulaşıldığında, sizi bilgilendirir

3
Ayson Baxter

Bağlantı noktası 465 üzerinden de bağlanabilir, ancak System.Net.Mail ad alanının bazı kısıtlamaları nedeniyle kodunuzu değiştirmeniz gerekebilir. Bunun nedeni, ad alanının örtük SSL bağlantıları kurma olanağı sunmamasıdır. Bu, http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465) adresinde tartışılmaktadır. aspx ve CDO'nun (Ortak Veri Nesnesi) başka bir tartışmada nasıl kullanılacağına dair bir örnek verdim ( tüm portlarda C # .Net hataları ile GMail SMTP ).

3
Bryan Allred

Bu hatanın bir veya daha fazla nedeni var.

  • Yerel sisteminizde Gmail'inizle (veya varsa) giriş yapın.

  • Ayrıca Daha Az Güvenli Uygulama olup olmadığını kontrol edin ve "Açık" olarak ayarlayın, işte GMAIL için Link. https://www.google.com/settings/security/lesssecureapps

  • e-posta kodunuzda EnableSsl olup olmadığını kontrol edin ve doğru olarak ayarlayın.

    smtp.EnableSsl = true;
    
  • Ayrıca şu anda hangi bağlantı noktasını kullandığınızı da kontrol edin. 25 Global, ancak 587 gibi başkalarını da kontrol edebilirsiniz. Tüm SMTP iletişimi 25'ten fazla mı oluyor?

  • UZAKTANysanız : Yukarıdaki Vlad Tamas yanıtını kontrol edin.

2
Bharat
smtp.Host = "smtp.gmail.com"; //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;
2
somesh

Gmail şifrenizi değiştirin ve tekrar deneyin, bundan sonra çalışması gerekir.

Nedenini bilmiyorum, ama hostinginizi her değiştirdiğinizde şifrenizi değiştirmek zorundasınız.

1
Jo Smo

Gmail hesabınızda 2 Adımlı Doğrulama varsa, bir Uygulama şifresi oluşturmanız gerekecektir. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=tr&visit_id=636903322072234863-1319515789&rd=1 Bir Uygulama şifresi nasıl üretilir seçeneğini belirleyin ve verilen adımları izleyin. Oluşturulan Uygulama şifresini kopyalayıp yapıştırın, çünkü YAPILDI tıklattıktan sonra kurtarmanız mümkün olmayacaktır.

0
Faith Nassiwa