代码之家  ›  专栏  ›  技术社区  ›  Saif Khan

系统性能问题。网邮政

  •  0
  • Saif Khan  · 技术社区  · 14 年前

    我在从应用程序发送邮件时遇到了一个不同寻常的问题。起初它不起作用(无法转发错误垃圾),总之我添加了正确的身份验证,它起作用了。我现在的问题是,如果我尝试发送大约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
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   M.A. Hanin    14 年前

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

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

    但从技术上讲,是的,你可以编写一个代码,分别发送它们。

        2
  •  0
  •   jcolebrand    14 年前

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

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