전자 메일 System.ObjectDisposedException에 보내기에서 FileStream 첨부

AppleCiderYummy

좋은 날,

첨부 파일을 보내는 이메일에 파일 스트림 파일을 첨부하려고합니다. 시나리오는을 사용하여 파일을 FileStream만든 다음 내 이메일에 첨부해야한다는 것입니다.

지금까지 내 샘플 코드는 다음과 같습니다.

파일 생성 :

public FileStream CreateFileStream(){
    using (var ms = new MemoryStream())
    {
    var writer = new StreamWriter(ms);

    writer.WriteLine("file content blah blah blahh");
    writer.Flush();

    //You have to rewind the MemoryStream before copying
    ms.Seek(0, SeekOrigin.Begin);

       using (var fs = new FileStream("Filename.txt", FileMode.Create))
       {
          ms.CopyTo(fs);
          return fs;
       }
    }
}

다음은 이메일 전송을위한 샘플 코드입니다.

// attachment
var fileStreamFile = dto.FileStreamFile;

var contentType = new ContentType(MediaTypeNames.Text.Plain);
var attach = new Attachment(dto.FileStreamFile, contentType);
attach.ContentDisposition.FileName = "File.txt";

mail.Attachments.Add(attach);
...
// code for sending here
...
dto.FileStreamFile.Dispose(); // for disposing File Stream

fileStreamFile null이 아니지만 다음과 같은 오류가 발생합니다.

Handle = 'dto.FileStreamFile.Handle' threw an exception of type 'System.ObjectDisposedException'

첨부 코드를 주석 처리하면 어쨌든 이메일 전송이 정상적으로 작동합니다. 첨부 할 코드를 포함하면 이메일 전송이 실패합니다.FileStream

도와주세요. 미리 감사드립니다

장군

귀하의 코드

using (var fs = new FileStream("Filename.txt", FileMode.Create))
{
    ms.CopyTo(fs);
    return fs; // you are returning here
} // hang on, this is a using statement which will dispose fs!

이것으로 번역됩니다

FileStream fileStream = new FileStream("Filename.txt", FileMode.Create);
try
{
   return fileStream;
}
finally
{
   if (fileStream != null)
   {
      ((IDisposable)fileStream).Dispose();
   }
}

return에있는 경우 try finally반환 값을 로컬 변수에 저장하여 finally. 다음과 같이 보일 것입니다.

FileStream fileStream = new FileStream("Filename.txt", FileMode.Create);
try
{
   temp = fileStream;
}
finally
{
   if (fileStream != null)
   {
      ((IDisposable)fileStream).Dispose();
   }
}

return temp;

무슨 일이 일어나고 있는지 알아보기 위해 IL살펴볼 수 있습니다.

IL_0000: ldstr "someFile"
IL_0005: ldc.i4.2
IL_0006: newobj instance void [mscorlib]System.IO.FileStream::.ctor(string, valuetype[mscorlib]System.IO.FileMode)
// stloc.0 Pops the current value from the top of the evaluation stack and stores it in the 
// local variable list at a specified index. This is your fs reference
IL_000b: stloc.0 
   .try
{
   // ldloc.0 Loads the local variable at a specific index onto the evaluation stack.
   // This is your fs reference
   IL_000c: ldloc.0
   // stloc.1 Pops the current value from the top of the evaluation stack and stores it in 
   // the local variable list at a specified index. This is your fs reference
   IL_000d: stloc.1
   IL_000e: leave.s IL_001a
} // end .try
finally
{
   IL_0010: ldloc.0
   IL_0011: brfalse.s IL_0019     
   IL_0013: ldloc.0
   // oh no we just Disposed fs!!!
   IL_0014: callvirt instance void [mscorlib]System.IDisposable::Dispose()
   IL_0019: endfinally
} // end handler

// ldloc.1 Loads the local variable at a specific index onto the evaluation stack.
// This is your fs reference
IL_001a: ldloc.1
//ret Returns from the current method, pushing a return value (if present) from 
//the callee's evaluation stack onto the caller's evaluation stack.
IL_001b: ret

짧은에서는, 반환하지 않는 IDisposableA로부터 참조를 using가 얻을 것이다으로 문 배치 .

다른 컨텍스트에서 FileStream(없이 using) 생성 Dispose하거나 코드를 리팩터링해야합니다.

최신 정보

하지만 스트림으로 이메일 전송을 다루는 using 문을 입력 한 후 내 이메일 전송이 작동하지 않습니다.

당신은 이것을 지나치게 복잡하게 만들 수 있습니다.

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("[email protected]", "[email protected]", "Just testing", "See attachment..."))
         {
            writer.WriteLine("file content blah blah blahh");
            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);
         }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

VBA를 통해 Excel에서 전자 메일 첨부 파일 보내기

분류에서Dev

수신 및 Microsoft 봇 프레임 워크 내에서 전자 메일로 첨부 파일 보내기

분류에서Dev

SendObject를 사용하여 Access에서 Excel 개체 보내기, 전자 메일에 첨부 파일 없음

분류에서Dev

OneDrive에서 전자 메일 첨부 파일 폴더 삭제

분류에서Dev

OneDrive에서 전자 메일 첨부 파일 폴더 삭제

분류에서Dev

Python에서 첨부 파일이있는 이메일 보내기

분류에서Dev

PDF 첨부 파일로 Google 문서에 이메일 보내기

분류에서Dev

