2010-04-12 5 views
0

내 응용 프로그램에서 메일 발송과 관련하여이 비정상적인 문제가 있습니다. 처음에는 작동하지 않았습니다. (오류를 잘못 전달할 수 없게되었습니다.) 어쨌든 적절한 인증을 추가하고 작동합니다. 내 문제는 지금 약 300 개의 전자 메일 (각각 500k 첨부 파일 첨부)을 보내려고하면 응용 프로그램이 프로세스를 통해 95 % 정도 걸려 들기 시작한다는 것입니다. 여기 System.Net.Mail의 성능 문제

는 각 메일이
Using mail As New MailMessage() 
      With mail 
       .From = New MailAddress(My.Resources.EmailFrom) 
       For Each contact As Contact In Contacts 
        .To.Add(contact.Email) 
       Next 
       .Subject = "Accounting" 
       .Body = My.Resources.EmailBody 
       'Back the stream up to the beginning orelse the attachment 
       'will be sent as a zero (0) byte file. 
       attachment.Seek(0, SeekOrigin.Begin) 
       .Attachments.Add(New Attachment(attachment, String.Concat(Item.Year, Item.AttachmentType.Extension))) 
      End With 
      Dim smtp As New SmtpClient("192.168.1.2") 
      With smtp 
       .DeliveryMethod = SmtpDeliveryMethod.Network 
       .UseDefaultCredentials = False 
       .Credentials = New NetworkCredential("username", "password") 
       .Send(mail) 
      End With 
     End Using 
     With item 
      .SentStatus = True 
      .DateSent = DateTime.Now.Date 
      .Save() 
     End With 
     Return 

내가 생각

을 보내도록 요구하는 내 코드의 일부는, 그냥 다음 하나의 SMTP conenction을 열고 바로 모든 메일을 준비하고 컬렉션에 추가 할 수있다 이처럼 전화를 걸고 컬렉션을 반복하십시오.

Using mail As New MailMessage() 
... 
MailCollection.Add(mail) 

End Using 

... 

       Dim smtp As New SmtpClient("192.168.1.2") 
       With smtp 
        .DeliveryMethod = SmtpDeliveryMethod.Network 
        .UseDefaultCredentials = False 
        .Credentials = New NetworkCredential("username", "password") 

        For Each mail in MainCollection 
          .Send(mail) 
        Next 

       End With 
+0

이 문제가 성공적으로 해결 되었습니까? 이 일에 아직도 도움이 필요합니까? – jcolebrand

답변

1

발생하는 제한 사항은 사용자 코드가 아닌 SMTP 서버에 의해 강력하게 적용됩니다. SMTP 서버는 스팸을 남용하는 경향이 매우 높으므로 그러한 악용을 막을 수있는 메커니즘이 있습니다.

각 이메일을 개별적으로 보내는 것이 항상 효과가있는 것은 아니며 다른보다 정교한 메커니즘과 경쟁하고 있습니다.

기술적으로는 그렇습니다. 개별적으로 보내는 코드를 작성할 수 있습니다.

+0

나는 똑같은 것을 생각하고 있었다 (스팸 - 남용). –

+1

완전히 로컬 인 경우 Exchange 서버의 스로틀 속도를 어딘가에서 제어 할 수 있어야합니다. 또한 한 달에 한 번만 보내는 경우 각 전송 사이에 지연을 넣습니다. 5 ~ 10 초 정도 걸릴 수 있습니다. 대부분의 사람들이 좋아하지 않는 세 번째 옵션은 아무에게도 (또는 자신에게) 보내지 말고 동일한 도메인의 사람들에게 숨은 참조를 배치 할 수 있습니다. 동일한 도메인 부분은 단일 SMTP 메시지 만 만들기 때문에 중요합니다. –

+0

Chris, 귀하의 게시물은 완전한 즐거움입니다. 숨은 참조는 실제로 훌륭한 옵션이며 OP가 사용해야합니다 (수신자가 노출되기를 원하지 않을 수도 있음). –

0

크기와 숫자에 관해서는 SMTP 액세스 가능 폴더에 놓고 SMTP 서버가 해당 폴더에서 배달되도록하는 것이 좋습니다. 그러면 더 빠르고 건강해질 것입니다.

메모리에있는 500,000 개의 첨부 파일은 자원 집약적이며 300MB의 RAM 할당은 약 200MB RAM입니다 (리소스 보유, 매번 새로운 메시지 생성, 라이브러리 열기 등을위한 오버 헤드). 두 번째 질문은 서버가이 문제를 처리 할 수 ​​있는가하는 것입니다. 그냥 관찰.

+0

예, 서버가로드를 처리 할 수 ​​있습니다. 그리고 보내는 메일의 양은 700을 초과하지 않을 것이며 프로세스는 한 달에 한 번 될 것입니다 ... Exchange 서버의 SMTP 액세스 가능 폴더로 이동할 수 있습니까? 이것에 대한 정보는 어디에서 찾을 수 있습니까? –

+0

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.pickupdirectorylocation.aspx ~이 프로그램은 오래되었지만 올바른 방향으로 시작할 수 있습니다. 모든 IIS 환경에서 이것을 처리 할 수 ​​있습니까?) ~ http://support.microsoft.com/kb/247958 ~ 또한, 이것은 여러분이 여러분의 sysadmin을 가져야 할 때입니다. 이제 Exchange와 함께 작업하게되므로 구성해야합니다 (하지만 그만한 가치가 있습니다). – jcolebrand