이메일에 파일을 첨부하는 프로그램을 작성 중입니다. 현재 파일을 사용 FileStream
하여 디스크에 저장 하고 있습니다.
System.Net.Mail.MailMessage.Attachments.Add(
new System.Net.Mail.Attachment("file name"));
디스크에 파일을 저장하고 싶지 않고 파일을 메모리에 저장하고 메모리 스트림에서 Attachment
.
답변
다음은 샘플 코드입니다.
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"
답변
약간의 늦은 입장-그러나 다른 사람에게 여전히 유용하기를 바랍니다.
다음은 메모리 내 문자열을 이메일 첨부 파일 (이 특정 경우에는 CSV 파일)로 보내기위한 간단한 스 니펫입니다.
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
.
답변
어디에서나 이에 대한 확인을 찾을 수 없었기 때문에 MailMessage 및 / 또는 Attachment 개체를 처리하면 예상대로로드 된 스트림이 처리되는지 테스트했습니다.
다음 테스트에서는 MailMessage가 삭제 될 때 첨부 파일을 만드는 데 사용 된 모든 스트림도 삭제됩니다. 따라서 MailMessage를 폐기하는 한 생성에 들어간 스트림은 그 이상으로 처리 할 필요가 없습니다.
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);
답변
실제로 .pdf를 추가하려면 메모리 스트림의 위치를 0으로 설정해야합니다.
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);
답변
만약 당신이하고있는 모든 것이 문자열을 붙이는 것이라면, 단 두 줄로 할 수 있습니다 :
mail.Attachments.Add(Attachment.CreateAttachmentFromString("1,2,3", "text/csv");
mail.Attachments.Last().ContentDisposition.FileName = "filename.csv";
StreamWriter와 함께 메일 서버를 사용하여 작업 할 수 없었습니다.
StreamWriter를 사용하면 많은 파일 속성 정보가 누락되고 서버가 누락 된 항목이 마음에 들지 않았기 때문일 수 있습니다.
Attachment.CreateAttachmentFromString ()을 사용하면 필요한 모든 것을 만들었고 훌륭하게 작동합니다!
그렇지 않으면 메모리에있는 파일을 가져와 MemoryStream (byte [])을 사용하여 열고 StreamWriter를 모두 건너 뛰는 것이 좋습니다.
답변
코드를 통해 생성 한 Excel 파일을 첨부해야하므로 MemoryStream
. 나는 그것을 메일 메시지에 첨부 할 수 있지만 그것이 의미하는대로 ~ 6KB 대신 64Bytes 파일로 전송되었습니다. 그래서 나를 위해 일한 해결책은 다음과 같습니다.
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
올바른 크기의 첨부 파일로 메시지를 보내도록 허용 .
답변
OTHER OPEN 메모리 스트림 사용 :
lauch pdf의 예 및 MVC4 C # 컨트롤러에서 pdf 보내기
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);
}