我正在尝试使用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小时发送电子邮件。对于这两个应用程序,From和To的电子邮件地址是相同的。fromEmail和toEmail都是有效的,包括fromPass。
问题是:
到目前为止,我尝试过的解决方案:
587更改为465:这不是很好send我的AV/防火墙似乎没有阻塞任何端口。我的互联网连接相当稳定。
似乎什么都没起作用。为什么不动呢?希望这是一个愚蠢的错误,我忽略了!下面提供了sendMail代码,如果有人能说明这一点,这将是有帮助的。(Utils.doProcessLog是我的进程记录器)
更新:我意识到,如果我重新启动应用程序,电子邮件在第一次运行时发送正确,然后在随后的运行中抛出“操作超时”错误。
更新-2:我创建了一个普通的windows窗体应用程序,其中包含了调用sendEmail函数的Email按钮。每当我按下按钮时,应用程序就能正常工作(即发送电子邮件)。
更新-3一个pdf-报告是900 is,另一个是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 = "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发布于 2014-11-09 01:01:50
在努力解决这个问题一个多月后,我想我已经有了解决问题的办法。
900 pdf的pdf被正确地发送电子邮件,而发送1.72MB文件的电子邮件是抛出一个operation timed out error。在让系统运行了很多次之后,我注意到如果pdf在1MB左右,那么电子邮件的发送是正确的。所以,pdf的大小引起了一个问题。当我查看我自己的进程日志时,我意识到正在调用stmpclient.send,在大约1分钟30秒(100秒)后抛出异常。因此,基于此,我得出的结论是,附加和发送大于1MB的文件可能需要超过100秒,因此我的smtpclient.timeout从100秒增加到500秒。它已经运行了几次,它是正确的电子邮件报告,希望这已经修复了我的错误!
https://stackoverflow.com/questions/26171687
复制相似问题