/// <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); } }
/// <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(SMTPNotificationProvider)}.", traceprops); if (notificationEntities is null || notificationEntities.Count == 0) { throw new ArgumentNullException(nameof(notificationEntities), "notificationEntities are null."); } var client = new SmtpClient(this.smtpSetting.SmtpUrl, this.smtpSetting.SmtpPort); AccountCredential selectedAccountCreds = this.emailAccountManager.FetchAccountToBeUsedForApplication(applicationName, this.applicationAccounts); client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential(selectedAccountCreds.AccountName, selectedAccountCreds.PrimaryPassword, this.smtpSetting.SmtpDomain); client.EnableSsl = true; var applicationFromAddress = this.applicationAccounts.Find(a => a.ApplicationName == applicationName).FromOverride; 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; MessageBody body = await this.emailManager.GetMeetingInviteBodyAsync(applicationName, item).ConfigureAwait(false); MailMessage message = new MailMessage(); message.Subject = item.Subject; message.From = new MailAddress(applicationFromAddress); if (!sendForReal) { message.To.Add(string.Join(",", toOverride.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries).ToList())); message.CC.Clear(); message.Bcc.Clear(); message.ReplyToList.Clear(); } else { if (item.RequiredAttendees?.Length > 0) { message.To.Add(string.Join(",", item.RequiredAttendees.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries).ToList())); } if (item.OptionalAttendees?.Length > 0) { message.CC.Add(string.Join(",", item.RequiredAttendees.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries).ToList())); } } message.Priority = (MailPriority)Enum.Parse(typeof(MailPriority), item.Priority.ToString()); ContentType ctBody = new ContentType("text/html"); AlternateView viewBody = AlternateView.CreateAlternateViewFromString(body.Content, ctBody); message.AlternateViews.Add(viewBody); string str = MeetingInviteUtilities.ConvertSMTPMeetingInviteToBody(item, body.Content, applicationFromAddress); ContentType ct = new ContentType("text/calendar"); if (item.IsCancel) { ct.Parameters.Add("method", "CANCEL"); } else { ct.Parameters.Add("method", "REQUEST"); } AlternateView avCal = AlternateView.CreateAlternateViewFromString(str, ct); message.AlternateViews.Add(avCal); await client.SendMailAsync(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(SMTPNotificationProvider)}.", traceprops); } }