我有一个不同寻常的问题,通过我的应用程序发送邮件。一开始它不工作(无法传递错误),不管怎样,我添加了正确的身份验证,它工作了。我现在的问题是,如果我尝试发送大约300封电子邮件(每封邮件都有500k的附件),应用程序会在整个过程中挂起大约95%的邮件。
下面是我要发送的每封邮件所调用的一些代码
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发布于 2010-04-13 02:03:19
您遇到的限制很可能是由SMTP服务器强制执行的,而不是您的代码。SMTP服务器很容易受到垃圾邮件的滥用,因此具有防止此类滥用的机制。
单独发送每封电子邮件并不总是有效的,你正在与其他更复杂的机制竞争。
但从技术上讲,是的,你可以写一段代码来单独发送它们。
发布于 2010-04-13 02:08:21
对于您所讨论的大小和数量,我的建议是将它们放在SMTP可访问的文件夹中,并让SMTP服务器从该文件夹中交付。这会更快更理智。
内存中的500K附件是资源密集型的,一次为300个附件分配RAM大约是200MB RAM (占用资源、每次创建一条新消息、打开库等开销)。所以第二个问题是你的服务器能处理这个问题吗?这只是个观察。
https://stackoverflow.com/questions/2624199
复制相似问题