दिलचस्प पोस्ट
फ़ाइल पथ से छवि दृश्य दिखाएं? सी ++ 0x लैम्ब्डा कैप्चर हमेशा मूल्य से कैप्चर करता है? विधि हस्ताक्षर में जावा "पैरामीटर"? जेएसएफ की आवश्यकता क्या है, जब यूआई को सीएसएस, एचटीएमएल, जावास्क्रिप्ट, jQuery से प्राप्त किया जा सकता है? जन का नाम कैसे बदलना है? पूर्णांक अतिप्रवाह और अपरिभाषित व्यवहार ऑरेकल में सभी टेबल बाधाओं को अक्षम करें एक ऐसा एप्लिकेशन बनाएं जो एक परीक्षण अवधि के बाद समाप्त हो जाएगा स्टॉपवॉच बनाम। का उपयोग करते हुए सिस्टम.डेटाइट.अब समय के लिए घटनाओं ग्रहण त्रुटि संदेश देता है "जावा प्रारंभ किया गया था, लेकिन निकासी कोड = 1 लौटा" पायथन एसआर वर्दी यूनिकोड प्रकार किसी फ़ाइल में सबसे लंबी पंक्ति PHP और (एम्परसेंड, बीटावर्ड और) ऑपरेटर को समझना मोंडास के साथ जुड़ें () के बजाय बाइंड () एनजी-दोहरा में कस्टम सॉर्ट फंक्शन

MemoryStream से एक मेल मेसेज को सी # में संलग्न करें

मैं एक फाइल को ईमेल में संलग्न करने के लिए एक प्रोग्राम लिख रहा हूं वर्तमान में मैं डिस्क में FileStream का उपयोग कर फ़ाइल को बचत कर रहा हूँ, और फिर मैं इसका उपयोग करता हूं

 System.Net.Mail.MailMessage.Attachments.Add( new System.Net.Mail.Attachment("file name")); 

मैं डिस्क में फ़ाइल को संग्रहीत नहीं करना चाहता, मैं फ़ाइल को स्मृति में संग्रहीत करना चाहता हूं और मेमोरी स्ट्रीम से इसे Attachment तक पास करना चाहता हूं।

वेब के समाधान से एकत्रित समाधान "MemoryStream से एक मेल मेसेज को सी # में संलग्न करें"

यहां नमूना कोड है

 System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.IO.StreamWriter writer = new System.IO.StreamWriter(ms); writer.Write("Hello its my sample file"); writer.Flush(); writer.Dispose(); System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain); System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct); attach.ContentDisposition.FileName = "myFile.txt"; // I guess you know how to send email with an attachment // after sending email ms.Close(); 

1 संपादित करें

आप System.Net.Mime.MimeTypeNames जैसे System.Net.Mime.MediaTypeNames.Application.Pdf द्वारा अन्य फ़ाइल प्रकार निर्दिष्ट कर सकते हैं

माइम प्रकार के आधार पर आपको "myFile.pdf" में सही एक्सटेंशन को निर्दिष्ट करने की आवश्यकता है "myFile.pdf"

देर से प्रवेश की एक बिट – लेकिन उम्मीद है कि किसी के लिए अभी भी उपयोगी है: –

इन-मेमरी स्ट्रिंग को एक ईमेल अटैचमेंट (इस विशेष मामले में एक सीएसवी फ़ाइल) के रूप में भेजने के लिए यहां सरलीकृत स्निपेट है।

 using (var stream = new MemoryStream()) using (var writer = new StreamWriter(stream)) // using UTF-8 encoding by default using (var mailClient = new SmtpClient("localhost", 25)) using (var message = new MailMessage("me@example.com", "you@example.com", "Just testing", "See attachment...")) { writer.WriteLine("Comma,Seperated,Values,..."); writer.Flush(); stream.Position = 0; // read from the start of what was written message.Attachments.Add(new Attachment(stream, "filename.csv", "text/csv")); mailClient.Send(message); } 

StreamWriter और अंतर्निहित स्ट्रीम को संदेश भेज दिए जाने के बाद तक इसका निपटान नहीं किया जाना चाहिए ( ObjectDisposedException: Cannot access a closed Stream से बचने के लिए ObjectDisposedException: Cannot access a closed Stream )।

चूंकि मुझे इस बात की पुष्टि नहीं मिल पाई थी, इसलिए मैंने परीक्षण किया कि मेल मेसेज और / या अटैचमेंट ऑब्जेक्ट का निपटारा उन में लोड किए गए धारा के निपटान के रूप में होगा जैसा मुझे लगता था कि होगा।

यह निम्नलिखित परीक्षण के साथ प्रकट होता है कि जब मेलमेस्स का निपटान होता है, तो सभी अनुलग्नक बनाने में प्रयुक्त सभी धाराओं का निपटान भी किया जाएगा। इसलिए जब तक आप अपनी मेल-मेसेज का निपटान करते हैं, तब तक उस धाराओं को बनाने में चला गया धाराओं से निपटने की आवश्यकता नहीं होती है।

 MailMessage mail = new MailMessage(); //Create a MemoryStream from a file for this test MemoryStream ms = new MemoryStream(File.ReadAllBytes(@"C:\temp\test.gif")); mail.Attachments.Add(new System.Net.Mail.Attachment(ms, "test.gif")); if (mail.Attachments[0].ContentStream == ms) Console.WriteLine("Streams are referencing the same resource"); Console.WriteLine("Stream length: " + mail.Attachments[0].ContentStream.Length); //Dispose the mail as you should after sending the email mail.Dispose(); //--Or you can dispose the attachment itself //mm.Attachments[0].Dispose(); Console.WriteLine("This will throw a 'Cannot access a closed Stream.' exception: " + ms.Length); 

यदि आप वास्तव में एक। पीडीएफ जोड़ना चाहते हैं, तो मुझे यह भी जरूरी है कि मेमोरी स्ट्रीम की स्थिति को शून्य पर सेट करना होगा।

 var memStream = new MemoryStream(yourPdfByteArray); memStream.Position = 0; var contentType = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Application.Pdf); var reportAttachment = new Attachment(memStream, contentType); reportAttachment.ContentDisposition.FileName = "yourFileName.pdf"; mailMessage.Attachments.Add(reportAttachment); 

यदि आप जो कर रहे हैं, एक स्ट्रिंग संलग्न कर रहे हैं, तो आप इसे केवल 2 लाइनों में कर सकते हैं:

 mail.Attachments.Add(Attachment.CreateAttachmentFromString("1,2,3", "text/csv"); mail.Attachments.Last().ContentDisposition.FileName = "filename.csv"; 

मैं अपना ईमेल सर्वर StreamWriter के साथ उपयोग करने के लिए मेरा काम करने में सक्षम नहीं था
मुझे लगता है कि क्योंकि StreamWriter के साथ आप बहुत सारी फाइल प्रॉपर्टी जानकारी खो चुके हैं और संभवत: हमारे सर्वर को यह नहीं पता था कि क्या याद आ रही थी।
अटैचमेंट के साथ। CreateAttachmentFromString () यह सब कुछ जिसे मैं चाहता था बनाया और महान काम करता है!

अन्यथा, मैं आपकी फ़ाइल को स्मृति में लिखने का सुझाव देता हूं और इसे MemoryStream (बाइट []) का उपयोग करके खोलता है, और सभी को एक साथ स्ट्रीम ड्रायवर को छोड़कर।

मैं इस प्रश्न पर आया था क्योंकि मुझे एक एक्सेल फाइल संलग्न करना पड़ता था जो मुझे कोड के माध्यम से उत्पन्न होता है और MemoryStream रूप में उपलब्ध है I मैं इसे मेल संदेश में संलग्न कर सकता था, लेकिन इसे 64Bytes फ़ाइल के बजाय ~ 6KB के रूप में भेजा गया था, जैसा कि इसका मतलब था तो, मेरे लिए काम करने वाला समाधान यह था:

 MailMessage mailMessage = new MailMessage(); Attachment attachment = new Attachment(myMemorySteam, new ContentType(MediaTypeNames.Application.Octet)); attachment.ContentDisposition.FileName = "myFile.xlsx"; attachment.ContentDisposition.Size = attachment.Length; mailMessage.Attachments.Add(attachment); 

attachment.ContentDisposition.Size का मान सेट करना। attachment.ContentDisposition.Size मुझे attachment.ContentDisposition.Size के सही आकार के साथ संदेश भेजते हैं।

अन्य खुली स्मृति धारा का उपयोग करें:

उदाहरण के लिए उदाहरण pdf और MVC4 सी # नियंत्रक में पीडीएफ भेजें

  public void ToPdf(string uco, int idAudit) { Response.Clear(); Response.ContentType = "application/octet-stream"; Response.AddHeader("content-disposition", "attachment;filename= Document.pdf"); Response.Buffer = true; Response.Clear(); //get the memorystream pdf var bytes = new MisAuditoriasLogic().ToPdf(uco, idAudit).ToArray(); Response.OutputStream.Write(bytes, 0, bytes.Length); Response.OutputStream.Flush(); } public ActionResult ToMail(string uco, string filter, int? page, int idAudit, int? full) { //get the memorystream pdf var bytes = new MisAuditoriasLogic().ToPdf(uco, idAudit).ToArray(); using (var stream = new MemoryStream(bytes)) using (var mailClient = new SmtpClient("**YOUR SERVER**", 25)) using (var message = new MailMessage("**SENDER**", "**RECEIVER**", "Just testing", "See attachment...")) { stream.Position = 0; Attachment attach = new Attachment(stream, new System.Net.Mime.ContentType("application/pdf")); attach.ContentDisposition.FileName = "test.pdf"; message.Attachments.Add(attach); mailClient.Send(message); } ViewBag.errMsg = "Documento enviado."; return Index(uco, filter, page, idAudit, full); } 

मुझे लगता है कि यह कोड आपकी सहायता करेगा:

 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Net.Mail; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnSubmit_Click(object sender, EventArgs e) { try { MailAddress SendFrom = new MailAddress(txtFrom.Text); MailAddress SendTo = new MailAddress(txtTo.Text); MailMessage MyMessage = new MailMessage(SendFrom, SendTo); MyMessage.Subject = txtSubject.Text; MyMessage.Body = txtBody.Text; Attachment attachFile = new Attachment(txtAttachmentPath.Text); MyMessage.Attachments.Add(attachFile); SmtpClient emailClient = new SmtpClient(txtSMTPServer.Text); emailClient.Send(MyMessage); litStatus.Text = "Message Sent"; } catch (Exception ex) { litStatus.Text = ex.ToString(); } } }