أفضل طريقة لإرسال البريد الإلكتروني (system.net.mail لها مشاكل)

StackOverflow https://stackoverflow.com/questions/930236

سؤال

يبدو أن هذا ليكون مستقيما جدا إلى الأمام. أحتاج إلى إرسال بريد إلكتروني من بعض تطبيقات ASP.NET. أحتاج إلى القيام بذلك باستمرار دون أخطاء غريبة ودون استخدام وحدة المعالجة المركزية التي تمر بالسقف. أنا لا أتحدث عن البريد الإلكتروني الشامل، فقط رسائل البريد الإلكتروني في بعض الأحيان.

system.net.mail. يبدو أن تكون مكسورة فظيعة. لا يصدر SMTPClient أمر الإقلاع الناتج (قد يكون لأن Microsoft (R) غير مهتم بالمواصفات التالية)، وبالتالي يتم ترك الاتصال مفتوحا. لذلك، إذا حاول شخص ما البريد الإلكتروني قبل هذا الاتصال أخيرا إغلاق، يمكنك الحصول على أخطاء من خادم SMTP حول العديد من الاتصالات مفتوحة. هذا خطأ أن Microsoft (ص) غير مهتم تماما في تحديد. انظر هنا:

http://connnect.microsoft.com/visualstudio/feedback/viewfeedback.aspx؟feedbackid=146711.

أيضا، إذا نظرت إلى البعض، اقترح استخدام هذا الرمز لحل هذه المشكلة:

smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;

حسنا، نعم التي "حل" مشكلة الاتصالات التي يتم تركها مفتوحة. ومع ذلك، فإن هذا باستمرار، جربه على خادم إذا كنت ترغب في تشغيل وحدة المعالجة المركزية (في هذه الحالة W3WP.exe) للقفز والبقاء عند 100٪ حتى يتم إعادة تدوير تجمع التطبيق الخاص بك. لأي سبب من الأسباب، فإن الخيط الذي يدير mscorwks.dll! createapplicationcontext هو الجاني.

هذا له تأثير جانبي لطيف للغاية أنه إذا كنت تقوم بتشغيل مضيف ويب يتم عبوسه على استخدام وحدة المعالجة المركزية المستدامة بنسبة 100٪، فستحصل على تعطيل تجمع التطبيقات الخاصة بك. لذلك هذا ليس تافهة كما يقترح البعض.

لذلك سؤالي هو ماذا تفعل؟ ما أحتاج إليه هو بسيط جدا؛ ومع ذلك، فإن الحصول على الأخطاء "الكثير من الاتصالات المفتوحة" غير مقبولة ولا يتم استخدام وحدة المعالجة المركزية بنسبة 100٪. لا أريد شراء مكون طرف ثالث، وليس لأنني رخيصة، لكنني أشتري مكونات كافية واشتراك MSDN الذي يبدو أنه من الجنون أن تضطر إلى قذيفة 100 - 300 دولار للحصول على وظيفة SMTP البسيطة.

قرأت أن إعداد MaxIdletime أعلى يمكن أن يساعد لكنني متشكك بذلك. لا أريد المخاطرة بتعطيل تجمع التطبيقات الخاصة بي لمجرد أن Microsoft لا ترغب في اتباع مواصفات SMTP.

يحرر: نظرت إلى مكونات Quiksoft.com، لكنها لا تدعم مصادقة SMTP وتكلف 500 دولار. يجب أن يكون هناك حل لهذه المشكلة.

هل كانت مفيدة؟

المحلول

واجهت نفس مشكلة استخدام وحدة المعالجة المركزية مع الإعدادات الموصوفة. انتهى بي الأمر إلى فتح تذكرة مع Microsoft لتحديد سبب المشكلة. تكمن مشكلة استخدام وحدة المعالجة المركزية في فئة ServicePoint. داخليا في فئة ServicePoint، يوجد مؤقت يمتد كل (maxidletime / 2) milliseconds. انظر المشكلة؟ عن طريق تغيير قيمة MaxidLettime إلى 2، فإن استخدام وحدة المعالجة المركزية سينسل إلى المستويات العادية.

نصائح أخرى

في .NET 4.0، SMTPClient أصبح متاح الآن. يتم إصدار أمر SMTP Quit عند التصرف عند استخدامه في كتلة باستخدام.

لقد استخدمت دائما مكونات Easymail's Quiksoft مع عدم وجود مشاكل على الإطلاق.

الصفحة الرئيسية المنتج: http://www.quiksoft.com/emdotnet/

لديهم أيضا نسخة مجانية من المكون إذا كنت بحاجة فقط إلى إرسال رسائل البريد الإلكتروني فقط:

http://www.quiksoft.com/freesmtp/

وقد استخدمنا HMALALSERVER. نجاح كبير. يمكن أن يستغرق التكوين بعض الوقت لتعتاد عليه، لكنه كان منتجا رائعا ومجاني.

