2014-06-23 59 views
0

我最近部署了一个利用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; 

回答

1

最好的办法是去耦创建和发送电子邮件的过程。

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

0

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

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

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

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

如果是这样,那么这就是您的问题。 Web应用程序是多线程的。所以很多用户可能会同时修改该文件。在应用程序从修改该文件的步骤到读取该文件的步骤所需的时间内,其他用户可能已经对其进行了修改。

你有两个选择:

  1. 每个用户都会经历这个过程的时间创建一个唯一的文件名。之后你需要保留这些文件吗?我猜不是,因为你会覆盖他们。因此,使用类似Path.GetTempFileName()的东西来创建临时文件,并将其从保存步骤传递到读取/电子邮件步骤,而不是对相同的文件名进行硬编码。
  2. 切勿将文件保存到磁盘,而只是将文件数据的byte[]从上传步骤传递到发送步骤building the Attachment from the byte array
+0

@大卫你好, 它是一个基于本地应用程序的截图保存到磁盘,然后该脚本将拉动数据路径和图像附加到电子邮件。我会看看我是否可以将您的建议实施到我的工作流程中。非常感谢! – Nick

相关问题