Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net System.Net.Mail的性能问题_Vb.net_Performance_System.net.mail - Fatal编程技术网

Vb.net System.Net.Mail的性能问题

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

我从我的应用程序发送邮件时遇到了一个不寻常的问题。起初它不起作用(无法传递错误垃圾),无论如何,我添加了正确的身份验证,它起作用了。我现在的问题是,如果我尝试发送大约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

您遇到的限制通常由SMTP服务器强制执行,而不是由您的代码强制执行。 SMTP服务器很容易被垃圾邮件滥用,因此有防止此类滥用的机制

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


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

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


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

是的,服务器可以处理负载。并且要发送的邮件量将不超过700,并且处理过程将是每月一次…我可以将邮件放入exchange server SMTP可访问文件夹吗?我在哪里可以找到这方面的信息~虽然这是一个较老的版本,但它为您提供了一个正确方向的开始(您希望能够在任何IIS环境中处理这一问题,是吗?~~而且,这也是您必须让系统管理员参与的时候。您现在将使用Exchange,因此也必须对其进行配置(但这是值得的)。我也在想同样的事情(垃圾邮件滥用)。如果您完全是本地的,您应该能够在某个地方控制Exchange服务器上的节流率。另外,如果你一个月只发送一次,那么在每次发送之间加一个延迟,可能是5秒或10秒左右。第三种选择,大多数人都不喜欢,你可以不发送给任何人(或你自己),然后将密件抄送给同一领域的人。相同的域部分很重要,因为它只创建一条SMTP消息。克里斯,你的帖子真是太好了。密件抄送实际上是一个很好的选择,也许OP应该使用它(也许收件人不想被曝光)。你曾经成功地解决过这个问题吗?你还需要帮助吗?