2011-10-13 16 views
7

मैं एक ईमेल वर्ग निम्नलिखित गुण है कि कहो सामग्री को फ़ैक्स के रूप में भेजें (इसे अपने गंतव्य से बाउंस करने से रोकने के लिए)।.NET में एक ई-मेल के आकार की गणना

मैं अपेक्षाकृत आसानी से अनुलग्नकों के आकार की गणना कर सकता हूं।

क्या पूरे ईमेल आकार की गणना करने का कोई सही तरीका है? मुझे अनुमान है कि मुझे स्ट्रिंग्स के आकार के साथ-साथ किसी हेडर जानकारी को जोड़ना होगा जो संलग्न किया जाएगा?

+3

मुझे लगता है कि अनुलग्नकों और शायद शरीर की सामग्री की तुलना में, हेडर इत्यादि जैसे अन्य सभी आकारों को बल्कि नगण्य होना चाहिए। –

+0

यह सच है, लेकिन मुझे सटीक होने की आवश्यकता है! यानी 1 बाइट नीचे ईमेल किया जाना चाहिए, 1 बाइट ओवर फैक्स किया जाना चाहिए। मैं तारों के आकार को अनदेखा नहीं कर सकता – woggles

उत्तर

12

आप हेडर के आकार को सटीक नहीं समझ सकते हैं। चूंकि मेल सर्वर को अगले सर्वर पर पास करने वाले सभी सर्वर हेडर में कुछ डेटा जोड़ सकते हैं। यह स्पैम स्कैनिंग के पूर्ण स्कोर तक, एक साधारण रेखा से हो सकता है।

तो आप हमेशा इसे कुछ बाइट्स गलत पाएंगे।

अनुलग्नकों के आकार के लिए: वे एन्कोड किए गए हैं, इसलिए बाइट्स का एनआर वास्तविक आकार नहीं लिया गया है। यदि आप उन्हें बेस 64 में परिवर्तित करते हैं और उस स्ट्रिंग की लंबाई लेते हैं, तो वे उस आकार के बारे में हैं जो वे ईमेल में लेंगे (अनुलग्नक नाम के आधार पर अनुलग्नक शीर्षलेख के बिना)। एक अनुमान बाइट्स * 1.33 का एनआर है।

यदि मेल 10 एमबी तक पहुंचता है, तो आप एक अच्छा सुराग प्राप्त कर सकते हैं, लेकिन जब अंतिम और प्राप्त मेल बिल्कुल 10 एमबी ज्ञात नहीं है।

+5

+1 ... और आप यह भी सुनिश्चित नहीं कर सकते कि आपका गंतव्य 10 एमबी = 10240 Kb या 10 एमबी = 10000 Kb मानता है। – Filburt

+1

इस मामले में मैं कर सकता हूं क्योंकि यह एक आंतरिक गंतव्य है, लेकिन बिंदु ले लिया – woggles

1

कुल आकार संलग्नक के स्ट्रिंग प्लस आकार की लंबाई होगी।

यदि आप इसे स्ट्रीम का उपयोग करके उचित ईमेल प्रारूप में क्रमबद्ध कर रहे हैं, तो आप आसानी से लंबाई प्राप्त करने के लिए Stream.Length संपत्ति का उपयोग कर सकते हैं।

इसके बजाय byte[] का उपयोग कर स्मृति में अनुलग्नकों को स्टोर करने की

, मैं सुझाव है कि आप FileInfo का उपयोग संलग्नक की लंबाई प्राप्त करने के लिए और फिर एक FileStream सीधे पाइप के लिए एक लक्ष्य ईमेल फ़ाइल या नेटवर्क धारा में लगाव डेटा का उपयोग करें:

using System.IO; 
... 
FileInfo fi = new FileInfo(@"c:\path\to\file"); 
long fileSize = fi.Length; 
... 
// assuming List<string> for attachment file names 
foreach (string attachFile in attachments) 
{ 
    using (FileStream afs = new FileStream(attachFile)) 
    { 
     byte[] buffer = new byte[1024]; 
     while (!afs.EndOfstream) 
     { 
      int br = afs.Read(buffer, 0, 1024); 
      // assume targetStream is the NetworkStream or FileStream that you want to write to 
      targetStream.Write(buffer, 0, br); 
     } 
    } 
} 
+1

अनुलग्नक कभी भी नहीं भेजे जाते हैं, बल्कि बेस 64 एन्कोड किए जाते हैं। यह प्रत्येक अनुलग्नक के आकार को बढ़ाएगा, उदाहरण के लिए 'स्ट्रीम। लम्बाई' तीसरे स्थान पर। – liggett78

+0

मेल एक System.Net.Mail.MailMessage है और System.Net.SmtpClient – woggles

+0

का उपयोग करके भेजा जा रहा है। इस मामले में, आप अभी भी बाइट एरे का उपयोग नहीं करना चाहते हैं। Http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.attachments.aspx – Polynomial

संबंधित मुद्दे