/// <summary> /// /// </summary> private void SendEmails(EmailMessage[] messagesArray) { countMessagesInAllMail = messagesArray.Sum(ma => ma.Receivers.Length); Logger.InfoFormat("начинаем отправку {0} сообщений", messagesArray.Length); using (var client = new SmtpClient()) { foreach (var message in messagesArray) { countMessagesInCurrentMail = message.Receivers.Length; currentNomberMessagesInCurrentMail = 0; if (isStopping) { break; } if (breakCurrentDelivered) { break; } Logger.InfoFormat("Начинаем рассылку сообщения '{0}' {1} получателям", message.Title, message.Receivers.Length); if ((int)MinUrgency > (int)message.Urgency) { continue; // Если уровень важности сообщения менее важный чем указанный минимальный, то не отсылаем это сообщение } foreach (var recv in message.Receivers) { using (var msg = new MailMessage { IsBodyHtml = message.HTMLFormat }) { if (isStopping) { break; } currentNomberMessagesInCurrentMail++; bool timeOutFlaf; // Если этот адрес в fail-списке, то не отправляем по нему сообщение if (failReceiversList.Contains(recv, 1000, out timeOutFlaf) && !sendToAddressInFailList) { continue; } currentReceiver = recv; msg.Subject = message.Title; msg.Body = message.Body; msg.To.Clear(); MailAddress mailAddress; try { mailAddress = new MailAddress(recv); } catch (Exception ex) { Logger.Error("new MailAddress(recv)", ex); continue; } msg.To.Add(mailAddress); var timeStartSend = DateTime.Now; try { client.Send(msg); // Засекаем время и пытаемся отправить сообщение var milsSpared = (DateTime.Now - timeStartSend).TotalMilliseconds; Logger.InfoFormat("сообщения '{0}' отправлено получателю {1}. Время отправки {2}", message.Title, recv, milsSpared); CheckTimeOut(milsSpared, recv, message); Interlocked.Increment(ref totalDelivered); } #region catch catch (Exception ex) { var milsSpared = (DateTime.Now - timeStartSend).TotalMilliseconds; Logger.ErrorFormat( "Сбой доставки сообщения '{0}' получателю {1}. Время отправки составило {2}. " + "Этот адрес будет занесён в список заблокированных адресов. Ошибка: {3}", message.Title, recv, milsSpared, ex); errorList.Add(new DeliveryServerError { ReasonMessage = String.Format("Сбой доставки сообщения '{0}' по причине {1}", message.Title, ex.Message), Urgency = message.Urgency, DateException = DateTime.Now, ExceptionLink = ex, TimeSpan = milsSpared, Receiver = recv }, 1000); if (!failReceiversList.AddIfNotContains(recv, 1000)) { Logger.ErrorFormat( String.Format("Не удалось добавить адрес {0} в список заблокированных адресов", recv)); } else { Logger.Info(String.Format("Адрес {0} добавлен в список заблокированных адресов", recv)); } } #endregion } } if (failReceiversList.Count >= message.Receivers.Length) { ModuleStatusController.Instance.Status.AddError(ServiceProcessState.HasWarnings, "Чёрный список больше, чем количество получателей сообщения.", DateTime.Now, ErrorCodeBlackListTooLarge); } //else // ModuleStatusController.Instance.Status.RemoveError(ServiceProcessState.HasWarnings, ErrorCodeBlackListTooLarge); } countMessagesInAllMail = 0; } }