SmtpException: ट्रांसपोर्ट कनेक्शन के डेटा को पढ़ने में असमर्थ: net_io_connectionclosed


103

मैं SmtpClientनिम्नलिखित का उपयोग करके ईमेल भेजने के लिए पुस्तकालय का उपयोग कर रहा हूं :

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

कोड मेरे परीक्षण वातावरण में ठीक काम करता है, लेकिन जब मैं उत्पादन SMTP सर्वर का उपयोग करता हूं, तो कोड SmtpException"मेल भेजने में विफलता" के साथ विफल हो जाता है । एक आंतरिक IOException"परिवहन कनेक्शन से डेटा पढ़ने में असमर्थ: net_io_connectionclosed"।

मैंने पुष्टि की है कि फ़ायरवॉल कोई समस्या नहीं है। पोर्ट क्लाइंट और सर्वर के बीच ठीक खुलता है। मुझे यकीन नहीं है कि और क्या इस त्रुटि को फेंक सकता है।

जवाबों:


190

संपादित करें: सुपर Redux संस्करण

पोर्ट 465 के बजाय 587 का प्रयास करें। पोर्ट 465 को तकनीकी रूप से हटा दिया गया है।


पैकेट सूँघने के एक झुंड के बाद मैंने यह पता लगाया। सबसे पहले, यहाँ संक्षिप्त जवाब है:

.NET SmtpClient केवल STARTTLS के माध्यम से एन्क्रिप्शन का समर्थन करता है। यदि EnableSslध्वज सेट है, तो सर्वर को STARTTLS के साथ EHLO पर प्रतिक्रिया देनी होगी, अन्यथा यह अपवाद फेंक देगा। देखें MSDN अधिक जानकारी के लिए प्रलेखन।

दूसरा, भविष्य में इस समस्या से जूझने वालों के लिए एक त्वरित SMTP इतिहास सबक:

दिन में, जब सेवाएँ एन्क्रिप्शन की पेशकश करना चाहती थीं, तो उन्हें एक अलग पोर्ट नंबर सौंपा गया था, और उस पोर्ट नंबर पर उन्होंने तुरंत SSL कनेक्शन शुरू किया। जैसे-जैसे समय बीतता गया, उन्हें एहसास हुआ कि एक सेवा के लिए दो पोर्ट नंबर को बर्बाद करना मूर्खतापूर्ण है और उन्होंने सेवाओं के लिए एक तरीका तैयार किया है जो STARTTLS का उपयोग करके उसी पोर्ट पर प्लेनेटेक्स और एन्क्रिप्शन की अनुमति देता है। संचार प्लेनटेक्स्ट का उपयोग करना शुरू कर देगा, फिर एन्क्रिप्टेड कनेक्शन में अपग्रेड करने के लिए STARTTLS कमांड का उपयोग करें। STARTTLS SMTP एन्क्रिप्शन के लिए मानक बन गया। दुर्भाग्य से, जैसा कि हमेशा होता है जब एक नया मानक लागू किया जाता है, तो सभी क्लाइंट और सर्वर के साथ संगतता का एक हॉजपॉज होता है।

मेरे मामले में, मेरा उपयोगकर्ता सॉफ़्टवेयर को एक ऐसे सर्वर से जोड़ने की कोशिश कर रहा था जो तत्काल एसएसएल कनेक्शन के लिए मजबूर कर रहा था, जो कि विरासत विधि है जो Microsoft द्वारा .NET में समर्थित नहीं है।


मैं कैसे बता सकता हूं कि मैं जिस सर्वर से जुड़ रहा हूं, उसी मुद्दे हैं? मैं याहू और / या जीमेल के साथ SmtpClient का उपयोग करने और वर्णित त्रुटि प्राप्त करने की कोशिश कर रहा हूं। जब मैं 2013 के एक्सचेंज सर्वर के खिलाफ कोशिश करता हूं, तो मेरा कोड ठीक काम करता है।
रेडर33