إذا كنت ترغب في لفكتك الخاصة (التي قمت بها منذ سنوات عندما كنت أمتلك دفعة واحدة مع CDONTS)، فيمكنك البدء في الرمز أدناه وتخصيص محتوى قلبك. يستخدم TCPClient لإنشاء اتصال TCP مباشرة إلى Mailserver. لا أوصي بذلك عندما يكون هناك الكثير من الحلول المنشأة والخروج، لكنني وجدت أن هذا مفيد للغاية لتصحيح الأخطاء وتحديد أين كانت المشكلة مع مكونات MS الجاهزة.

    private void Send_Email() 
    {
        #region Email Sending Function
        string strMail = "";

        try 
        {
            // See RFC821 http://www.faqs.org/rfcs/rfc821.html for more specs
            // TcpClient is an abstraction of a TCP Socket connection
            TcpClient myTCP = new TcpClient();

            // Connect to the mail server's port 25
            myTCP.Connect(mailserver, 25);

            // Open a network stream which sends data to/from the TcpClient's socket
            System.Net.Sockets.NetworkStream ns = myTCP.GetStream();

            // The data to send to the mail server, basically a raw SMTP mail message
            strMail = "HELO\n";
            strMail += "MAIL FROM:from@address.com\n";
            strMail += "RCPT TO:" + recipient + "\n";
            strMail += "DATA\n";
            strMail += "Subject: mySubject\n";
            strMail += "To:" + recipient + "\n";
            strMail += "From: \"From Real Name\" <from@address.com>\n";
            strMail += "\n";
            strMail += " ---------------------------------------\n";
            strMail += "Name:     " + txtName.Text + "\n";
            strMail += "Address1: " + txtAddress1.Text + "\n";
            strMail += "Address2: " + txtAddress2.Text + "\n";
            strMail += "City:     " + txtCity.Text + "\n";
            strMail += "State:    " + txtState.Text + "\n";
            strMail += "Zip:      " + txtZip.Text + "\n";
            strMail += "Email:    " + txtEmail.Text + "\n";
            strMail += "Dealer:   " + txtDealer.Text + "\n";
            strMail += " ---------------------------------------\n";
            strMail += "THIS IS AN AUTOMATED EMAIL SYSTEM. DO NOT REPLY TO THIS ADDRESS.\n";
            strMail += "\n.\n";

            // Defines encoding of string into Bytes (network stream needs
            // an array of bytes to send -- can't send strings)
            ASCIIEncoding AE = new ASCIIEncoding();
            byte[] ByteArray = AE.GetBytes(strMail);

            // send the byte-encoded string to the networkstream -> mail server:25
            ns.Write(ByteArray, 0, ByteArray.Length);

            //ns.Read(ByteArray, 0, ByteArray.Length);
            //lblStatus.Text = ByteArray.ToString();

            // close the network stream
            ns.Close();

            // close the TCP connection
            myTCP.Close();
        }
        catch(Exception ex) 
        {
            throw new Exception("Couldn't send email: <p>" + ex.Message);
        }

        #endregion

    }

بينما لم يكن لدي أي مشاكل محددة مع System.Net.Mail حتى الآن، يمكنك دائما استخدام الأكبر سنا System.Web.Mail API وهو مجمع ل CDOSYS.

لقد استخدمت QuickSoft في الماضي وليس لديك أي شكاوى. شيء آخر يمكنك أن تجربه هو تبديل تكوين SMTP لاستخدام مجلد الالتقاط بدلا من إرسال استخدام الشبكة التي يجب أن تحصل حول مشكلة "لا ترسل إنهاء".

أرسل معظم بريدي باستخدام Sproc. يمكنني حتى إرفاق ملف.

إنشاء إجراءات إنشاء [dbo]. [sendmail_with_cdomessage ]to varchar (64)، @ cc varchar (1024) = ''، bcc varchar (1024) = ''، sobject varchar (500) = ''، gobl varchar ( 8000) = '' ''، @ from varchar (64)، @ filename varchar (255) = ''، priolity int = 0 as bevin set nocount on declare @ handle int، @ return int، @ varchar (64)، @ sc varchar (1024)، up @ char (27)، server varchar (255) sets = '"http://schemas.microsoft.com/cdo/configuration/' select @ @ = 'configuration.fields (' +s، up = التكوين = 'configuration.fields.update'، server = 'smtp.yourdomain.com' execrectreturn = sp_oacreate 'cdo.message'، @ handle خارج set @ c =s + 'sendusing ") .value 'execreturn = sp_oasetpropertyhandle، x مقبض، up، null execreturn = sp_oasetpropertyhandle، 'إلى'، @، @ execreturn = sp_oasetpropertyhandle، 'cc'، @ exec execretry = sp_oasetpropertyhandle، 'bcc'، @ execc العودة = sp_oasetpropertyhandle، 'الاب om '، @ execreceturn = sp_oasetpropertyhandle، "الموضوع"، sobject execretretry = sp_oasetpropertyhandle،' htmlbody '، @ exec @ return = sp_oasetpropertyhandle،' priority '،' cdohigh 'إذا @ @ اسم الملف غير فارغ execreturn = sp_oamethod handle، 'addattachment'، null، filename execretry = sp_oamethod @ sp_oamethodhandle، "إرسال"، null إذا @ بريد إلكتروني فشل الطباعة "فشل البريد". إذا from هو طباعة فارغة "من العنوان غير محدد." آخر طباعة "تحقق من هذا الخادم صالح." end آخر طباعة "البريد المرسلة". execreturn = sp_oadestroy نهاية النهاية
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top