.Net 邮件附件附加到错误的电子邮件

.Net mail attachment attaching to wrong email

我有一个以前 运行 没有遇到过的问题,并且在搜索时似乎找不到任何类似的问题。

我的问题是这样的。

我有一个使用内存流附加 PDF 的电子邮件方法,然后使用 SendAsync 方法发送电子邮件。不过很少见,附件会附加到其他用户的电子邮件中。

这种情况只在极少数情况下发生过,似乎是在同一时刻发送两封电子邮件时造成的,即便如此,这种情况也很少发生。

问题是,无论多么罕见,它都不应该发生,所以我想修复它。

PDF 是通过将 URL 的结果下载 returns PDF 到 WebClient 对象中,然后使用 WebClient.DownloadData 方法的结果读取到内存中生成的溪流。 然后将内存流附加到 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");

当问题确实发生时,只有同时收到这两个附件的用户才会真正收到电子邮件。其他用户什么也得不到,没有电子邮件或附件。

感谢所有帮助。

我已经解决了我的问题。

这取决于 SmtpClient 和 MailMessage classes 是如何被实例化和处理的(或者不是,在这种情况下)。

我发现原始代码是将 SmtpClient 和 MailMessage 对象创建为 class 宽变量,它在 class 构造函数中初始化,并且是唯一处理处理的代码对象位于 SendAsynCompleted 回调方法中。

我现在更改了代码,以便在 class 中需要它们的每个方法中实例化 SmtpClient 和 MailMessage 对象,并确保显式处理这些对象。

我现在也不再使用 SendAsync 方法,而只使用标准的 Send 方法(我可能会考虑回到异步方法,但我认为需要做更多的测试和重构) .