11
परीक्षण करने का सबसे सरल तरीका पोर्ट 587 का उपयोग करना है न कि 465। जबकि कुछ एसएमटीपी सर्वर 465 पर टीएलएस (और कभी-कभी 25 भी) का समर्थन करते हैं, केवल टीएसएस का समर्थन करने के लिए पोर्ट 587 की आवश्यकता होती है। इसके अलावा, पोर्ट 465 का उपयोग 1998 से शुरू किया गया है ( en.wikipedia.org/wiki/SMTPS ), हालांकि व्यवहार में कई सर्वरों ने इसे विरासत ग्राहकों के लिए सक्षम किया है।
जेक सी

1
हां, 587 में बदलकर चाल चली गई। मुझे सही दिशा बताने के लिए धन्यवाद।
रेडर 33

2
587 काम करता है, हालांकि smtp.att.yahaoo.com कहता है कि 465 का उपयोग करें। धन्यवाद आदमी।
सैम

1
वास्तविक समाधान के लिए, (deprecated) System.Web.Mail का उपयोग करने पर stackoverflow.com/a/1014876/247702 देखें जो अंतर्निहित SSL का समर्थन करता है।
user247702

20

पोर्ट को 465 से बदलकर 587 करें और यह काम करेगा।


3
मुझे यकीन नहीं है कि क्या हुआ, लेकिन यह मुझे gmail smtp का उपयोग करके काम करता है। क्या आप बता सकते हैं कि यह क्यों काम करता है?
क्रिस्मोग्राम

20

जो कोई भी इस पद के लिए ठोकर खाता है, उसका समाधान ढूंढता है और आपने Azure के माध्यम से SMTP Sendgrid की स्थापना की है।

उपयोगकर्ता नाम वह उपयोगकर्ता नाम नहीं है जिसे आपने सेट किया है जब आपने azure में sendgrid ऑब्जेक्ट बनाया है। अपना उपयोगकर्ता नाम खोजने के लिए;

  • Azure में अपने sendgrid ऑब्जेक्ट पर क्लिक करें और प्रबंधन करें पर क्लिक करें। आपको SendGrid साइट पर पुनः निर्देशित किया जाएगा।
  • अपने ईमेल की पुष्टि करें और फिर वहां प्रदर्शित उपयोगकर्ता नाम को कॉपी करें .. यह स्वचालित रूप से उत्पन्न उपयोगकर्ता नाम है।
  • Web.config फ़ाइल में अपने SMTP सेटिंग्स में SendGrid से उपयोगकर्ता नाम जोड़ें।

उम्मीद है की यह मदद करेगा!


2
यह मूर्खतापूर्ण लग सकता है लेकिन कुछ और जिसे आप जांचना चाहते हैं कि क्या पासवर्ड SMTP SendGrid सेटअप के लिए सही है। हमारा सेटअप मूल रूप से काम कर रहा था और फिर एक दिन हमें ओपी का अपवाद संदेश मिलना शुरू हुआ। WWW की खोजों ने ज्यादातर अन्य SMTP सर्वर कॉन्फ़िगरेशन को देखने के लिए इशारा किया जब अंततः यह पता चला कि पासवर्ड गलत था। टीम में किसी ने कॉन्फ़िगरेशन फ़ाइल में पासवर्ड को एक भिन्नता में बदल दिया था जहां पहला अक्षर गैर-पूंजीकृत था।
methon.dagger

1
मेरे मामले में उपयोगकर्ता का नाम गलत था और टाइपो था। लेकिन एक गलत पासवर्ड "ट्रांसपोर्ट कनेक्शन से डेटा पढ़ने में असमर्थ: net_io_connectionclosed" भी दे सकता है। त्रुटि। इसलिए यूज़रनेम और पासवर्ड दोनों की जाँच करें। और एज़्योर उपयोगकर्ताओं के लिए, उपयोगकर्ता नाम "azure_guid-withoutdashes@azure.com" फॉर्म का है (उदाहरण: azure_e9e062db4bfd491296bec77bcbc49ed9@azure.com)
राज राव

