2009-08-12 22 views
75

मैं MailMessage ऑब्जेक्ट को डिस्क पर कैसे सहेजूं? MailMessage ऑब्जेक्ट किसी भी सेव() विधियों का पर्दाफाश नहीं करता है।* मैमसेज ऑब्जेक्ट को * .eml या * .msg फ़ाइल के रूप में डिस्क पर सहेजने के लिए कैसे करें

यदि कोई प्रारूप, * .eml या * .msg में सहेजता है तो मुझे कोई समस्या नहीं है। कोई आईडिया कि इसे कैसे किया जाए?

उत्तर

102

सरलता के लिए, मैं सिर्फ एक व्याख्या एक Connect item से बोली होगी:

आप वास्तव में SmtpClient कॉन्फ़िगर नेटवर्क के बजाय फ़ाइल व्यवस्था करने के लिए ईमेल भेजने के लिए कर सकते हैं।

SmtpClient client = new SmtpClient("mysmtphost"); 
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
client.PickupDirectoryLocation = @"C:\somedirectory"; 
client.Send(message); 

तुम भी इस तरह से अपनी आवेदन विन्यास फाइल में इसे सेट करने से:

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="SpecifiedPickupDirectory"> 
       <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 

ईमेल भेजने के बाद आप प्रोग्राम के रूप में निम्नलिखित कोड का उपयोग कर ऐसा कर सकते हैं , आपको देखना चाहिए कि ईमेल फ़ाइलों को आपके द्वारा निर्दिष्ट निर्देशिका में जोड़ा गया है। फिर आप की एक अलग प्रक्रिया बैच मोड में ईमेल संदेशों को भेज सकते हैं।

आपको सूचीबद्ध एक के बजाय खाली कन्स्ट्रक्टर का उपयोग करने में सक्षम होना चाहिए, क्योंकि यह वैसे भी इसे नहीं भेजेगा।

+1

मैंने पाया कि मैं भी रयान क्या प्रदान की के अलावा <नेटवर्क होस्ट = "...", आदि जोड़ने के लिए की जरूरत वीबी के लिए एक है । –

+8

आउटपुट .eml फ़ाइल के फ़ाइल नाम को बदलने का कोई तरीका है? मैं इसे निम्न जैसा दिखाना पसंद करूंगा: f80f4695-551c-47d7-8879-40ad89707b23.eml धन्यवाद! – buzzzzjay

+6

हालांकि एक पुरानी पोस्ट, मैं @buzzzzjay से अंतिम प्रश्न का उत्तर जोड़ना चाहता हूं: यहां एक नज़र डालें: [link] (http://www.codeproject.com/Articles/32434/Adding-Save- कार्यक्षमता- टू-माइक्रोसॉफ्ट-नेट-मेल-मा) –

22

मेलमेसेज को ईएमएल डेटा युक्त स्ट्रीम में बदलने के लिए यहां एक विस्तार विधि है। यह स्पष्ट रूप से एक हैक का एक बिट है क्योंकि यह फ़ाइल सिस्टम का उपयोग करता है, लेकिन यह काम करता है।

public static void SaveMailMessage(this MailMessage msg, string filePath) 
{ 
    using (var fs = new FileStream(filePath, FileMode.Create)) 
    { 
     msg.ToEMLStream(fs); 
    } 
} 

/// <summary> 
/// Converts a MailMessage to an EML file stream. 
/// </summary> 
/// <param name="msg"></param> 
/// <returns></returns> 
public static void ToEMLStream(this MailMessage msg, Stream str) 
{ 
    using (var client = new SmtpClient()) 
    { 
     var id = Guid.NewGuid(); 

     var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name); 

     tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp"); 

     // create a temp folder to hold just this .eml file so that we can find it easily. 
     tempFolder = Path.Combine(tempFolder, id.ToString()); 

     if (!Directory.Exists(tempFolder)) 
     { 
      Directory.CreateDirectory(tempFolder); 
     } 

     client.UseDefaultCredentials = true; 
     client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
     client.PickupDirectoryLocation = tempFolder; 
     client.Send(msg); 

     // tempFolder should contain 1 eml file 

     var filePath = Directory.GetFiles(tempFolder).Single(); 

     // stream out the contents 
     using (var fs = new FileStream(filePath, FileMode.Open)) 
     { 
      fs.CopyTo(str); 
     } 

     if (Directory.Exists(tempFolder)) 
     { 
      Directory.Delete(tempFolder, true); 
     } 
    } 
} 

फिर आप धारा thats लौटे लेने के लिए और के रूप में आप डिस्क पर किसी अन्य स्थान पर सहेजने या एक डाटाबेस क्षेत्र में भंडारण, या यहां तक ​​कि एक अनुलग्नक के रूप ईमेल सहित इसके साथ चाहते हैं, कर सकते हैं।

+1

हाय सेल ... आपका कोड अच्छी तरह से काम करता है और हां यह एमएमएल या एमएसएस फ़ाइल बना रहा है लेकिन मैं इसे एमएस आउटलुक में नहीं खोल सकता :(ऐसा करने में आपकी मदद की ज़रूरत है। –

+2

ईएमएल फ़ाइल को Outlook में खोलना चाहिए, लेकिन अगर आप फ़ाइल एक्सटेंशन का नाम बदलने का प्रयास नहीं कर सकते हैं।एमएचटी, फिर इसे इंटरनेट एक्सप्लोरर में खोलें। – saille

+0

सेलेल - क्या "पता" पते के बिना सहेजना संभव है, इसलिए इसे उपयोगकर्ता से भेजा जा सकता है जो इसे खोलता है? चीयर्स। –

0

एक कारण या किसी अन्य कारण के लिए client.send विफल (उस विधि का उपयोग करके वास्तविक प्रेषण के ठीक बाद) तो मैंने अच्छी 'ओएल सीडीओ और एडीओडीबी स्ट्रीम में प्लग किया। मैसेज वैल्यू सेट करने से पहले मुझे एक टेम्पलेट.एमएल के साथ सीडीओ.मेज लोड करना पड़ा। लेकिन यह काम करता है।

के बाद से ऊपर एक यहाँ सी है

MyMessage.From = New Net.Mail.MailAddress(mEmailAddress) 
    MyMessage.To.Add(mToAddress) 
    MyMessage.Subject = mSubject 
    MyMessage.Body = mBody 

    Smtp.Host = "------" 
    Smtp.Port = "2525" 
    Smtp.Credentials = New NetworkCredential(------) 

    Smtp.Send(MyMessage)  ' Actual Send 

    Dim oldCDO As CDO.Message 
    oldCDO = MyLoadEmlFromFile("template.eml") ' just put from, to, subject blank. leave first line blank 
    oldCDO.To = mToAddress 
    oldCDO.From = mEmailAddress 
    oldCDO.Subject = mSubject 
    oldCDO.TextBody = mBody 
    oldCDO.HTMLBody = mBody 
    oldCDO.GetStream.Flush() 
    oldCDO.GetStream.SaveToFile(yourPath)