Example #1
0
        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());
            }
        }
Example #2
0
 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, "Письмо добавлено в очередь на отправку"));
 }
Example #3
0
        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);
        }
Example #4
0
        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");
                    }
                }
            }
        }
Example #5
0
 public Tuple <bool, string> SendOrderEmail(OrderEmail mail)
 {
     return(EmailManager.AddEmail(mail));
 }