10

आपको अपने जीमेल अकाउंट पर "कम सिक्योर ऐप्स" सेटिंग भी बदलनी पड़ सकती है। EnableSsl, पोर्ट 587 का उपयोग करें और "कम सुरक्षित ऐप्स" को सक्षम करें। यदि आप कम सुरक्षित ऐप्स का भाग Google करते हैं, तो Google सहायता पृष्ठ हैं जो आपको आपके खाते के पृष्ठ के दाईं ओर लिंक करेंगे। यह मेरी समस्या थी लेकिन ऊपर दिए गए सभी उत्तरों के लिए अब सब कुछ काम कर रहा है।


धन्यवाद विधेयक। यह अभी भी मेरे मानक gmail खाते के साथ काम करता है। यदि आप "कम सुरक्षित ऐप्स" सेटिंग का उपयोग नहीं करते हैं, तो आपको OAuth2 2-part प्रमाणीकरण का उपयोग करना होगा। यह व्यावहारिक नहीं है जब आप सिर्फ एक वेबसाइट से पुष्टिकरण ईमेल भेजना चाहते हैं।
दान रैंडोल्फ

1
जहां "कम सुरक्षित ऐप्स" बस रहा है। मैं अपने gmail अकाउंट में ढूंढ रहा हूँ।
सैम

1
मैंने "कम सिक्योर ऐप्स" सेटिंग स्थित की है - यह जीमेल सेटिंग्स में नहीं है, लेकिन Google खाता सेटिंग्स में: मेरा खाता> साइन-इन और सुरक्षा myaccount.google.com/…
HFloyd

9

मैंने ऊपर दिए गए सभी उत्तरों की कोशिश की है, लेकिन अभी भी यह त्रुटि Office 365 खाते के साथ मिलती है। कम सुरक्षित ऐप्स की अनुमति देने पर Google खाते और smtp.gmail.com के साथ कोड ठीक काम करता है।

कोई अन्य सुझाव जो मैं कोशिश कर सकता हूं?

यहां वह कोड है जो मैं उपयोग कर रहा हूं

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

अद्यतन और मैं इसे हल कैसे:

Smtp Client को Mailkit में बदलकर हल की समस्या। System.Net.Mail Smtp क्लाइंट को अब सुरक्षा समस्याओं के कारण Microsoft द्वारा उपयोग करने की अनुशंसा नहीं की जाती है और आपको इसके बजाय MailKit का उपयोग करना चाहिए। मेलकिट का उपयोग करने से मुझे स्पष्ट त्रुटि संदेश मिले जो कि मैं समस्या का मूल कारण (लाइसेंस जारी करने) को समझ सकता था। आप इसे एक Nuget के रूप में डाउनलोड करके Mailkit प्राप्त कर सकते हैं पैकेज के ।

अधिक जानकारी के लिए Smtp क्लाइंट के बारे में प्रलेखन पढ़ें: https://docs.microsoft.com/es-es/dotnet/api/system.net.mail.smtpclient?redirectedfrom=MSDN&view=netframework-4.2.2

यहाँ बताया गया है कि मैंने मेलकिट के साथ SmtpClient कैसे लागू किया

        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 लाइब्रेरी एन्क्रिप्टेड कनेक्शन का समर्थन करती है? मेल सर्वर सुरक्षित टीएलएस कनेक्शन की उम्मीद कर सकता है और इसलिए टीएलएस हैंडशेक की अनुपस्थिति में कनेक्शन बंद कर सकता है


