示例#1
0
        /// <inheritdoc/>
        public async Task ProcessNotificationEntities(string applicationName, IList <EmailNotificationItemEntity> notificationEntities)
        {
            var traceprops = new Dictionary <string, string>();

            traceprops[AIConstants.Application] = applicationName;
            traceprops[AIConstants.MeetingNotificationCount] = notificationEntities?.Count.ToString(CultureInfo.InvariantCulture);

            this.logger.TraceInformation($"Started {nameof(this.ProcessNotificationEntities)} method of {nameof(DirectSendNotificationProvider)}.", traceprops);
            if (notificationEntities is null || notificationEntities.Count == 0)
            {
                throw new ArgumentNullException(nameof(notificationEntities), "notificationEntities are null.");
            }

            foreach (var item in notificationEntities)
            {
                item.EmailAccountUsed = item.From;
                item.TryCount++;
                item.ErrorMessage = string.Empty; // Reset the error message on next retry.
                try
                {
                    var         sendForReal = this.mailSettings.Find(a => a.ApplicationName == applicationName).SendForReal;
                    var         toOverride  = this.mailSettings.Find(a => a.ApplicationName == applicationName).ToOverride;
                    MessageBody body        = await this.emailManager.GetNotificationMessageBodyAsync(applicationName, item).ConfigureAwait(false);

                    DirectSend.Models.Mail.EmailMessage message = item.ToDirectSendEmailMessage(body, this.directSendSetting);
                    if (!sendForReal)
                    {
                        message.ToAddresses = toOverride.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries)
                                              .Select(torecipient => new DirectSend.Models.Mail.EmailAddress {
                            Address = torecipient
                        }).ToList();
                        message.CcAddresses = null;
                    }

                    await this.mailService.SendEmailAsync(message).ConfigureAwait(false);

                    item.Status = NotificationItemStatus.Sent;
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
                {
                    this.logger.WriteCustomEvent($"{AIConstants.CustomEventMailSendFailed} for notificationId:  {item.NotificationId} ");
                    item.Status       = NotificationItemStatus.Failed;
                    item.ErrorMessage = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
                }
            }

            this.logger.TraceInformation($"Finished {nameof(this.ProcessNotificationEntities)} method of {nameof(DirectSendNotificationProvider)}.", traceprops);
        }
示例#2
0
        /// <inheritdoc/>
        public async Task ProcessMeetingNotificationEntities(string applicationName, IList <MeetingNotificationItemEntity> notificationEntities)
        {
            var traceprops = new Dictionary <string, string>();

            traceprops[AIConstants.Application] = applicationName;
            traceprops[AIConstants.MeetingNotificationCount] = notificationEntities?.Count.ToString(CultureInfo.InvariantCulture);

            this.logger.TraceInformation($"Started {nameof(this.ProcessMeetingNotificationEntities)} method of {nameof(DirectSendNotificationProvider)}.", traceprops);
            if (notificationEntities is null || notificationEntities.Count == 0)
            {
                throw new ArgumentNullException(nameof(notificationEntities), "notificationEntities are null.");
            }

            foreach (var item in notificationEntities)
            {
                item.TryCount++;
                item.ErrorMessage = string.Empty; // Reset the error message on next retry.
                try
                {
                    var sendForReal = this.mailSettings.Find(a => a.ApplicationName == applicationName).SendForReal;
                    var toOverride  = this.mailSettings.Find(a => a.ApplicationName == applicationName).ToOverride;
                    DirectSend.Models.Mail.EmailMessage message = new DirectSend.Models.Mail.EmailMessage();
                    message.Subject = item.Subject;
                    MessageBody body = await this.emailManager.GetMeetingInviteBodyAsync(applicationName, item).ConfigureAwait(false);

                    message.FromAddresses = new List <DirectSend.Models.Mail.EmailAddress>
                    {
                        (item.From == this.directSendSetting?.FromAddress2) ? new DirectSend.Models.Mail.EmailAddress {
                            Name = this.directSendSetting?.FromAddress2DisplayName, Address = this.directSendSetting?.FromAddress2
                        } : new DirectSend.Models.Mail.EmailAddress {
                            Name = this.directSendSetting?.FromAddressDisplayName, Address = this.directSendSetting?.FromAddress
                        },
                    };
                    if (!sendForReal)
                    {
                        message.ToAddresses = toOverride.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries)
                                              .Select(torecipient => new DirectSend.Models.Mail.EmailAddress {
                            Address = torecipient
                        }).ToList();
                        message.CcAddresses = null;
                    }
                    else
                    {
                        var toAddress = item.RequiredAttendees.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries)
                                        .Select(torecipient => new DirectSend.Models.Mail.EmailAddress {
                            Address = torecipient
                        }).ToList();
                        if (item.OptionalAttendees?.Length > 0)
                        {
                            toAddress.AddRange(item.OptionalAttendees.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries)?
                                               .Select(torecipient => new DirectSend.Models.Mail.EmailAddress {
                                Address = torecipient
                            }).ToList());
                        }

                        message.ToAddresses = toAddress;
                    }

                    message.FileName    = item.Attachments?.Select(e => e.FileName);
                    message.FileContent = item.Attachments?.Select(e => e.FileBase64);
                    message.Content     = MeetingInviteUtilities.ConvertDirectSendMeetingInviteToBody(item, body.Content);
                    message.Importance  = (ImportanceType)Enum.Parse(typeof(ImportanceType), item.Priority.ToString());
                    await this.mailService.SendMeetingInviteAsync(message).ConfigureAwait(false);

                    item.Status = NotificationItemStatus.Sent;
                }
#pragma warning disable CA1031 // Do not catch general exception types
                catch (Exception ex)
#pragma warning restore CA1031 // Do not catch general exception types
                {
                    this.logger.WriteCustomEvent($"{AIConstants.CustomEventInviteSendFailed} for notificationId:  {item.NotificationId} ");
                    item.Status       = NotificationItemStatus.Failed;
                    item.ErrorMessage = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
                }

                this.logger.TraceInformation($"Finished {nameof(this.ProcessMeetingNotificationEntities)} method of {nameof(DirectSendNotificationProvider)}.", traceprops);
            }
        }