我正在尝试使用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小时发送电子邮件。这两个应用的From
和To
电子邮件地址都相同。 fromEmail
和toEmail
都有效,包括fromPass
。
问题:
我迄今为止尝试过的解决方案:
587
更改为465
:这不能很好地使用send
进行多次尝试,假设这是一个互联网问题我的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
答案 0 :(得分:0)
用这个问题劳作了一个多月之后,我想我的问题已解决了。
900KB pdf正在通过电子邮件发送,而通过电子邮件发送1.72MB文件却抛出operation timed out error
。让系统运行多次之后,我注意到如果pdf大约为1MB,则正确发送电子邮件。因此,pdf的大小导致了问题。当我查看自己的进程日志时,我意识到正在调用stmpclient.send
并且在大约1分钟30秒(100秒)之后抛出异常。基于此,我得出结论,附加和通过电子邮件发送大于1MB的文件可能需要超过100秒,因此将smtpclient.timeout
从100秒增加到500秒。它运行了几次,它正确地通过电子邮件发送报告,希望这已经解决了我的错误!