यह सिर्फ डिफ़ॉल्ट .NET SmtpClientलाइब्रेरी है, यह एनक्रिप्ट का समर्थन करता है, सर्वर को एन्क्रिप्शन की आवश्यकता होती है, और मैंने सेट किया है client.EnableSssl = true;। हालांकि मुझे लगता है कि मैं विंडसरक के साथ इसे थोड़ा आगे बढ़ाने जा रहा हूं।
जेक सी

3

यदि आप एक ही बॉक्स पर एक SMTP सर्वर का उपयोग कर रहे हैं और आपका SMTP "किसी भी असाइन किया गया" के बजाय एक IP पते के लिए बाध्य है, तो यह विफल हो सकता है क्योंकि यह IP पते (जैसे 127.0.0.1) का उपयोग करने का प्रयास कर रहा है जो SMTP वर्तमान में काम नहीं कर रहा है पर।


2

एक टिप्पणी में उल्लिखित जोकुल्ल का उल्लेख करने के लिए, मैं इस धागे में सब कुछ उल्लेख कर रहा था और बाहर स्ट्राइक कर रहा था ... क्योंकि मेरा एक लूप में और बार-बार चलाया जाना था; लूप के माध्यम से पहली बार के बाद, यह कभी-कभी विफल हो जाता है। हमेशा लूप के माध्यम से पहली बार काम किया।

स्पष्ट होने के लिए: लूप में SmtpClient का निर्माण शामिल है, और फिर कर रहा है। सही डेटा के साथ भेजें। SmtpClient एक कोशिश / कैच ब्लॉक के अंदर बनाया गया था, त्रुटियों को पकड़ने और यह सुनिश्चित करने के लिए कि लूप के नीचे से पहले ऑब्जेक्ट नष्ट हो गया।

मेरे मामले में, समाधान यह सुनिश्चित करने के लिए था कि SmtpClient लूप में हर बार (या तो उपयोग () स्टेटमेंट के माध्यम से या मैनुअल डिस्पोज करके) निपटाया गया था। यहां तक ​​कि अगर SmtpClient ऑब्जेक्ट को स्पष्ट रूप से लूप में नष्ट किया जा रहा है, तो .NET अगले प्रयास के साथ संघर्ष के लिए आस-पास पड़ा सामान छोड़ रहा है।



2

को हटाने

client.UseDefaultCredentials = false; 

यह मेरे लिए हल करने के लिए लग रहा था।


1

यदि उपरोक्त सभी समाधान आपके लिए काम नहीं करते हैं, तो निम्न फ़ाइल को अपने सर्वर पर अपडेट करने का प्रयास करें (द्वारा प्रकाशित करें मेरा मतलब है, और इससे पहले एक निर्माण उपयोगी होगा)।

bin-> projectname.dll 

अपडेट करने के बाद आपको यह त्रुटि दिखाई देगी। जैसा कि मैंने इस समाधान के साथ हल किया है।


1
आश्चर्यजनक रूप से इसने मेरे लिए काम किया! असुरक्षित ऐप्स को अनुमति दें और पोर्ट पहले से ही 587 पर सेट था।
TechyGypo

धन्यवाद, बस एहसास हुआ कि मैं इस मुद्दे के साथ ही नहीं था। मदद करने के लिए खुश।
अजय कुमार

1

मेरे मामले में, ग्राहक अपनी SMTP सेटिंग में नया IP पता जोड़ना भूल गया। IIS 6.0 को सर्वर में खोलें जो smtp को सेट करता है, Smtp वर्चुअल सर्वर पर राइट क्लिक करें, गुण चुनें, टैब एक्सेस करें, कनेक्शंस पर क्लिक करें, नए सर्वर का IP पता जोड़ें। फिर रिले पर क्लिक करें, नए सर्वर का आईपी पता भी जोड़ें। इससे मेरी समस्या हल हो गई।


0

इसे आज़माएँ: यहाँ वह कोड है जिसका उपयोग मैं कई उपयोगकर्ताओं को ईमेल भेजने के लिए कर रहा हूँ।

 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
