2014-06-23 9 views
0

Недавно я развернул скрипт C#, который использует функциональность System.Net.Mail. Система почтовой рассылки будет работать, отправив скриншот фотоботы в качестве вложения для каждого соответствующего адреса электронной почты после заполнения пользователем формы (следовательно, каждый пользователь должен получать уникальные вложения изображений).Адреса электронной почты получателя перекрываются

Сценарий работает безупречно, но я страдаю от одной проблемы: после того, как подключение к Интернету стало медленным или пострадали от случайного простоя, адреса электронной почты будут перекрываться, и текущие гости получат вложения от предыдущих пользователей.

Мне интересно, есть ли какой-либо метод, который может создавать/составлять новое письмо без прерывания текущих процессов отправки. Я использую 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; 

ответ

1

Лучшее решение было бы разъединить процессы создания и отправки сообщений электронной почты.

Создайте каждое почтовое сообщение и оставьте его в очереди. Затем вы можете отправить процесс отправки почты в очередь и доставить туда любые сообщения там, где это возможно.

0

Отправляйте письма по отдельному потоку, например, используя задачи.

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

Это веб-приложение, исправное? И эта строка кода вытягивается из физического файла на диске ?:

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

Если это так, то есть ваша проблема. Веб-приложения многопоточные. Таким образом, многие пользователи могут одновременно изменять этот файл. В то время, когда приложение переходит с этапа изменения этого файла на шаг чтения этого файла, другой пользователь может его изменить.

У вас есть несколько вариантов:

  1. Создайте уникальное имя файла для каждого времени пользователь проходит через этот процесс. Нужно ли хранить файлы после этого? Я предполагаю, что нет, поскольку вы перезаписываете их. Поэтому используйте что-то вроде Path.GetTempFileName(), чтобы создать временный файл и передать его с шага сохранения на шаг чтения/отправки по электронной почте вместо жесткого кодирования с тем же именем файла.
  2. Никогда не сохраняйте файл на диске и вместо этого просто передавайте byte[] данных файла с этапа загрузки на шаг отправки, building the Attachment from the byte array.
+0

Привет @David, Это локальная приложение, которое сохранить скриншоты на диске, и сценарий будет тянуть путь данных и прикрепите изображения на электронную почту. Я посмотрю, смогу ли я реализовать свои предложения в своем рабочем процессе. Спасибо, много! – Nick

Смежные вопросы