0

从我的应用程序发送邮件时,我遇到了这个不寻常的问题。起初它不起作用(无法传递错误废话),但我添加了正确的身份验证并且它起作用了。我现在的问题是,如果我尝试发送大约 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 连接并迭代集合,像这样调用发送

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
4

2 回答 2

1

您遇到的限制是由 SMTP 服务器而不是您的代码强制实施的。SMTP 服务器非常容易滥用垃圾邮件,因此具有防止此类滥用的机制。

单独发送每封电子邮件并不总是有效,您正在与其他更复杂的机制竞争。

但从技术上讲,是的,您可以编写一个单独发送它们的代码。

于 2010-04-12T18:03:19.050 回答
0

对于您所说的大小和数量,我的建议是将它们放在 SMTP 可访问的文件夹中,并让 SMTP 服务器从该文件夹传送。那会更快,更理智。

内存中的 500K 附件是资源密集型的,一次性为 300 个分配 RAM 大约是 200MB RAM(用于保持资源、每次创建新消息、打开库等的开销)。所以第二个问题是你的服务器能处理这个吗?只是一个观察。

于 2010-04-12T18:08:21.143 回答