SmtpClient, भी डिस्पोजेबल है, इसलिए यह एक में लपेटा जाना चाहिए usingब्लॉक
jocull

0

आउटलुक उपयोग के लिए निम्नलिखित सेटिंग जो मुझे त्रुटि नहीं दे रही है

SMTP सर्वर नाम smtp-mail.outlook.com

SMTP पोर्ट 587


0

यह त्रुटि बहुत सामान्य है। यह कई कारणों से हो सकता है जैसे कि मेल सर्वर गलत है। कुछ होस्टिंग कंपनी mail.domainname प्रारूप का उपयोग करती है। यदि आप सिर्फ डोमेन नाम का उपयोग करते हैं तो यह काम नहीं करेगा। यदि कंपनी की जाँच की आवश्यकता हो तो क्रेडेंशियल होस्ट नाम यूज़रनेम पासवर्ड की जाँच करें।

<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

मेरे मामले में वेब सर्वर आईपी मेल सर्वर पर अवरुद्ध हो गया था, इसे आपकी होस्टिंग कंपनी द्वारा अनब्लॉक करने और इसे श्वेतसूची में बनाने की आवश्यकता है। इसके अलावा, पोर्ट 587 का उपयोग करें।


0

यदि आपका मेल सर्वर जीमेल (smtp.google.com) है, तो आपको यह त्रुटि संदेश सीमा को हिट करने पर मिलेगी। जीमेल एसएमटीपी पर प्रति 24 घंटे में केवल 2000 संदेशों को भेजने की अनुमति देता है।


0

जब एसएसटी के साथ पोर्ट 587 का उपयोग कर smtp.office365.com का उपयोग करते हुए मैं इसमें भाग गया। मैं portal.office.com का उपयोग करके खाते में लॉग इन करने में सक्षम था और मैं पुष्टि कर सकता था कि खाते के पास लाइसेंस था। लेकिन जब मैंने ईमेल भेजने के लिए कोड निकाल दिया, तो मुझे net_io_connectionclosed त्रुटि प्राप्त होती रही।

मुझे इसका पता लगाने में कुछ समय लगा, लेकिन एक्सचेंज एडमिन को दोषी पाया गया। हम O365 का उपयोग कर रहे हैं, लेकिन एक्सचेंज सर्वर एक हाइब्रिड वातावरण में था। हालाँकि हम जिस खाते का उपयोग करने की कोशिश कर रहे थे, वह Azure AD के साथ समन्वयित था और उसके पास वैध O365 लाइसेंस था, किसी कारण से मेलबॉक्स अभी भी हाइब्रिड एक्सचेंज सर्वर पर निवास कर रहा था - ऑनलाइन एक्सचेंज नहीं। एक्सचेंज एडमिन ने हाइब्रिड एक्सचेंज सर्वर से मेलबॉक्स को O365 में ले जाने के लिए "मूव-मेलबॉक्स" कमांड का उपयोग किया जिसके बाद हम ओ 365 का उपयोग करके ईमेल भेजने के लिए कोड का उपयोग कर सकते थे।


-1

तैयार: 1. HostA SMTP वर्चुअल सर्वर है जो डिफ़ॉल्ट पोर्ट 25 के साथ है। HostB एक कार्य केंद्र है, जिस पर मैं SmtpClient के साथ मेल भेजता हूं और अस्थिर नेटवर्क का अनुकरण करता हूं जिसका उपयोग मैं अनाड़ी करता हूं

केस 1 को देखते हुए अगर HostB 2008R2 है जब मैं ईमेल भेजता हूं। तब यह समस्या होती है।

केस 2 को देखते हुए अगर HostB 2012 या उच्चतर संस्करण है, जब मैं ईमेल भेजता हूं। तब मेल बाहर भेजा गया था।

निष्कर्ष: यह मूल कारण Windows Server 2008R2 से संबंधित है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.