SmtpClient.send“操作超时错误”

时间:2014-10-03 00:34:37

标签: .net vb.net visual-studio-2012 smtpclient

我正在尝试使用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电子邮件地址都相同。 fromEmailtoEmail都有效,包括fromPass

问题:

  • App-1似乎正在正确发送电子邮件,尽管有时并非所有时间!
  • App-2似乎抛出"操作超时"错误(即使每隔5分钟多次尝试)

我迄今为止尝试过的解决方案:

  1. 通过互联网进行拖网并尝试提出可行的解决方案
  2. 将端口从587更改为465:这不能很好地使用
  3. send进行多次尝试,假设这是一个互联网问题
  4. 我的AV /防火墙似乎没有阻止任何端口。我的网络连接非常稳定。

    似乎没有任何效果。为什么它不起作用?希望这是一个我忽略的愚蠢错误!下面提供了sendMail代码,如果有人可以对此有所了解,那将会有所帮助。 (Utils.doProcessLog是我的流程记录器)

    更新我意识到,如果我重新启动应用程序,电子邮件会在第一次运行期间正确发送,然后在后续运行时抛出"操作超时"错误

    更新-2:我创建了一个普通的Windows窗体应用程序,其中Email按钮调用sendEmail函数。每当我按下按钮时,应用程序都能正常工作(即发送电子邮件)。

    Update-3 其中一个pdf报告是900KB,另一个是1.72MB。 sendMail似乎仅在1.72MB的pdf报告上崩溃。对于3MB以上的附件似乎存在已知错误,因此1.72MB应该不是问题,但它对我不起作用。我无法安装此修补程序(http://support2.microsoft.com/kb/2183292),因为安装说"此修补程序不适用于您"。我已尝试在Microsoft-hotfix链接中建议的解决方法,我仍然得到错误。

    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
    

1 个答案:

答案 0 :(得分:0)

用这个问题劳作了一个多月之后,我想我的问题已解决了。

900KB pdf正在通过电子邮件发送,而通过电子邮件发送1.72MB文件却抛出operation timed out error。让系统运行多次之后,我注意到如果pdf大约为1MB,则正确发送电子邮件。因此,pdf的大小导致了问题。当我查看自己的进程日志时,我意识到正在调用stmpclient.send并且在大约1分钟30秒(100秒)之后抛出异常。基于此,我得出结论,附加和通过电子邮件发送大于1MB的文件可能需要超过100秒,因此将smtpclient.timeout从100秒增加到500秒。它运行了几次,它正确地通过电子邮件发送报告,希望这已经解决了我的错误!