2013-04-11 52 views
4

我遇到了一个奇怪的行为,试图使用Threading.ThreadPool发送电子邮件。使用System.Threading.ThreadPool时没有内容的电子邮件

这已经工作了一年多了,但最近它已经声明要间歇地发送没有内容的电子邮件。收件人和主题都很好,但是,其余的电子邮件是空白的。没有什么改变了代码的明智之处(除了它运行的服务器的Windows更新)。

下面是我使用的代码 - 有没有人有我如何可以缩小问题发生的位置的建议?在将电子邮件重新发送给声称收到空白电子邮件的人时,他们可以很好地使用它 - 它使用与发送的第一个完全相同的代码。

子生成电子邮件:

Public Sub EmailConfirmation(email As String, 
           firstname As String, 
           details As String) 

     Try 


      Dim embody As String = GlobalHelper.emailBody 
      'static class which loads the email text at application load for use later. 
      'This is a point of concern because it's obviously where the embody text is 
      'is loaded, but the issue is intermittent and if there was a failure here surely 
      'it would be caught by the 'try...catch' and a log of the error created (which has 
      'never happened). I also ran an experiment for a while where if this string was 
      'empty then create a log entry. After receiving a complaint of a blank email 
      'no error log was found. 

      embody = Replace(embody, "[FirstName]", firstname) 
      embody = Replace(embody, "[DATA]", details) 


      'create the mail message 
      Dim mail As New MailMessage() 

      'set the addresses 
      mail.From = New MailAddress("[email protected]", "My Display Name") 
      mail.To.Add(email) 
      mail.IsBodyHtml = True 

      'set the content 
      mail.Subject = "Email Subject!" 
      mail.Body = embody 


      AddEmailToThreadPool(mail) 

     Catch ex As Exception 

     'if there is an error it is logged here. 

     End Try 


    End Sub 

分,增加了线程池:

Private Sub AddEmailToThreadPool(email As MailMessage) 
     System.Threading.ThreadPool.QueueUserWorkItem(New System.Threading.WaitCallback(AddressOf sendEmail), email) 
    End Sub 

子发送电子邮件:

Private Sub sendEmail(stateinfo As Object) 

     Dim email As MailMessage = CType(stateinfo, MailMessage) 


     Try 

      'send the message 
      Dim smtp As New SmtpClient("mail.mydomain.com") 
      smtp.Send(email) 
     Catch ex As Exception 
      'error is logged here. 
     End Try 

    End Sub 
+1

通过验证程序运行'GlobalHelper.emailBody'返回的HTML。格式错误的HTML可能不会在浏览器中显示任何内容。 – 2013-04-11 01:55:37

+0

你的邮件客户端已更改?身体不能被正确渲染?你有没有记录mail.Body属性,以确保它得到适当的设置? – Jason 2013-04-11 01:55:58

+1

当你说你可以没有问题地重新发送信息给收到空白邮件的人时,你到底是如何去做的(也就是说,你记录最初使用的确切信息还是手动生成一条新信息)?你是否验证'firstname'和'details'(即没有未转义的html字符)? 'GlobalHelper.emailBody'在代码(即属性vs字段)和典型值方面看起来像什么?你有没有收到一封空白邮件的人转发给你,以便你可以检查它? – jerry 2013-04-11 02:08:37

回答

0

那么,修复不正确的doc类型声明后,我几乎没有在一个月内对空白电子邮件进行过一次投诉。虽然我不确定为什么,但我会假设这可以解决所有问题。

感谢您的所有输入/帮助。

+1

很高兴你似乎解决了你的问题。奇怪的是,用户能够看到它一次,但不是另一次,但是,如果它是由无效的HTML引起的。您是否碰巧知道该用户是否使用不同的电子邮件客户端,浏览器或计算机来查看这两条消息? – jerry 2013-05-09 16:37:05

+0

可能,我想可能是这种情况,他们没有在那里显示邮件客户端,但会显示在他们的手机上。但通过第三方处理这些问题使得提问/获得答案变得困难。我会得到的唯一回应是“现在正在工作”。公平地说,我并不完全相信这个问题已经解决,我认为格式不正确的文档类型会导致这种行为,会等着瞧。 – GJKH 2013-05-09 16:44:26

1

我从MSDN复制MailMessage class

此类型的任何公共静态(Visual Basic中的Shared)成员都是线程安全的。任何实例成员不保证是线程安全的。

+0

我认为你在做某件事; @GJKH,可以通过多线程同时调用'GlobalHelper.emailBody'吗? – 2013-04-11 16:40:52

+0

只需设置一个测试控制台应用程序,它以循环方式将一百万个这样的项目添加到线程池中,并在该循环内添加了另外10个项目到池中。我的笔记本电脑变热了,但从未抛弃过一次。我查看了电子邮件正文是否为空,从未接收过一次。 – GJKH 2013-04-11 17:13:22

+0

如果你暗示'MailMessage'对象不能传递给'QueueUserWorkItem',那是不正确的。事件成员不是线程安全的(.NET Framework类库中的常见警告)意味着您不应该同时从多个线程访问同一个MailMessage对象。代码似乎无法做到这一点,因为每个'EmailConfirmation'调用实例化一个新的MailMessage对象,将它传递给AddEmailToThreadPool,然后再次不访问它(可能的错误记录放在一边)。 – jerry 2013-04-11 20:09:37