2014-10-03 2 views
2

SmtpClient.Send을 사용하여 전자 메일을 보내려고합니다 (Win7 OS, .NET 4.5 이상). 동일한 sendMail 코드가 두 개의 다른 응용 프로그램에서 재사용되고 있습니다 (App-1 및 App-2로 호출 할 수 있음). App-1은 Admin-1 프로파일로 실행되고 App-2는 Admin-2 프로파일로 실행됩니다. 두 프로파일 모두 administrator/highest 특권이 있습니다. App-1은 1900 시간에 이메일을 보내고 App-2는 0300 시간에 이메일을 보내야합니다. FromTo 이메일 주소는 두 앱에서 동일합니다. fromPass을 포함하여 fromEmailtoEmail이 모두 유효합니다.SmtpClient.send "작업 시간 초과 오류"

문제 :

  • 앱-1은 때로는 모든 시간이라도 제대로 이메일을 보내는 것 같다!
  • 앱-2는 지금까지 시도 던져 "작업 시간 초과"오류 (심지어 여러 번 시도 후 5 분마다)

용액 보인다 :

인터넷을 통해
  1. 트롤과 노력 무엇을 가능한 해결책은 587에서 포트를 변경
  2. 465에 제안되고 있었다 :이 send assum에 아주 잘
  3. 수행하는 여러 시도를 작동하지 않습니다 인터넷 문제였습니다

내 AV/방화벽이 모든 포트를 차단하지 않는 것 같습니다. 인터넷 연결이 꽤 안정적입니다.

아무 것도 효과가없는 것 같습니다. 왜 작동하지 않습니까? 잘만되면 내가 간과 한 바보 같은 실수 다! sendMail 코드가 제공됩니다.이 코드를 사용하면 도움이 될 것입니다. 나는 응용 프로그램을-시작을 다시하는 경우, 이메일은 그것이 발생 이후의 실행을 위해 다음 처음 실행시 올바르게 전송되고 있음을 깨달았다는 "작업 시간 초과"오류 :

업데이트 (Utils.doProcessLog 내 프로세스 로거)

업데이트 -2 :sendEmail 함수를 호출하는 Email 버튼이있는 일반 Windows 양식 응용 프로그램을 만들었습니다. 버튼을 누를 때마다 응용 프로그램이 올바르게 작동합니다 (즉, 이메일을 보냅니다).

업데이트 -3 pdf 보고서 중 하나는 900KB이고 다른 하나는 1.72MB입니다. sendMail은 1.72MB 인 pdf 보고서에서만 충돌하는 것으로 보입니다. 3MB 이상의 첨부 파일에 대해 알려진 버그가있는 것 같습니다. 1.72MB는 문제가되지 않지만 저에게는 적합하지 않습니다. 설치시 "이 핫픽스가 적용되지 않습니다."라는 메시지가 나타나면이 핫픽스 (http://support2.microsoft.com/kb/2183292)를 설치할 수 없습니다. 해당 Microsoft 핫픽스 링크에서 제안한 해결 방법을 시도했지만 여전히 오류가 발생합니다.

Imports System.Net.Mail 
Imports System.Net 
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
' SEND EMAIL 
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
Public Function sendMail(ByVal Subject As String) As Boolean 

    Dim fl As String 
    Dim i As Integer 
    Dim good As Boolean 
    ' for EMAILS 
    Const mailStrAddress = "[email protected]" 
    Const mailStrPass = "fromPass" 
    Const mailStrHost = "smtp.gmail.com" 
    Const mailToAdd = "[email protected]" 
    Const maxAttempt = 5 

    ' Subject & Body 
    Dim st = "This is a report generated from " & ThisWorkbook.Name 
    Dim subj = ThisWorkbook.Name & ": " & Subject 
    If IsNothing(subj) Then 
     subj = "CAUTION: EMPTY STRING" 
    End If 

    Utils.doProcessLog("about to email reports") 
    good = False 

    For i = 0 To maxAttempt 
     ' 
     Dim mail As New MailMessage 
     Dim smtp As New SmtpClient 
     ' 
     Try 
      mail.From = New MailAddress(mailStrAddress) ' Email address 
      ' The important part -- configuring the SMTP client 
      smtp.Port = 587 ' [1] You can try with 465 also, I always used 587 and got success 
      smtp.EnableSsl = True 
      smtp.DeliveryMethod = SmtpDeliveryMethod.Network ' [2] Added this 
      smtp.UseDefaultCredentials = False ' [3] Changed this 
      smtp.Credentials = New NetworkCredential(mailStrAddress, mailStrPass) ' password-here [4] Added this. Note, first parameter is NOT string. 
      smtp.Host = mailStrHost 
      smtp.Timeout = 100000 ' 100 seconds 
      ' recipient address 
      mail.To.Add(New MailAddress(mailToAdd)) 
      ' Formatted mail body 
      mail.IsBodyHtml = True 
      mail.SubjectEncoding = System.Text.Encoding.UTF8 
      mail.BodyEncoding = System.Text.Encoding.UTF8 

      mail.Subject = subj 
      mail.Body = st 
      ' Send 
      smtp.Send(mail) 
      ' 
      Utils.doProcessLog("report emailed") 
      good = True 

     Catch ex As Exception 
      Utils.doProcessLog("unable to email report : " & ex.Message) 
      Utils.doProcessLog("waiting for 5 minutes before re-trying :" & CStr(i)) 
      good = False 
      Utils.doWait(5 * 60 * 1000) ' = 5(min)*60(secs)*1000(ms) 

     Finally 
      ' 
      mail.Dispose() 
      smtp.Dispose() 
      ' 
     End Try 
     ' exit if successful 
     If good Then 
      Exit For 
     End If 
    Next i 

End Function 
+0

나는 또한 같은 문제가 발생했습니다. 나는 문제가 smtp 서버에 있다고 생각한다. 그것을 일으키는 코드는있을 것 같지 않습니다. – Hatjhie

+0

@Hatjhie, "smtp 서버에 문제가 있습니까?"라는 의미는 무엇입니까? smtp.gmail.com에 문제가 있다는 뜻입니까? – user2979010

+0

@Hatjhie, 당신도 똑같은 문제에 직면 해 있다고 말씀하셨습니다. 이 문제를 극복하기 위해 완전히 다른 것을 사용하고 있습니까? – user2979010

답변

0

이 문제로 한달 동안 고생 한 후, 나는 내 문제에 대한 해결책을 가지고 있다고 생각합니다.

1.72MB 파일을 전자 메일로 보내고 operation timed out error을 보내는 동안 900KB pdf는 올바르게 전자 메일로 전송되었습니다.시스템을 여러 번 실행시킨 후, pdf가 1MB 정도라면 이메일이 제대로 전송되고 있다는 것을 알았습니다. 그래서 pdf의 크기가 문제를 일으키고있었습니다. 내 자신의 프로세스 로그를 살펴보면 stmpclient.send이 호출되고 예외가 약 1 분 30 초 (100 초) 후에 throw되는 것을 알게되었습니다. 그래서 이것을 바탕으로 1MB보다 큰 파일을 첨부하고 이메일로 보내려면 100 초 이상 걸릴 수 있으므로 내 smtpclient.timeout을 100 초에서 500 초로 늘려야한다고 결론을 냈습니다. 그것은 몇 번 실행하고 리포트를 올바르게 이메일을 보내고 있습니다, 바라기를 이것은 내 버그를 수정했습니다!