메일 : 명령 줄에서 첨부 파일과 함께 이메일 보내기

분류에서Dev

이메일을 보내기 전에 파일 변경시 첨부 파일을 삭제 / 추가해야하나요?

분류에서Dev

이메일을 보내기 전에 파일 변경시 첨부 파일을 삭제 / 추가해야하나요?

분류에서Dev

이메일에 inputstream 첨부

분류에서Dev

memoryStream에서 첨부 파일과 함께 MailKit 이메일 보내기

분류에서Dev

Python에서 HTML + plain_text 이메일로 PDF 첨부 파일 보내기

분류에서Dev

첨부 파일이있는 IBM Notes에서 이메일 보내기

분류에서Dev

활성 Excel 통합 문서를 전자 메일에 첨부하는 방법

분류에서Dev

자바에서 첨부 파일이 아닌 메일 본문에 이미지를 보내는 방법

분류에서Dev

자산에서 이메일로 파일을 첨부하는 Android

분류에서Dev

Python을 사용하여 Excel의 사용자 목록에 첨부 파일이있는 Outlook 전자 메일 보내기

분류에서Dev

Shell에서 첨부 파일 (.pdf)과 함께 HTML 메시지 보내기

분류에서Dev

Powershell GUI 전자 메일 첨부 파일에서 빈 인수를 끌어서 놓기

분류에서Dev

Avast는 컴퓨터에서 보내는 모든 이메일에 광고를 자동으로 첨부합니다.

분류에서Dev

특정 메일 ID에서 이메일 첨부 파일 자동 저장

분류에서Dev

안드로이드에서 (전자 메일, 보관 용 계정 등에) 보내려는 PDF를 첨부하는 방법

분류에서Dev

저장 후 자동으로 pdf 파일을 메일에 첨부

분류에서Dev

SoapUI에서 base64Binary로 첨부 파일 보내기

분류에서Dev

Microsoft Azure Chatbot에서 이미지 첨부 파일 보내기

분류에서Dev

CouchDB에서 사용자에게 첨부 파일을 보내시겠습니까?

분류에서Dev

Outlook 2010에서 첨부 파일없이 전자 메일을 보내겠다고 경고하는 방법은 무엇입니까?

분류에서Dev

C # MVC 5 Bussness Layer에서 이메일 첨부 파일을 보내기 위해 html보기를 PDF로 변환

Related 관련 기사

  1. 1

    VBA를 통해 Excel에서 전자 메일 첨부 파일 보내기

  2. 2

    수신 및 Microsoft 봇 프레임 워크 내에서 전자 메일로 첨부 파일 보내기

  3. 3

    SendObject를 사용하여 Access에서 Excel 개체 보내기, 전자 메일에 첨부 파일 없음

  4. 4

    OneDrive에서 전자 메일 첨부 파일 폴더 삭제

  5. 5

    OneDrive에서 전자 메일 첨부 파일 폴더 삭제

  6. 6

    Python에서 첨부 파일이있는 이메일 보내기

  7. 7

    PDF 첨부 파일로 Google 문서에 이메일 보내기

  8. 8

    메일 : 명령 줄에서 첨부 파일과 함께 이메일 보내기

  9. 9

    이메일을 보내기 전에 파일 변경시 첨부 파일을 삭제 / 추가해야하나요?

  10. 10

    이메일을 보내기 전에 파일 변경시 첨부 파일을 삭제 / 추가해야하나요?

  11. 11

    이메일에 inputstream 첨부

  12. 12

    memoryStream에서 첨부 파일과 함께 MailKit 이메일 보내기

  13. 13

    Python에서 HTML + plain_text 이메일로 PDF 첨부 파일 보내기

  14. 14

    첨부 파일이있는 IBM Notes에서 이메일 보내기

  15. 15

    활성 Excel 통합 문서를 전자 메일에 첨부하는 방법

  16. 16

    자바에서 첨부 파일이 아닌 메일 본문에 이미지를 보내는 방법

  17. 17

    자산에서 이메일로 파일을 첨부하는 Android

  18. 18

    Python을 사용하여 Excel의 사용자 목록에 첨부 파일이있는 Outlook 전자 메일 보내기

  19. 19

    Shell에서 첨부 파일 (.pdf)과 함께 HTML 메시지 보내기

  20. 20

    Powershell GUI 전자 메일 첨부 파일에서 빈 인수를 끌어서 놓기

  21. 21

    Avast는 컴퓨터에서 보내는 모든 이메일에 광고를 자동으로 첨부합니다.

  22. 22

    특정 메일 ID에서 이메일 첨부 파일 자동 저장

  23. 23

    안드로이드에서 (전자 메일, 보관 용 계정 등에) 보내려는 PDF를 첨부하는 방법

  24. 24

    저장 후 자동으로 pdf 파일을 메일에 첨부

  25. 25

    SoapUI에서 base64Binary로 첨부 파일 보내기

  26. 26

    Microsoft Azure Chatbot에서 이미지 첨부 파일 보내기

  27. 27

    CouchDB에서 사용자에게 첨부 파일을 보내시겠습니까?

  28. 28

    Outlook 2010에서 첨부 파일없이 전자 메일을 보내겠다고 경고하는 방법은 무엇입니까?

  29. 29

    C # MVC 5 Bussness Layer에서 이메일 첨부 파일을 보내기 위해 html보기를 PDF로 변환

뜨겁다태그

보관