簡體   English   中英

SmtpClient.send“操作超時錯誤”

[英]SmtpClient.send “operation timed out error”

我正在嘗試使用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 Hrs發送電子郵件,而App-2應該以0300 Hrs發送電子郵件。 這兩個應用程序的“ From和“ To電子郵件地址相同。 fromEmailtoEmail均有效,包括fromPass

問題:

  • App-1似乎可以正確發送電子郵件,盡管有時並非總是如此!
  • App-2似乎引發“操作超時”錯誤(即使每5分鍾多次嘗試)

我到目前為止嘗試過的解決方案:

  1. 通過互聯網拖網並嘗試了提出什么可能的解決方案
  2. 將端口從587更改為465 :這不能很好地工作
  3. 進行多次嘗試send假設這是互聯網問題

我的AV /防火牆似乎沒有阻塞任何端口。 我的互聯網連接非常穩定。

似乎沒有任何效果。 為什么不起作用? 希望這是我忽略的愚蠢錯誤! 下面提供了sendMail代碼,如果有人可以對此有所了解,將很有幫助。 Utils.doProcessLog是我的過程記錄器)

更新:我意識到,如果我重新啟動該應用程序,則在第一次運行期間會正確發送電子郵件,然后在隨后的運行中會拋出“操作超時”錯誤

更新2:我用Email按鈕創建了一個普通的Windows窗體應用程序,該應用程序調用sendEmail函數。 每當我按下按鈕時,該應用程序即可正常運行(即發送電子郵件)。

Update-3其中一個pdf報告為900KB,另一個為1.72MB。 sendMail似乎僅在sendMail的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 = "fromEmail@gmail.com"
    Const mailStrPass = "fromPass"
    Const mailStrHost = "smtp.gmail.com"
    Const mailToAdd = "toEmail@gmail.com"
    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

經過一個多月的辛苦工作,我認為我可以解決我的問題。

正確地通過電子郵件發送了900KB pdf,而通過電子郵件發送1.72MB文件則拋出了operation timed out error 在讓系統運行了多次之后,我注意到如果pdf約為1MB,則電子郵件將正確發送。 因此,pdf的大小引起了問題。 當查看自己的進程日志時,我意識到正在調用stmpclient.send ,並且在大約1分30秒(100秒)后引發了異常。 因此,基於此,我得出結論,附加和通過電子郵件發送大於1MB的文件可能需要100秒以上的時間,因此將smtpclient.timeout從100seconds增加到500seconds。 它已經運行了兩次,並且正在通過電子郵件正確發送報告,希望這可以修復我的錯誤!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM