Vb.net System.Net.Mail的性能问题
我从我的应用程序发送邮件时遇到了一个不寻常的问题。起初它不起作用(无法传递错误垃圾),无论如何,我添加了正确的身份验证,它起作用了。我现在的问题是,如果我尝试发送大约300封电子邮件(每封都有500k的附件),应用程序在整个过程中大约95%的时间都会挂起 下面是我的一些代码,用于发送每封邮件Vb.net System.Net.Mail的性能问题,vb.net,performance,system.net.mail,Vb.net,Performance,System.net.mail,我从我的应用程序发送邮件时遇到了一个不寻常的问题。起初它不起作用(无法传递错误垃圾),无论如何,我添加了正确的身份验证,它起作用了。我现在的问题是,如果我尝试发送大约300封电子邮件(每封都有500k的附件),应用程序在整个过程中大约95%的时间都会挂起 下面是我的一些代码,用于发送每封邮件 Using mail As New MailMessage() With mail .From = New MailAddress(My.Resou
Using mail As New MailMessage()
With mail
.From = New MailAddress(My.Resources.EmailFrom)
For Each contact As Contact In Contacts
.To.Add(contact.Email)
Next
.Subject = "Accounting"
.Body = My.Resources.EmailBody
'Back the stream up to the beginning orelse the attachment
'will be sent as a zero (0) byte file.
attachment.Seek(0, SeekOrigin.Begin)
.Attachments.Add(New Attachment(attachment, String.Concat(Item.Year, Item.AttachmentType.Extension)))
End With
Dim smtp As New SmtpClient("192.168.1.2")
With smtp
.DeliveryMethod = SmtpDeliveryMethod.Network
.UseDefaultCredentials = False
.Credentials = New NetworkCredential("username", "password")
.Send(mail)
End With
End Using
With item
.SentStatus = True
.DateSent = DateTime.Now.Date
.Save()
End With
Return
我在想,我能不能准备好所有的邮件并将它们添加到一个集合中,然后打开一个SMTP会话并迭代集合,像这样调用send
Using mail As New MailMessage()
...
MailCollection.Add(mail)
End Using
...
Dim smtp As New SmtpClient("192.168.1.2")
With smtp
.DeliveryMethod = SmtpDeliveryMethod.Network
.UseDefaultCredentials = False
.Credentials = New NetworkCredential("username", "password")
For Each mail in MainCollection
.Send(mail)
Next
End With
您遇到的限制通常由SMTP服务器强制执行,而不是由您的代码强制执行。 SMTP服务器很容易被垃圾邮件滥用,因此有防止此类滥用的机制 单独发送每封电子邮件并不总是有效的,你在与其他更复杂的机制竞争
但是从技术上讲,是的,您可以编写一个单独发送它们的代码。对于您所说的大小和数量,我的建议是将它们放在一个SMTP可访问的文件夹中,让SMTP服务器从该文件夹发送。那会更快更理智
内存中的500K附件是一种资源密集型附件,每次为300个附件分配的RAM大约为200MB RAM(用于保存资源、每次创建新消息、打开库等的开销)。所以第二个问题是,您的服务器能处理这个问题吗?只是观察。是的,服务器可以处理负载。并且要发送的邮件量将不超过700,并且处理过程将是每月一次…我可以将邮件放入exchange server SMTP可访问文件夹吗?我在哪里可以找到这方面的信息~虽然这是一个较老的版本,但它为您提供了一个正确方向的开始(您希望能够在任何IIS环境中处理这一问题,是吗?~~而且,这也是您必须让系统管理员参与的时候。您现在将使用Exchange,因此也必须对其进行配置(但这是值得的)。我也在想同样的事情(垃圾邮件滥用)。如果您完全是本地的,您应该能够在某个地方控制Exchange服务器上的节流率。另外,如果你一个月只发送一次,那么在每次发送之间加一个延迟,可能是5秒或10秒左右。第三种选择,大多数人都不喜欢,你可以不发送给任何人(或你自己),然后将密件抄送给同一领域的人。相同的域部分很重要,因为它只创建一条SMTP消息。克里斯,你的帖子真是太好了。密件抄送实际上是一个很好的选择,也许OP应该使用它(也许收件人不想被曝光)。你曾经成功地解决过这个问题吗?你还需要帮助吗?