2014-10-03 284 views
2

我想用SmtpClient.Send发送电子邮件(在Win7操作系统,.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都是有效的,包括fromPassSmtpClient.send“操作超时错误”

问题:

  • 的App-1似乎是正确发送电子邮件尽管有时不是所有的时间!
  • 的App-2似乎扔(每5分钟后也多次尝试)“操作超时”错误

的解决方案,我已经试过至今:

  1. 拖网通过互联网,并试图什么可能的解决方案,正在提议
  2. 改变从587端口465:这不很好
  3. 进行多次尝试努力send assum它是一个互联网问题

我的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),因为安装中显示“此修补程序不适用于您”。我已经尝试了微软修补程序链接中提出的解决方法,但仍然出现错误。

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 2014-10-03 05:35:26

+0

@Hatjhie,“smtp服务器存在问题在于什么”?你的意思是smtp.gmail.com在结束时有问题吗? – user2979010 2014-10-04 01:17:38

+0

@Hatjhie,你提到你面临同样的问题。你是否在使用完全不同的方法来解决这个问题? – user2979010 2014-10-05 00:00:44

回答

0

经过一个多月的辛苦工作之后,我想我已经解决了我的问题。

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