static void AddEmailToSend(OrderEmail email) { if (!emailRepository.CanSendByTimeout(email.Recipient.EmailAddress, email.Order, email.OrderDocumentType)) { logger.Error("{0} Попытка отправить почту до истечения минимального времени до повторной отправки", GetThreadInfo()); throw new Exception("Отправка на один и тот же адрес возможна раз в 10 минут"); } logger.Debug("{0} Запись в базу информации о письме", GetThreadInfo()); using (var uow = UnitOfWorkFactory.CreateWithNewRoot <StoredEmail>($"[ES]Добавление письма на отправку")) { //Заполнение нового письма данными switch (email.OrderDocumentType) { case OrderDocumentType.Bill: uow.Root.Order = uow.GetById <Order>(email.Order); break; case OrderDocumentType.BillWSForDebt: uow.Root.OrderWithoutShipmentForDebt = uow.GetById <OrderWithoutShipmentForDebt>(email.Order); break; case OrderDocumentType.BillWSForAdvancePayment: uow.Root.OrderWithoutShipmentForAdvancePayment = uow.GetById <OrderWithoutShipmentForAdvancePayment>(email.Order); break; case OrderDocumentType.BillWSForPayment: uow.Root.OrderWithoutShipmentForPayment = uow.GetById <OrderWithoutShipmentForPayment>(email.Order); break; } uow.Root.DocumentType = email.OrderDocumentType; uow.Root.SendDate = DateTime.Now; uow.Root.StateChangeDate = DateTime.Now; uow.Root.HtmlText = email.HtmlText; uow.Root.Text = email.Text; uow.Root.Title = email.Title; uow.Root.State = StoredEmailStates.WaitingToSend; uow.Root.SenderName = email.Sender.Title; uow.Root.SenderAddress = email.Sender.EmailAddress; uow.Root.RecipientName = email.Recipient.Title; uow.Root.RecipientAddress = email.Recipient.EmailAddress; uow.Root.ManualSending = email.ManualSending; uow.Root.Author = email.AuthorId != 0 ? uow.GetById <Employee>(email.AuthorId) : null; try { uow.Save(); } catch (Exception ex) { logger.Debug(string.Format("{1} Ошибка при сохранении. Ошибка: {0}", ex.Message, GetThreadInfo())); throw ex; } email.StoredEmailId = uow.Root.Id; emailsQueue.Add(email); logger.Debug("{0} Письмо добавлено в очередь на отправку. Писем в очереди: {1}", GetThreadInfo(), emailsQueue.Count); logger.Debug("{0} Закончил работу.", GetThreadInfo()); } }
public static Tuple <bool, string> AddEmail(OrderEmail email) { Thread.CurrentThread.Name = "AddNewEmail"; logger.Debug("Thread {0} Id {1}: Получено новое письмо на отправку", Thread.CurrentThread.Name, Thread.CurrentThread.ManagedThreadId); try { AddEmailToSend(email); } catch (Exception ex) { return(new Tuple <bool, string>(false, ex.Message)); } return(new Tuple <bool, string>(true, "Письмо добавлено в очередь на отправку")); }
private static MailjetRequest CreateOrderMailjetRequest(OrderEmail email) { MailjetRequest request = new MailjetRequest { Resource = Send.Resource }; var attachments = new JArray(); foreach (var item in email.AttachmentsBinary) { attachments.Add(new JObject { { "ContentType", "application/octet-stream" }, { "Filename", item.Key }, { "Base64Content", item.Value } }); } var inlinedAttachments = new JArray(); foreach (var item in email.InlinedAttachments) { inlinedAttachments.Add(new JObject { { "ContentID", item.Key }, { "ContentType", item.Value.ContentType }, { "Filename", item.Value.FileName }, { "Base64Content", item.Value.Base64String } }); } var message = new JObject { { "From", new JObject { { "Email", email.Sender.EmailAddress }, { "Name", email.Sender.Title } } }, { "To", new JArray { new JObject { { "Email", email.Recipient.EmailAddress }, { "Name", email.Recipient.Title } } } }, { "Subject", email.Title }, { "TextPart", email.Text }, { "HTMLPart", email.HtmlText }, { "CustomID", email.StoredEmailId.ToString() }, { "Attachments", attachments }, { "InlinedAttachments", inlinedAttachments }, { "TrackOpens", "account_default" }, { "TrackClicks", "account_default" } }; request.Property(Send.Messages, new JArray { message }); return(request); }
static async Task ProcessEmailMailjet() { Thread.CurrentThread.Name = "EmailSendWorker"; while (true) { OrderEmail email = null; email = emailsQueue.Take(); logger.Debug("{0} Отправка письма из очереди", GetThreadInfo()); Thread.Sleep(1000); if (email == null) { continue; } if (email.StoredEmailId == 0) { logger.Debug("{0} Письмо не было сохранено перед добавлением в очередь. Добавлено повторно в очередь", GetThreadInfo()); AddEmailToSend(email); continue; } using (var uow = UnitOfWorkFactory.CreateForRoot <StoredEmail>(email.StoredEmailId, $"[ES]Задача отправки через Mailjet")) { MailjetClient client = new MailjetClient(userId, userSecretKey) { Version = ApiVersion.V3_1, }; try { //формируем письмо в формате mailjet для отправки var request = CreateOrderMailjetRequest(email); MailjetResponse response = null; try { logger.Debug("{0} Отправка запроса на сервер Mailjet", GetThreadInfo()); response = await client.PostAsync(request); } catch (Exception ex) { logger.Error("{1} Не удалось отправить письмо: \n{0}", ex, GetThreadInfo()); SaveErrorInfo(uow, ex.ToString()); continue; } MailjetMessage[] messages = response.GetData().ToObject <MailjetMessage[]>(); logger.Debug("{1} Получен ответ: Code {0}", response.StatusCode, GetThreadInfo()); if (response.IsSuccessStatusCode) { uow.Root.State = StoredEmailStates.SendingComplete; foreach (var message in messages) { if (message.CustomID == uow.Root.Id.ToString()) { foreach (var messageTo in message.To) { if (messageTo.Email == email.Recipient.EmailAddress) { uow.Root.ExternalId = messageTo.MessageID.ToString(); } } } } uow.Save(); logger.Debug(response.GetData()); } else { switch (response.StatusCode) { //Unauthorized //Incorrect Api Key / API Secret Key or API key may be expired. case 401: Init(); if (email.SendAttemptsCount >= MaxSendAttemptsCount) { SaveErrorInfo(uow, GetErrors(messages)); } else { emailsQueue.Add(email); } break; //Too Many Requests //Reach the maximum number of calls allowed per minute. case 429: if (email.SendAttemptsCount >= MaxSendAttemptsCount) { SaveErrorInfo(uow, GetErrors(messages)); } else { emailsQueue.Add(email); } break; //Internal Server Error case 500: SaveErrorInfo(uow, string.Format("Внутренняя ошибка сервера Mailjet: {0}", GetErrors(messages))); break; default: SaveErrorInfo(uow, GetErrors(messages)); break; } logger.Debug(response.GetData()); logger.Debug("{1} ErrorMessage: {0}\n", response.GetErrorMessage(), GetThreadInfo()); } } catch (Exception ex) { logger.Error(ex, "При обработке ответа на отправку письма возникла ошибка.\n"); } } } }
public Tuple <bool, string> SendOrderEmail(OrderEmail mail) { return(EmailManager.AddEmail(mail)); }