【问题标题】:.Net mail attachment attaching to wrong email.Net 邮件附件附加到错误的电子邮件
【发布时间】:2015-11-24 09:23:56
【问题描述】:

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

我的问题是这个。

我有一个电子邮件方法,它使用内存流附加 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");

当问题确实发生时,只有收到这两个附件的用户才会真正收到一封电子邮件。其他用户一无所获,没有电子邮件或附件。

感谢所有帮助。

【问题讨论】:

  • 客户端代码没有问题——据我所知。然而,调查服务器代码可能是值得的。 (test.com 如何处理请求?);还有 url (test.com) 是如何生成的?
  • 您好 Ondrej,感谢您的回复。我以 test.com 为例。实际的 URL 指向我们网站上的一个页面,该页面使用 Rotativa(将 MVC 操作转换为 PDF 的 C# MVC 组件)生成 PDF。 PDF 生成正常,因为附件是正确的,只是附加到错误的电子邮件中。生成的每个 PDF 都有一些唯一的值,这就是我知道它们是正确生成的。希望这可以帮助。我想知道 SendAsync 方法是否存在内存管理问题,但我之前没有遇到过
  • 如果附件本身是正确的,“其他”邮件附加了什么?两封邮件是否有相同的附件(A 或 B)或者它们是否互换(A 有 B 的附件,反之亦然)?
  • 这段代码是否被两个不同的进程共享/调用?可能是您需要在代码的某些部分周围加一些锁,以防止进程相互覆盖。
  • 这些真的都是生产代码中的局部变量吗?从行为来看,mailMessage 变量在程序下载stream 时被覆盖,因此两个线程仅将附件添加到第二个创建的邮件,然后发送。

标签: c# asp.net-mvc email attachment


【解决方案1】:

我已经设法解决了我的问题。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多