我遇到了一个问题,我之前没遇到过,在搜索时似乎找不到任何类似的问题。
我的问题是这个。
我有一个使用内存流附加PDF的电子邮件方法,然后使用SendAsync方法发送电子邮件。但很少,附件会附加到不同的用户电子邮件中。
这种情况只发生在非常罕见的情况下,并且似乎是在两个电子邮件在同一时刻发送的时候发生的,即便如此,它也很少发生。
问题在于,无论多么罕见,都不应该发生,所以我想解决它。
通过将返回PDF的URL的结果下载到WebClient对象中,然后使用将WebClient.DownloadData方法的结果读入内存流来生成PDF。 然后将内存流附加到MailMessage对象,并使用SMTPClient对象的SendAsync方法发送。
正如我所说,这个问题很少发生,遗憾的是很难测试。
这是我的代码示例(没有实际值,只是一个如何创建的示例,以减少的方式,即没有错误捕获等):
var mailMessage = new MailMessage("fromaddress@test.com", "toaddress@test.com", "Subject");
var smtpClient = new SmtpClient();
mailMessage.Body = "Test";
var stream = new MemoryStream(new WebClient().DownloadData("test.com"));
var attachment = new Attachment(stream, "filename.pdf", System.Net.Mime.MediaTypeNames.Application.Pdf);
mailMessage.Attachments.Add(attachment);
smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompleteCallback); // this is a method for logging errors etc
smtpClient.SendAsync(mailMessage, "randomGuidToken");
当问题确实发生时,只有收到这两个附件的用户才会收到电子邮件。其他用户什么都没有,没有电子邮件或附件。
感谢所有帮助。
答案 0 :(得分:1)
我设法解决了我的问题。
这取决于如何实例化和处理SmtpClient和MailMessage类(在这种情况下,不是这样)。
我发现原始代码创建了SmtpClient和MailMessage对象作为类范围变量,它在类构造函数中初始化,并且处理对象处理的唯一代码是SendAsynCompleted回调方法。 / p>
我现在已经更改了代码,以便在类中需要它们的每个方法中实例化SmtpClient和MailMessage对象,并确保明确地处理对象。
我现在也已经不再使用SendAsync方法而只使用标准的Send方法(我可能会考虑回到异步方法,但我认为需要做更多的测试和重构)。 / p>