簡體   English   中英

收件人電子郵件地址重疊

[英]Recipient email address overlapping

我最近部署了一個利用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應用程序是多線程的。 因此,許多用戶可能會同時修改該文件。 在應用程序從修改該文件的步驟轉到讀取該文件的步驟的過程中,其他用戶可能已對其進行了修改。

您有兩種選擇:

  1. 每次用戶執行此過程時,請創建一個唯一的文件名。 之后需要保留文件嗎? 我猜不是,因為您覆蓋了它們。 因此,請使用Path.GetTempFileName()類的東西來創建一個臨時文件,然后將其從保存步驟傳遞到讀取/發出消息的步驟,而不是硬編碼相同的文件名。
  2. 永遠不要將文件保存到磁盤,而只是將文件數據的byte[]從上傳步驟傳遞到發送步驟, 從而從byte數組構建Attachment

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM