মেমরিস্ট্রিম থেকে সি # তে একটি মেলমেসেজে একটি ফাইল সংযুক্ত করুন


113

ইমেলটিতে একটি ফাইল সংযুক্ত করার জন্য আমি একটি প্রোগ্রাম লিখছি। বর্তমানে আমি FileStreamডিস্কের সাহায্যে ফাইল সংরক্ষণ করছি এবং তারপরে আমি এটি ব্যবহার করব

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

আমি ডিস্কে ফাইল সঞ্চয় করতে চাই না, আমি মেমরিতে ফাইল সঞ্চয় করতে চাই এবং মেমরি স্ট্রিম থেকে এটিকে পাস করি Attachment

উত্তর:


104

এখানে নমুনা কোড।

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();
ms.Position = 0;

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"


আমি এই ধরণের সিস্টেম.নেট.মাইম.কমেন্টটাইপ সিটি = নতুন সিস্টেম.নেট.মাইম.কন্টেন্টটাইপ (System.Net.Mime.MediaTypeNames.Text.Plain) এ কীভাবে পাস করব তা আমি পিডিএফ ব্যবহার করছি;
জয়ন আলী

3
আপনার ব্যবহার করা দরকারSystem.Net.Mime.MediaTypeNames.Application.Pdf
ওয়াকাস রাজা

5
writer.Disopose()আমার সমাধানের জন্য খুব তাড়াতাড়ি ছিল তবে অন্য সমস্ত দুর্দান্ত উদাহরণ।
কাজিমিয়ারজ জাওর

7
আমি নিশ্চিত ms.Position = 0;যে সংযুক্তি তৈরির আগে একটি হওয়া উচিত ।
কেনে ইভিট

94

দেরিতে প্রবেশের কিছুটা সময় - তবে আশা করি এখনও সেখানকার কারও পক্ষে দরকারী: -

ইমেল সংযুক্তি হিসাবে একটি ইন-মেমরি স্ট্রিং (এই নির্দিষ্ট ক্ষেত্রে একটি সিএসভি ফাইল) প্রেরণের জন্য এখানে একটি সরলীকৃত স্নিপেট।

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);
}

স্ট্রাইমাইটার এবং অন্তর্নিহিত স্ট্রিমটি বার্তা না দেওয়ার আগ পর্যন্ত নিষ্পত্তি করা উচিত নয় (এড়াতে ObjectDisposedException: Cannot access a closed Stream)।


30
যে কোনও নতুন আগতদের জন্য, আমার জন্য কীটিstream.position = 0;
mtbennett

3
() এর ব্যবহারের যথাযথ ব্যবহারের জন্য +1 - এমন কিছু যা অনলাইনে উদাহরণ এবং স্নিপেটগুলি থেকে সর্বদা অনুপস্থিত বলে মনে হয় (এই প্রশ্নের গ্রহণযোগ্য উত্তর সহ)।
জে কুইরিডো

2
@ এমটিবেনেটকে ধন্যবাদ যে সেটিও আমার সমস্যা ছিল - সেটিংস stream.Position=0
Icarus

মাইম টাইপটি এখানে সেট করে আসলে কী করে? ই-মেইল ক্লায়েন্ট অ্যাপের জন্য কিছু?
xr280xr

@ xr280xr - সঠিক। এই প্যারামিটারটি আসলে প্রয়োজন হয় না তবে এটি সহ প্রাপকের ইমেল ক্লায়েন্টটিকে সংযুক্তিটি সংবেদনশীলভাবে পরিচালনা করতে সহায়তা করা উচিত। ডকস.মাইক্রোসফট.ইন- ইউএস
প্রশান্ত

28

যেহেতু আমি এর কোথাও নিশ্চিতকরণ খুঁজে পাইনি, তাই আমি পরীক্ষা করেছিলাম যদি মেইলম্যাসেজ এবং / অথবা সংযুক্তি বস্তুটি নিষ্পত্তির মাধ্যমে প্রবাহিত লোডগুলি আমার মধ্যে প্রবাহিত হওয়ার পূর্বে প্রত্যাশিত হয় would

এটি নিম্নলিখিত পরীক্ষার সাথে প্রদর্শিত হবে যে মেলমেসেজ নিষ্পত্তি হলে সংযুক্তি তৈরি করতে ব্যবহৃত সমস্ত স্ট্রিমগুলিও নিষ্পত্তি করা হবে। সুতরাং যতক্ষণ আপনি আপনার মেইলমেজেজ স্রোতগুলিকে স্রষ্টার মধ্যে ফেলেছেন ততক্ষণ তার বাইরে পরিচালনার প্রয়োজন হবে না।

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);

জঘন্য, যে চালাক। কোডের একটি লাইন এবং আপনি কোনও সংযুক্তি হিসাবে কোনও ইমেলটিতে একটি চিত্র ফাইল যুক্ত করতে পারেন। দুর্দান্ত টিপ!
মাইক গ্লেডহিল

আমি আশা করি এটি আসলে নথিভুক্ত ছিল। আপনার এই আচরণের পরীক্ষা / যাচাইকরণ দরকারী, তবে অফিসিয়াল ডকুমেন্টেশনে না থাকলে বিশ্বাস করা মুশকিল যে এটি সর্বদা ক্ষেত্রেই থাকবে। যাইহোক, পরীক্ষার জন্য ধন্যবাদ।
লুকাস

ভাল প্রচেষ্টা এবং গবেষণা @ থাইমাইন
vibs2006

1
রেফারেন্স উত্স গণনা করা হলে এটি নথিভুক্ত বাছাই করা হয়। mailmessage.dispose কল attachments.dispose যা পালাক্রমে কল প্রতিটি সংযুক্তিতে নিষ্পত্তি যা mimepart এ, স্ট্রীম বন্ধ
সিই ম্যাকশারফেস

ধন্যবাদ. আমি ভাবছিলাম যে মেল বার্তাটি করা উচিত এবং এটি করা দরকার কারণ আমি বার্তাটি যেখানে পাঠানো হয়েছে তার চেয়ে আলাদা ক্লাসে আমার বার্তা তৈরি করছি।
xr280xr

20

আপনি যদি সত্যিই একটি .পিডিএফ যুক্ত করতে চান তবে আমি জিরোতে মেমরি স্ট্রিমের অবস্থান নির্ধারণ করা প্রয়োজনীয় মনে করেছি।

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);

একটি পিডিএফ প্রেরণে ঘন্টা ব্যয় করুন এটি একটি কবজির মতো কাজ করেছে!
dijam

12

যদি আপনি যা করছেন সবগুলি যদি একটি স্ট্রিং সংযুক্ত করা হয় তবে আপনি এটি কেবল 2 লাইনেই করতে পারেন:

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

আমি আমার মেইল ​​সার্ভারটি স্ট্রিমরাইটার দিয়ে ব্যবহার করে কাজ করতে সক্ষম হইনি।
আমি মনে করি কারণ স্ট্রিম রাইটারের সাথে আপনি প্রচুর ফাইল সম্পত্তি সম্পর্কিত তথ্য হারিয়ে যাচ্ছেন এবং সম্ভবত আমাদের সার্ভারটি কী অনুপস্থিত তা পছন্দ করেনি।
সংযুক্তি.ক্রিয়েটএটাচমেন্টফ্র্যামস্ট্রিং () দিয়ে এটি আমার প্রয়োজনীয় সবকিছু তৈরি করেছে এবং দুর্দান্ত কাজ করে!

অন্যথায়, আমি মেমরিতে থাকা আপনার ফাইলটি নেওয়ার এবং মেমোরিস্ট্রিম (বাইট []] ব্যবহার করে এবং স্ট্রিম রাইটারকে একসাথে এড়িয়ে যাওয়ার পরামর্শ দিচ্ছি।


2

আমি এই প্রশ্নটিতে অবতরণ করেছি কারণ কোডের মাধ্যমে আমার উত্পন্ন একটি এক্সেল ফাইল সংযুক্ত করার দরকার ছিল এবং হিসাবে উপলব্ধ MemoryStream। আমি এটিকে মেল বার্তায় সংযুক্ত করতে পারি তবে এটি ~ 6KB এর পরিবর্তে 64৪ বাইট ফাইল হিসাবে প্রেরণ করা হয়েছিল কারণ এটি ছিল। সুতরাং, যে সমাধানটি আমার পক্ষে কাজ করেছিল তা হ'ল:

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আমাকে সংযুক্তির সঠিক আকার সহ বার্তাগুলি প্রেরণ করতে দিন।


2

অন্য উন্মুক্ত মেমরির ধারা ব্যবহার করুন:

উদাহরণস্বরূপ লুচ পিডিএফ এবং এমডিসি 4 সি # কন্ট্রোলারে পিডিএফ প্রেরণ করুন

        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);
    }

stream.Position=0; লাইনটি যা আমাকে সাহায্য করেছিল। এটি ছাড়াই আমার ক্রেডিট কিছু কেবিতে মাত্র 504 বাইট ইনস্টল করা হয়েছিল
আব্দুল হামেদ

-6

আমি মনে করি এই কোডটি আপনাকে সহায়তা করবে:

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();
    }
  }
}

5
-1 এই উত্তরটি সংযুক্তি (স্ট্রিং ফাইলনাম) কনস্ট্রাক্টর ব্যবহার করে ডিস্ক থেকে সংযুক্তি লোড করে। ওপিতে বিশেষভাবে বলা হয়েছে যে তিনি ডিস্ক থেকে লোড করতে চান না। এছাড়াও, এটি হ'ল রেড সোয়ান এর উত্তরের লিঙ্কটি থেকে কোড কপি-পেস্ট করেছে।
ওয়াল্টার স্ট্যাবোজ

সংযুক্তি ফাইল স্ট্রিমটিও নিষ্পত্তি হয় না
সামেহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.