收件人电子邮件地址重叠

时间:2014-06-23 16:51:03

标签: c# email

我最近部署了一个利用System.Net.Mail功能的C#脚本。一旦用户填写表格,邮件系统就可以通过发送photobooth屏幕截图作为每个相应电子邮件地址的附件来工作(因此每个用户都应该收到一个独特的图像附件)。

脚本运行完美但我遇到了一个问题:一旦互联网连接变慢或遭受一些随机停机时间,电子邮件地址将重叠,当前访客将收到以前用户的附件。

我想知道是否有任何方法可以创建/撰写新邮件而不会中断当前的发送过程。我正在使用Gmail btw。

以下是我正在使用的代码:

MailMessage mail = new MailMessage();

mail.Attachments.Clear();

mail.From = new MailAddress("@gmail.com");
mail.To.Add(email);
mail.Subject = "";
mail.Body = "";

mail.Attachments.Add(new Attachment("screenshot.jpg"));
//mail.Attachments.Add (new Attachment("screenshot.jpg"));

SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
smtpServer.Port = 587;
smtpServer.Credentials = new System.Net.NetworkCredential("@gmail.com", "") as ICredentialsByHost;
smtpServer.EnableSsl = true;
ServicePointManager.ServerCertificateValidationCallback = 
    delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
};
smtpServer.Send(mail);
//Debug.Log("success");
sent = true;

3 个答案:

答案 0 :(得分:1)

最佳解决方案是解耦创建和发送电子邮件的过程。

创建每封邮件并将其放入队列中。然后,您可以让邮件发送过程监视队列并尽快发送任何消息。

答案 1 :(得分:0)

在单独的线程上发送邮件,例如使用任务。

    Task.Factory.StartNew(() => smtpServer.Send(mail));

答案 2 :(得分:0)

这是一个Web应用程序,对吗?这段代码是从磁盘上的物理文件中提取的吗?:

mail.Attachments.Add (new Attachment ("screenshot.jpg"));

如果是,那就是你的问题。 Web应用程序是多线程的。因此很多用户可能同时修改该文件。在应用程序从修改该文件的步骤转到读取该文件的步骤时,另一个用户可能已对其进行了修改。

您有几个选择:

  1. 每次用户完成此过程时,都会创建一个唯一的文件名。之后你需要保存文件吗?我猜不是,因为你覆盖它们。因此,请使用Path.GetTempFileName()之类的内容创建临时文件,并将其从保存步骤传递到阅读/电子邮件步骤,而不是硬编码相同的文件名。
  2. 永远不要将文件保存到磁盘,而只是将文件数据的byte[]从上传步骤传递到发送步骤building the Attachment from the byte array