收件人邮箱地址重叠

本文关键字:重叠 地址 收件人 | 更新日期: 2023-09-27 18:09:53

我最近部署了一个利用System.Net.Mail功能的c#脚本。邮件系统将通过发送一个照相亭截图作为附件到每个各自的电子邮件地址,一旦用户填写了表单(因此每个用户应该收到一个唯一的图像附件)。

脚本工作完美无瑕,但我有一个问题:一旦互联网连接变得缓慢或遭受一些随机停机时间,电子邮件地址将重叠,当前客人将收到以前用户的附件。

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

下面是我使用的代码:
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;

收件人邮箱地址重叠

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

创建每个邮件消息并将其放入队列中。然后,您可以让邮件发送进程监视队列,并尽可能快地在那里传递任何消息。

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

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

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

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

如果是这样,那就是你的问题了。Web应用程序是多线程的。所以很多用户可以同时修改这个文件。在应用程序从修改该文件到读取该文件所花费的时间内,其他用户可能已经修改了该文件。

你有几个选择:

  1. 为用户每次执行此过程创建一个唯一的文件名。之后你需要保存这些文件吗?我想没有,因为你覆盖了它们。因此,使用Path.GetTempFileName()之类的东西来创建一个临时文件,并将其从保存步骤传递到阅读/电子邮件步骤,而不是硬编码相同的文件名。
  2. 不将文件保存到磁盘,而只是将文件数据的byte[]从上传步骤传递到发送步骤,从字节数组构建Attachment