我最近部署了一个利用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;
答案 0 :(得分:1)
最佳解决方案是解耦创建和发送电子邮件的过程。
创建每封邮件并将其放入队列中。然后,您可以让邮件发送过程监视队列并尽快发送任何消息。
答案 1 :(得分:0)
在单独的线程上发送邮件,例如使用任务。
Task.Factory.StartNew(() => smtpServer.Send(mail));
答案 2 :(得分:0)
这是一个Web应用程序,对吗?这段代码是从磁盘上的物理文件中提取的吗?:
mail.Attachments.Add (new Attachment ("screenshot.jpg"));
如果是,那就是你的问题。 Web应用程序是多线程的。因此很多用户可能同时修改该文件。在应用程序从修改该文件的步骤转到读取该文件的步骤时,另一个用户可能已对其进行了修改。
您有几个选择:
Path.GetTempFileName()
之类的内容创建临时文件,并将其从保存步骤传递到阅读/电子邮件步骤,而不是硬编码相同的文件名。byte[]
从上传步骤传递到发送步骤building the Attachment
from the byte array。