2010-01-21 11 views
7

मेरे पास पृष्ठभूमि में चलने वाला थ्रेड है जो कुछ सोएगा जब डेटाबेस सो जाएगा और डेटाबेस से डेटा खींच जाएगा। मैं SmtpClient (नीचे कोड) का उपयोग कर Google ऐप्स का उपयोग करके ईमेल भेज रहा हूं।मुझे पृष्ठभूमि थ्रेड में ईमेल भेजने के बारे में क्या पता होना चाहिए? एएसपी.नेट

मैं जानना चाहता था कि मुझे कुछ पता है या नहीं? मैं एक समय में केवल एक ईमेल भेजने की योजना बना रहा हूं (एक पंजीकरण या पासवर्ड ईमेल भूल गया)। मैं थोड़ी चिंतित हूं कि किसी अमान्य ईमेल को थ्रेड को लॉक करने की तरह कुछ हो सकता है क्योंकि मैंने टाइमआउट सेट नहीं किया है या शायद Google ऐप्स किए जाने हैं और ऐप को उड़ाने का कारण बन रहा है। मुझे क्या पता होना चाहिए? मुझे पूछना चाहिए कि मुझे कैसे परीक्षण करना चाहिए?

 var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
+2

क्या कोई कारण है कि आप इस तर्क को कॉल नहीं कर सकते हैं, जहां से इसे जागने का 'ट्रिगरिंग' होता है। यदि आप पासवर्ड रीसेट भेजने की कोशिश कर रहे हैं और यह विफल रहता है, तो उपयोगकर्ता के रूप में मैं शायद यह जानना चाहता हूं और यह कहने में एक अच्छी त्रुटि दिखाई दे रही है कि मैं असफल नहीं हूं और इसके लिए प्रतीक्षा कर रहा हूं। उपयोगकर्ता अनुरोध को संसाधित करने और सभी में भेजने में थोड़ी देर हो सकती है, इसे सिग्नल करने की जटिलता को दूर करने के लायक हो सकता है। – Rosstified

उत्तर

3

यदि आप आईआईएस का उपयोग कर रहे हैं। अपने सर्वर पर एसएमटीपी स्थापित करें स्थानीय मेल पर सभी मेल भेजें। इस तरह यदि कोई ईमेल तुरंत नहीं जाता है, तो SMTP सर्वर आपके एप्लिकेशन को लटकाने के बजाय ईमेल कतार देगा।

आपको SMTP सर्वर को smarthost के रूप में जीमेल का उपयोग करने के लिए कॉन्फ़िगर करने की आवश्यकता होगी। अगर आपको इसे कॉन्फ़िगर करने के तरीके के बारे में अधिक जानकारी चाहिए, तो मुझे बताएं।

+0

यह वही तरीका है जो मैं करता हूं - यह तेज़ और अधिक विश्वसनीय है। यदि आपके कोई भी प्राप्तकर्ता अमान्य हैं, या उनके एसएमटीपी सर्वर नीचे हैं, तो आपको टाइमआउट और/या अपवाद उठाए जाएंगे। इस तरह, आईआईएस तत्काल सभी मेल स्वीकार करता है, फिर संदेश भेजने का ख्याल रखता है, जिसमें भेजने में विफल होने पर पुनः प्रयास करना शामिल है। – Richard

1

मैं इस ASP.Net के तहत किया जा रहा है के बाद से यह टैग में से एक है यह सोचते हैं रहा हूँ।

यह प्रक्रिया कितनी महत्वपूर्ण है? यदि आपका पर्यावरण अनुमति देता है तो यह ASP.Net रनटाइम के भाग के बजाय Windows सेवा के लिए एक अच्छा उम्मीदवार हो सकता है।

आपने उल्लेख किया है कि आप डेटाबेस से डेटा खींचते हैं और ईमेल भेजते हैं। इनमें से कोई भी एएसपी.Net पर निर्भर नहीं है। इसके अलावा एक सेवा आपको बेहतर थ्रेडिंग, परीक्षण, लॉगिंग और एसिंक विकल्प दे सकती है।

यदि आप एएसपी.Net रनटाइम के साथ रहना चाहते हैं, तो आप Asynchronous Pages पर भी विचार कर सकते हैं यदि आपने पहले से नहीं किया है। यह आपको कई मेल थ्रेडों को बढ़ाने की अनुमति देगा और आपके मुख्य पृष्ठ थ्रेड परिणामों के लिए प्रतीक्षा करेगा। आप एक टाइमआउट मान भी सेट कर सकते हैं जो आपको रद्द करने और थ्रेड फेंकने की अनुमति देगा। एसिंक टाइमआउट को सेट करने और संभालने से मुझे आपकी चिंता का अधिक ख्याल रखना होगा। यह समाधान कम से कम आपके मेल को आपके मेक पेज अनुरोध थ्रेड को भेज देगा।

परीक्षण सीधे आगे होना चाहिए। आप परीक्षण के लिए अलग-अलग Google खाते पंजीकृत कर सकते हैं।

2

कोड में कोशिश/पकड़ जोड़ें, और आप ठीक हैं। यह सबसे खराब, आखिरकार समय-समय पर होगा। यह हमेशा के लिए नहीं चलेगा, और Google कनेक्शन हमेशा के लिए खुला नहीं रखेगा (असल में एसएमटीपी टाइमआउट की बात करते समय बहुत क्षमा नहीं कर रहा है ... यदि आप धीमे हैं, तो यह कनेक्शन को मार देगा)।

try 
    { 
     var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
    } 
    catch 
    { 
     // do something 
    } 

यह परीक्षण की बात आती है ... एक अलग जीमेल खाते का उपयोग करें। इसके अलावा आप प्रति दिन भेजे गए ईमेल की अपनी सीमा को देखना चाह सकते हैं। निश्चित नहीं है कि जीमेल का नंबर क्या है लेकिन वे आपको केवल इतना नहीं भेजते कि आप कितने भेजना चाहते हैं।

+0

-1: आपको "पकड़ {}" का लगभग _never_ उपयोग करना चाहिए। यह सभी अपवाद छुपाएगा।अपवाद सिर्फ इसलिए नहीं जाते क्योंकि आप उन्हें नहीं देख सकते हैं। –

+2

अच्छी तरह से उसने कहा // // कुछ –

+4

-1 ?? मैंने पकड़ नहीं किया {}। उनके लिए वहां एक टिप्पणी थी ... कुछ करो। मुझे कैसे पता होना चाहिए कि उन्हें क्या करना है? –

0

आप SmtpClient की Timeout गुण सेट, और फिर Send कॉल द्वारा फेंका किसी भी अपवाद संभाल कर सकते हैं। फिर यह थ्रेड को लॉक नहीं करेगा, हालांकि आपको अपवाद के कारण को संभालना होगा जैसा कि आप उचित मानते हैं।