SmtpException: Taşıma bağlantısından veri okunamıyor: net_io_connectionclosed


103

SmtpClientAşağıdakileri kullanarak e-posta göndermek için kitaplığı kullanıyorum:

SmtpClient client = new SmtpClient();
client.Host = "hostname";
client.Port = 465;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new NetworkCredential("User", "Pass);
client.Send("from@hostname", "to@hostname", "Subject", "Body");

Kod, test ortamımda iyi çalışıyor, ancak üretim SMTP sunucularını kullandığımda, kod SmtpException"Posta gönderme hatası" ile başarısız oluyor . iç IOException"Taşıma bağlantısından veri okunamıyor: net_io_connectionclosed".

Güvenlik duvarlarının bir sorun olmadığını doğruladım. Bağlantı noktası, istemci ve sunucu arasında gayet iyi açılır. Bu hatayı başka neyin atabileceğinden emin değilim.

Yanıtlar:


190

DÜZENLEME: Süper Redux Sürümü

465 yerine 587 numaralı bağlantı noktasını deneyin. Bağlantı noktası 465 teknik olarak kullanımdan kaldırılmıştır.


Bir grup paket koklamadan sonra anladım. İlk olarak, işte kısa cevap:

.NET, SmtpClient yalnızca STARTTLS aracılığıyla şifrelemeyi destekler. Eğer EnableSslbayrak ayarlanırsa, bir STARTTLS ile EHLO sunucu zorunluluk cevap, aksi takdirde bir özel durum oluşturur. Daha fazla ayrıntı için MSDN belgelerine bakın.

İkincisi, gelecekte bu sorunla karşılaşanlar için hızlı bir SMTP tarih dersi:

Eskiden servisler de şifreleme sunmak istediklerinde onlara farklı bir port numarası atandı ve bu port numarasında hemen bir SSL bağlantısı başlattılar. Zaman geçtikçe, bir hizmet için iki bağlantı noktası numarasını boşa harcamanın aptalca olduğunu fark ettiler ve hizmetlerin STARTTLS kullanarak aynı bağlantı noktasında düz metin ve şifrelemeye izin verecek bir yolunu buldular. İletişim düz metin kullanmaya başlayacak, ardından şifreli bir bağlantıya yükseltmek için STARTTLS komutunu kullanacaktır. STARTTLS, SMTP şifreleme standardı haline geldi. Ne yazık ki, yeni bir standart uygulandığında her zaman olduğu gibi, oradaki tüm istemciler ve sunucularla bir uyumluluk hodgepodge vardır.

Benim durumumda, kullanıcım yazılımı, Microsoft tarafından .NET'te desteklenmeyen eski yöntem olan anında SSL bağlantısını zorlayan bir sunucuya bağlamaya çalışıyordu.


Bağlandığım Sunucunun aynı sorunlara sahip olup olmadığını nasıl anlarım? SmtpClient'i yahoo ve / veya gmail ile kullanmaya ve açıklanan hatayı almaya çalışıyorum. 2013 değişim sunucusuna karşı denediğimde kodum iyi çalışıyor.
raider33

11
Test etmenin en basit yolu 465'i değil 587 numaralı bağlantı noktasını kullanmayı denemektir. Bazı SMTP sunucuları 465'te (ve hatta bazen 25) TLS'yi desteklerken, TLS'yi desteklemek için yalnızca 587 numaralı bağlantı noktası gerekir. Buna ek olarak, 465 numaralı bağlantı noktasının kullanımı 1998'den beri kullanımdan kaldırılmıştır ( en.wikipedia.org/wiki/SMTPS ), ancak pratikte birçok sunucu eski istemciler için etkinleştirmiştir.
Jake C

1
Evet, 587'ye geçmek hile yaptı. Beni doğru yönü gösterdiğin için teşekkürler.
raider33

2
587 smtp.att.yahaoo.com 465 kullan diyor olsa da çalışıyor. Teşekkürler adamım.
Sam

1
Gerçek bir çözüm için örtük SSL'yi destekleyen (kullanımdan kaldırılmış) System.Web.Mail'i kullanma hakkında stackoverflow.com/a/1014876/247702 adresine bakın .
user247702

21

Bir çözüm arayan bu gönderiye rastlayan ve Azure aracılığıyla SMTP sendgrid'i kuran herkes için.

Kullanıcı adı, Azure'da sendgrid nesnesini oluşturduğunuzda belirlediğiniz kullanıcı adı değildir. Kullanıcı adınızı bulmak için;

  • Gök mavisi renkli sendgrid nesnenize tıklayın ve yönet'e tıklayın. SendGrid sitesine yönlendirileceksiniz.
  • E-postanızı onaylayın ve orada görüntülenen kullanıcı adını kopyalayın .. otomatik olarak oluşturulan bir kullanıcı adıdır.
  • SendGrid'deki kullanıcı adını web.config dosyasındaki SMTP ayarlarınıza ekleyin.

Bu yardımcı olur umarım!


2
Bu aptalca görünebilir, ancak kontrol etmek isteyebileceğiniz başka bir şey, parolanın SMTP SendGrid kurulumu için doğru olup olmadığıdır. Kurulumumuz başlangıçta çalışıyordu ve bir gün OP'nin istisna mesajını almaya başladık. WWW'de yapılan aramalar, çoğunlukla parolanın yanlış olduğu ortaya çıktığında diğer SMTP Sunucusu yapılandırmalarına bakıldığına işaret etti. Ekipten biri, yapılandırma dosyasındaki parolayı ilk harfin büyük harfle yazılmadığı bir varyasyona değiştirdi.
methon.dagger

1
Benim durumumda kullanıcı adı yanlıştı ve bir yazım hatası vardı. Ancak yanlış bir parola, "Taşıma bağlantısından veri okunamıyor: net_io_connectionclosed" da verebilir. hata. Bu yüzden hem kullanıcı adını hem de şifreyi kontrol edin. Azure kullanıcıları için, kullanıcı adı "azure_guid-withoutdashes@azure.com" biçimindedir (örneğin: azure_e9e062db4bfd491296bec77bcff49ed9@azure.com)
Raj Rao

20

Bağlantı noktasını 465'ten 587'ye değiştirin ve çalışacaktır.


3
Ne olduğundan emin değilim ama bu gmail smtp kullanarak beni çalıştırıyor. bunun neden işe yaradığını açıklayabilir misin?
Crismogram

10

Ayrıca, Gmail hesabınızdaki "daha az güvenli uygulamalar" ayarını değiştirmeniz gerekebilir. EnableSsl, 587 numaralı bağlantı noktasını kullanın ve "daha az güvenli uygulamaları" etkinleştirin. Daha az güvenli uygulamalar kısmını Google'da ararsanız, sizi doğrudan hesabınızın sayfasına bağlayacak Google yardım sayfaları vardır. Bu benim sorunumdu ama yukarıdaki tüm cevaplar sayesinde artık her şey çalışıyor.


Teşekkürler Bill. Bu hala standart gmail hesabımla çalışıyor. "Daha az güvenli uygulamalar" ayarını kullanmazsanız, OAuth2 2 bölümlü kimlik doğrulamasını kullanmanız gerekir. Bir web sitesinden yalnızca onay e-postası göndermek istediğinizde bu pratik değildir.
Dan Randolph

1
"Daha az güvenli uygulamalar" ayarı nerede? Gmail hesabımdayım onu ​​arıyorum.
Sam

1
"Daha Az Güvenli Uygulamalar" ayarını buldum - Gmail Ayarlarında değil, Google Hesabı Ayarlarında: Hesabım> Oturum Açma ve Güvenlik myaccount.google.com/…
HFloyd

9

Yukarıdaki tüm cevapları denedim ancak yine de Office 365 hesabıyla bu hatayı alıyorum. Daha az güvenli uygulamalara izin verirken kod, Google hesabı ve smtp.gmail.com ile sorunsuz çalışıyor gibi görünüyor.

Deneyebileceğim başka öneriler var mı?

İşte kullandığım kod

int port = 587;
string host = "smtp.office365.com";
string username = "smtp.out@mail.com";
string password = "password";
string mailFrom = "noreply@mail.com";
string mailTo = "to@mail.com";
string mailTitle = "Testtitle";
string mailMessage = "Testmessage";

using (SmtpClient client = new SmtpClient())
{
    MailAddress from = new MailAddress(mailFrom);
    MailMessage message = new MailMessage
    {
        From = from
    };
    message.To.Add(mailTo);
    message.Subject = mailTitle;
    message.Body = mailMessage;
    message.IsBodyHtml = true;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;
    client.Host = host;
    client.Port = port;
    client.EnableSsl = true;
    client.Credentials = new NetworkCredential
    {
        UserName = username,
        Password = password
    }; 
    client.Send(message);
}

GÜNCELLEME VE NASIL ÇÖZÜDÜM:

Smtp İstemcisini Mailkit olarak değiştirerek sorun çözüldü. System.Net.Mail Smtp İstemcisinin artık güvenlik sorunları nedeniyle Microsoft tarafından kullanılması önerilmemektedir ve bunun yerine MailKit kullanmanız gerekir. Mailkit kullanmak bana, sorunun temel nedenini bulmayı anlayabileceğim daha net hata mesajları verdi (lisans sorunu). Mailkit'i Nuget Paketi olarak indirerek edinebilirsiniz .

Daha fazla bilgi için Smtp Client hakkındaki belgeleri okuyun: https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.7.2

SmtpClient'i MailKit ile nasıl uyguladım

        int port = 587;
        string host = "smtp.office365.com";
        string username = "smtp.out@mail.com";
        string password = "password";
        string mailFrom = "noreply@mail.com";
        string mailTo = "mailto@mail.com";
        string mailTitle = "Testtitle";
        string mailMessage = "Testmessage";

        var message = new MimeMessage();
        message.From.Add(new MailboxAddress(mailFrom));
        message.To.Add(new MailboxAddress(mailTo));
        message.Subject = mailTitle;
        message.Body = new TextPart("plain") { Text = mailMessage };

        using (var client = new SmtpClient())
        {
            client.Connect(host , port, SecureSocketOptions.StartTls);
            client.Authenticate(username, password);

            client.Send(message);
            client.Disconnect(true);
        }

3

SMTP kitaplığınız şifreli bağlantıyı destekliyor mu? Posta sunucusu güvenli TLS bağlantısı bekliyor olabilir ve bu nedenle bir TLS anlaşması olmadığında bağlantıyı kapatabilir


Bu sadece varsayılan .NET SmtpClientkitaplığı, şifrelemeyi destekliyor, sunucu şifreleme gerektiriyor ve ben ayarladım client.EnableSssl = true;. Yine de bunu Wireshark ile biraz daha ikna edeceğimi düşünüyorum.
Jake C

3

Aynı kutuda bir SMTP sunucusu kullanıyorsanız ve SMTP'niz "Herhangi Atanmış" yerine bir IP adresine bağlıysa, SMTP'nin şu anda çalışmadığı bir IP adresini (127.0.0.1 gibi) kullanmaya çalıştığı için başarısız olabilir üzerinde.


2

Jocull'un bir yorumda bahsedilenleri yükseltmek için, bu başlıkta bahsedilen her şeyi yapıyordum ve göze çarpıyordum ... çünkü benimki tekrar tekrar çalıştırılacak bir döngüdeydi; döngü boyunca ilk kez geçtikten sonra, bazen başarısız olur. Her zaman döngü boyunca ilk kez çalıştı.

Açık olmak gerekirse: döngü SmtpClient oluşturmayı ve ardından doğru verilerle .Send yapmayı içerir. SmtpClient, hataları yakalamak ve nesnenin döngünün en altından önce yok edildiğinden emin olmak için bir dene / yakala bloğu içinde oluşturuldu.

Benim durumumda çözüm, SmtpClient'in döngüde her seferinde atıldığından emin olmaktı (kullanarak () deyimi veya el ile imha ederek). SmtpClient nesnesi döngüde örtük olarak yok edilse bile, .NET bir sonraki denemeyle çelişecek şeyler bırakıyor gibi görünüyor.



2

kaldırma

client.UseDefaultCredentials = false; 

benim için çözmüş gibiydi.


1

Benim durumumda, müşteri SMTP ayarlarına yeni IP adresi eklemeyi unuttu. Smtp'yi kuran sunucuda IIS 6.0'ı açın, Smtp sanal sunucusuna sağ tıklayın, Özellikler'i seçin, Erişim sekmesine tıklayın, Bağlantılar'a tıklayın, yeni sunucunun IP adresini ekleyin. Ardından Aktar'a tıklayın, ayrıca yeni sunucunun IP adresini ekleyin. Bu benim sorunumu çözdü.


0

Şunu deneyin: Birden çok kullanıcıya e-posta göndermek için kullandığım kod burada.

 public string gmail_send()
    {
        using (MailMessage mailMessage =
        new MailMessage(new MailAddress(toemail),
    new MailAddress(toemail)))
        {
            mailMessage.Body = body;
            mailMessage.Subject = subject;
            try
            {
                SmtpClient SmtpServer = new SmtpClient();
                SmtpServer.Credentials =
                    new System.Net.NetworkCredential(email, password);
                SmtpServer.Port = 587;
                SmtpServer.Host = "smtp.gmail.com";
                SmtpServer.EnableSsl = true;
                mail = new MailMessage();
                String[] addr = toemail.Split(','); // toemail is a string which contains many email address separated by comma
                mail.From = new MailAddress(email);
                Byte i;
                for (i = 0; i < addr.Length; i++)
                    mail.To.Add(addr[i]);
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = true;
                mail.DeliveryNotificationOptions =
                    DeliveryNotificationOptions.OnFailure;
                //   mail.ReplyTo = new MailAddress(toemail);
                mail.ReplyToList.Add(toemail);
                SmtpServer.Send(mail);
                return "Mail Sent";
            }
            catch (Exception ex)
            {
                string exp = ex.ToString();
                return "Mail Not Sent ... and ther error is " + exp;
            }
        }
    }

1
SmtpClientayrıca Tek kullanımlıktır, bu yüzden bir usingbloğa sarılmalıdır
jocull

0

Yukarıdaki tüm çözümlerin sizin için işe yaramaması durumunda, aşağıdaki dosyayı sunucunuza güncellemeyi deneyin (yani yayınlayarak ve bundan önce bir derleme yardımcı olacaktır).

bin-> projectname.dll 

Güncellemeden sonra bu hatayı göreceksiniz. Bu çözümle çözdüğüm gibi.


1
Şaşırtıcı bir şekilde bu benim için çalıştı! Güvenli olmayan uygulamalara izin ver açıktı ve bağlantı noktası zaten 587 olarak ayarlandı.
TechyGypo

Teşekkürler, bu sorunu yaşayan tek kişinin ben olmadığımı fark ettim. Memnuniyetle yardım ettim.
Ajay Kumar

0

Outlook için bana hata vermeyen aşağıdaki ayarı kullanın

SMTP sunucu adı smtp-mail.outlook.com

SMTP bağlantı noktası 587


0

Bu hata çok geneldir.Posta sunucusu yanlış gibi birçok nedenden dolayı olabilir. Bazı barındırma şirketleri mail.domainname biçimini kullanır. Sadece alan adını kullanırsanız, çalışmayacaktır. kimlik bilgilerini kontrol edin ana bilgisayar adı kullanıcı adı şifre gerekirse hosting şirketi ile kontrol edin.

<smtp from="info@india.uu.com">
        <!-- Uncomment to specify SMTP settings -->
        <network host="domain.com" port="25" password="Jin@" userName="info@india.xx.com"/>
      </smtp>
    </mailSettings>

0

Benim durumumda web sunucusu IP'si posta sunucusunda engellendi, barındırma şirketiniz tarafından engellenmesi ve beyaz listeye alınması gerekiyor. Ayrıca 587 numaralı bağlantı noktasını kullanın.


0

Posta sunucunuz Gmail (smtp.google.com) ise, mesaj sınırına ulaştığınızda bu hatayı alırsınız. Gmail, SMTP üzerinden 24 saatte yalnızca 2000'e kadar ileti göndermeye izin verir.


0

Smtp.office365.com'u kullanırken SSL ile 587 numaralı bağlantı noktasını kullanırken bununla karşılaştım. Portal.office.com'u kullanarak hesabıma giriş yapabildim ve hesabın bir lisansı olduğunu doğrulayabildim. Ancak e-posta göndermek için kodu ateşlediğimde net_io_connectionclosed hatasını almaya devam ettim.

Bunu anlamam biraz zaman aldı, ancak Exchange yöneticisi suçluyu buldu. O365 kullanıyoruz, ancak Exchange sunucusu karma bir ortamdaydı. Kullanmaya çalıştığımız hesap Azure AD ile senkronize edilmiş ve geçerli bir O365 lisansına sahip olmasına rağmen, bazı nedenlerden dolayı posta kutusu hala Exchange çevrimiçi değil hibrit Exchange sunucusunda bulunuyordu. Exchange yöneticisi, posta kutusunu karma exchange sunucusundan O365'e taşımak için "Posta Kutusunu Taşı" komutunu kullandıktan sonra, kodu o365 kullanarak e-posta göndermek için kullanabilirdik.


-1

Hazırlayın: 1. HostA, varsayılan bağlantı noktası 25 olan SMTP sanal sunucusudur 2. HostB, SmtpClient ile posta gönderdiğim ve hantal kullandığım dengesiz ağı simüle ettiğim bir iş istasyonudur

Durum 1 E-posta gönderdiğimde HostB 2008R2 ise Verilir. Ardından bu sorun ortaya çıkar.

Durum 2 HostB 2012 veya daha yüksek bir sürüm ise Verilir E-posta gönderdiğimde. Sonra posta gönderildi.

Sonuç: Bu temel neden Windows Server 2008R2 ile ilgilidir.

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.