Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收件人电子邮件地址重叠_C#_Email - Fatal编程技术网

C# 收件人电子邮件地址重叠

C# 收件人电子邮件地址重叠,c#,email,C#,Email,我最近部署了一个利用System.Net.Mail功能的C#脚本。一旦用户填写表单,邮件系统将通过向每个电子邮件地址发送photobooth截图作为附件来工作(因此每个用户都应该收到一个唯一的图像附件) 该脚本工作完美无瑕,但我有一个问题:一旦互联网连接变慢或出现一些随机停机时间,电子邮件地址将重叠,当前的客人将收到以前用户的附件 我想知道是否有任何方法可以在不中断当前发送过程的情况下创建/撰写新邮件。顺便说一句,我正在使用Gmail 下面是我正在使用的代码: MailMessage mail

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

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

我想知道是否有任何方法可以在不中断当前发送过程的情况下创建/撰写新邮件。顺便说一句,我正在使用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;

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


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

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

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

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

mail.Attachments.Add (new Attachment ("screenshot.jpg"));
如果是这样,那就是你的问题了。Web应用程序是多线程的。因此,许多用户可能同时修改该文件。当应用程序从修改该文件的步骤转到读取该文件的步骤时,其他用户可能已经修改了该文件

您有两个选择:

  • 为用户每次执行此过程时创建一个唯一的文件名。你以后需要保存这些文件吗?我猜不会,因为你覆盖了它们。因此,使用类似于创建一个临时文件并将其从保存步骤传递到阅读/发送电子邮件步骤,而不是硬编码相同的文件名
  • 不要将文件保存到磁盘,而是将文件数据的
    字节[]
    从上载步骤传递到发送步骤

  • 您好@David,这是一个基于本地的应用程序,可以将屏幕截图保存到磁盘上,然后脚本将提取数据路径并将图像附加到电子邮件中。我会看看是否能将你的建议落实到我的工作流程中。非常感谢是的!