public string ExecuteMail(EmailMessageInfo objMailModel, List <CargoRatesModel> objCRList) { string result = "Error on Sending Mail!"; try { var htmlData = getDataFromHtml(objCRList, objMailModel); string Key = ConfigurationManager.AppSettings["SendGridApiKey"]; var apiKey = Environment.GetEnvironmentVariable(Key); var client = new SendGridClient(Key); var from = new EmailAddress(objMailModel.FromEmailAddress, objMailModel.FromName); var subject = objMailModel.EmailSubject; var to = new EmailAddress(objMailModel.ToEmailAddress, objMailModel.ToName); var plainTextContent = ""; var htmlContent = htmlData; var msg = MailHelper.CreateSingleEmail(from, to, subject, plainTextContent, htmlContent); var response = client.SendEmailAsync(msg); InsertQuotationData(objMailModel, objCRList); result = "Mail Sent Successfully!"; } catch (Exception ex) { ErrorHandlerClass.LogError(ex); } return(result); }
public async Task Parse(EmailMessageInfo messageInfo) { _log.Debug($"Processing {messageInfo.EmailMetadata.OriginalUri}."); Stopwatch stopwatch = Stopwatch.StartNew(); List <AttachmentInfo> attachments = _mimeMessageFactory .Create(messageInfo.EmailStream) .BodyParts.OfType <MimePart>() .Select(_attachmentStreamNormaliser.Normalise) .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo)) .ToList(); if (attachments.Count == 0) { _log.Warn($"Didnt find any aggregate report attachments for {messageInfo.EmailMetadata.OriginalUri}."); } else { _log.Debug($"Found {attachments.Count} aggregate report attachment(s) for {messageInfo.EmailMetadata.OriginalUri}."); } _log.Debug($"Aggregate report attachment processing took {stopwatch.Elapsed}"); stopwatch.Reset(); stopwatch.Start(); List <AggregateReportInfo> aggregateReports = attachments .Select(_ => _aggregateReportDeserialiser.Deserialise(_, messageInfo.EmailMetadata)) .ToList(); _log.Debug($"Deserialising aggregate reports took {stopwatch.Elapsed}"); stopwatch.Stop(); await Task.WhenAll(aggregateReports.Select(_ => _aggregateReportDao.Add(_aggregateReportToEntityConverter.ConvertToEntity(_)))); attachments.ForEach(_ => _.Dispose()); }
private async Task Process(FileInfo fileInfo) { _logger.LogDebug( $"Processing file {fileInfo.FullName}."); try { EmailMessageInfo emailMessageInfo = CreateEmailMessageInfo(fileInfo); _logger.LogDebug( $"Successfully retrieved report in file {fileInfo.FullName}."); AggregateReportInfo aggregateReportInfo = _parser.Parse(emailMessageInfo); emailMessageInfo.EmailStream.Dispose(); _logger.LogDebug( $"Successfully parsed report in file {fileInfo.FullName}."); await _persistor.Persist(aggregateReportInfo); _logger.LogDebug( $"Successfully persisted report in file {fileInfo.FullName}."); aggregateReportInfo.AttachmentInfo.AttachmentStream.Dispose(); } catch (Exception e) { Console.WriteLine($"Failed to process {fileInfo.Name} with error: {e.Message}{Environment.NewLine}{e.StackTrace}"); } }
public async Task <Response> Send(EmailMessageInfo messageInfo) { // Prepare the SendGrid email message var sendgridMessage = new SendGridMessage { From = new EmailAddress(messageInfo.FromEmailAddress), Subject = messageInfo.EmailSubject, HtmlContent = messageInfo.EmailBody }; // Add the "To" email address to the message sendgridMessage.AddTo(new EmailAddress(messageInfo.ToEmailAddress)); // Check if any Cc email address was specified if (!string.IsNullOrWhiteSpace(messageInfo.CcEmailAddress)) { // Add the email address for Cc to the message sendgridMessage.AddCc(new EmailAddress(messageInfo.CcEmailAddress)); } // Check if any Bcc email address was specified if (!string.IsNullOrWhiteSpace(messageInfo.BccEmailAddress)) { // Add the email address for Bcc to the message sendgridMessage.AddBcc(new EmailAddress(messageInfo.BccEmailAddress)); } // Send the message to SendGrid, and save the API response var response = await _client.SendEmailAsync(sendgridMessage); // Return the SendGrid response return(response); }
public async Task <Result <TDomain> > ProcessEmailMessage(EmailMessageInfo messageInfo) { Result <TDomain> result = await _processor.ProcessEmailMessage(messageInfo); try { if (result.Success) { if (!result.Duplicate) { foreach (var publisher in _publishers) { await publisher.Publish(result.Report); } } else { _log.Info($"Didnt publish aggregate aggregateReportInfo events for duplicate message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}"); } } } catch (Exception e) { _log.Error($"Failed to publish aggregate aggregateReportInfo events, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} with error {e.Message}{Environment.NewLine}{e.StackTrace}"); return(Result <TDomain> .FailedResult); } return(result); }
public async Task <Result <TDomain> > ProcessEmailMessage(EmailMessageInfo messageInfo) { Result <TDomain> result = await _processor.ProcessEmailMessage(messageInfo); try { if (result.Success) { TEntity entity = _converter.Convert(result.Report); _log.Info($"Persisting email message for message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}"); bool added = await _dao.Add(entity); if (added) { _log.Info($"Successfully persisted email message for message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}"); } else { _log.Info($"Did not persist email message for message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} as it was a duplicate."); } return(new Result <TDomain>(result.Report, result.Success, !added)); } return(result); } catch (Exception e) { _log.Error($"Failed to persist email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} with error {e.Message}{System.Environment.NewLine}{e.StackTrace}"); return(Result <TDomain> .FailedResult); } }
public AggregateReportInfo Parse(EmailMessageInfo messageInfo) { List <AttachmentInfo> attachments = _mimeMessageFactory .Create(messageInfo.EmailStream) .BodyParts.OfType <MimePart>() .Select(_attachmentStreamNormaliser.Normalise) .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo)) .ToList(); string logString = $"{messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}"; if (attachments.Count == 0) { throw new ApplicationException( $"Failed to parse: no attachment found where one was expected for {logString}."); } if (attachments.Count > 1) { var attachmentFilenames = attachments.Select(attachment => attachment.AttachmentMetadata.Filename).ToArray(); var attachmentFilenamesString = string.Join(", ", attachmentFilenames); throw new ApplicationException( $"Failed to parse: multiple attachments found where only one was expected for {logString}. {Environment.NewLine} Attachment filenames: {attachmentFilenamesString}"); } AttachmentInfo attachmentInfo = attachments[0]; AggregateReportInfo aggregateReportInfo = _aggregateReportDeserialiser.Deserialise(attachmentInfo, messageInfo.EmailMetadata); _log.LogInformation( $"Successfully processed attachment for {logString}."); return(aggregateReportInfo); }
private string InsertQuotationData(EmailMessageInfo objMailModel, List <CargoRatesModel> objCRList) { string result = ""; ACRF_QuotationModel objQuotModel = new ACRF_QuotationModel(); List <ACRF_QuotationDetailsModel> objQuotDetList = new List <ACRF_QuotationDetailsModel>(); objQuotModel.ClientMail = objMailModel.ToEmailAddress; objQuotModel.FromMail = objMailModel.FromEmailAddress; objQuotModel.MailSubject = objMailModel.EmailSubject; objQuotModel.QuotationStatus = QuotationType.InProgress; objQuotModel.VendorId = objMailModel.VendorId; objQuotModel.CreatedBy = objMailModel.FromEmailAddress; foreach (var data in objCRList) { if (data.IsSelect == true) { ACRF_QuotationDetailsModel tempobj = new ACRF_QuotationDetailsModel(); tempobj.AirlineId = data.AirlineId; tempobj.AMS = data.AMS; tempobj.Ctc = data.Ctc; tempobj.DAirportName = data.DAirportName; tempobj.DCityCode = data.DCityCode; tempobj.DCountryCode = data.DCountryCode; tempobj.DisplayRateName1 = objMailModel.DisplayRateName1; tempobj.DisplayRateName2 = objMailModel.DisplayRateName2; tempobj.DisplayRateName3 = objMailModel.DisplayRateName3; tempobj.Freight = data.Freight; tempobj.FSC = data.FSC; tempobj.Id = data.Id; tempobj.IsRate1 = objMailModel.IsRate1; tempobj.IsRate2 = objMailModel.IsRate2; tempobj.IsRate3 = objMailModel.IsRate3; tempobj.Mcc = data.Mcc; tempobj.OAirportName = data.OAirportName; tempobj.OCityCode = data.OCityCode; tempobj.OCountryCode = data.OCountryCode; tempobj.Rate = data.Rate; tempobj.Rate1 = data.Rate1; tempobj.Rate2 = data.Rate2; tempobj.Rate3 = data.Rate3; tempobj.Slab1 = data.Slab1; tempobj.TariffModeId = data.TariffModeId; tempobj.TotalCost = data.TotalCost; tempobj.WSC = data.WSC; tempobj.Xray = data.Xray; objQuotDetList.Add(tempobj); } } objQuotModel.ACRF_QuotationDetailsModelList = objQuotDetList; result = objQuotVM.CreateQuotation(objQuotModel); return(result); }
private T Parse(EmailMessageInfo emailMessageInfo) { try { return(_reportParser.Parse(emailMessageInfo)); } catch (Exception e) { _log.Error($"Failed to process {emailMessageInfo.EmailMetadata.Filename} with error {e.Message} {System.Environment.NewLine} {e.StackTrace}"); return(null); } }
protected async void sendButton_Click(object sender, EventArgs e) { // Prepare the email message info model var messageInfo = new EmailMessageInfo { FromEmailAddress = fromInput.Value, ToEmailAddress = toInput.Value, CcEmailAddress = ccInput.Value, BccEmailAddress = bccInput.Value, EmailSubject = subjectInput.Value, EmailBody = bodyInput.Value }; // Make an API call, and save the response var apiResponse = await _sendGridService.Send(messageInfo); await SetResponseInfoContainers(apiResponse); }
public Task <Result <TDomain> > ProcessEmailMessage(EmailMessageInfo messageInfo) { try { _log.Info($"Parsing email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}."); TDomain report = _parser.Parse(messageInfo); _log.Info($"Successfully parsed email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}."); return(Task.FromResult(new Result <TDomain>(report, true, false))); } catch (Exception e) { _log.Error($"Failed to process email message, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId} with error {e.Message}{System.Environment.NewLine}{e.StackTrace}"); return(Task.FromResult(Result <TDomain> .FailedResult)); } }
public AggregateReportInfo Parse(EmailMessageInfo messageInfo) { Stopwatch stopwatch = Stopwatch.StartNew(); _log.Debug($"Processing {messageInfo.EmailMetadata.OriginalUri}."); List <AttachmentInfo> attachments = _mimeMessageFactory .Create(messageInfo.EmailStream) .BodyParts.OfType <MimePart>() .Select(_attachmentStreamNormaliser.Normalise) .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo)) .ToList(); _log.Debug($"Aggregate report attachment processing took {stopwatch.Elapsed}"); stopwatch.Reset(); AttachmentInfo attachment = attachments.Single(); stopwatch.Start(); AggregateReportInfo aggregateReport = _aggregateReportDeserialiser.Deserialise(attachment, messageInfo.EmailMetadata); _log.Debug($"Deserialising aggregate report took {stopwatch.Elapsed}"); stopwatch.Reset(); _log.Debug($"Found {aggregateReport.AggregateReport.Records.Length} records in {aggregateReport.AttachmentMetadata.Filename}"); if (_multiAttachmentPersistor.Active) { stopwatch.Start(); _multiAttachmentPersistor.Persist(attachment); _log.Debug($"Persisting attachments took {stopwatch.Elapsed}"); stopwatch.Reset(); } attachment?.Dispose(); return(aggregateReport); }
public AggregateReportInfo Parse(EmailMessageInfo messageInfo) { _log.Info($"Processing attachments for {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}."); List <AttachmentInfo> attachments = _mimeMessageFactory .Create(messageInfo.EmailStream) .BodyParts.OfType <MimePart>() .Select(_attachmentStreamNormaliser.Normalise) .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo)) .ToList(); _log.Info($"Successfully processed attachments for {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}."); AttachmentInfo attachment = attachments.Single(); _log.Debug($"Deserialising aggregate report {attachment.AttachmentMetadata.Filename} for {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}."); AggregateReportInfo aggregateReportInfo = _aggregateReportDeserialiser.Deserialise(attachment, messageInfo.EmailMetadata); _log.Debug($"Successfully deserialised aggregate report with Id: {aggregateReportInfo.AggregateReport.ReportMetadata.ReportId} from file {attachment.AttachmentMetadata.Filename} from S3 bucket {messageInfo.EmailMetadata.OriginalUri}, message Id: {messageInfo.EmailMetadata.MessageId}, request Id: {messageInfo.EmailMetadata.RequestId}."); attachments.ForEach(_ => _.Dispose()); return(aggregateReportInfo); }
private string getDataFromHtml(List <CargoRatesModel> objCRList, EmailMessageInfo objMailModel) { string oCity = ""; string dCity = ""; string cargotariff = ""; var fileContents = System.IO.File.ReadAllText(HttpContext.Current.Server.MapPath(@"~/MailFormat/emailer.html")); string sirreplace = ""; if (objMailModel.ToName != "" || objMailModel.ToName != null) { sirreplace = objMailModel.ToName; } else { sirreplace = "Sir"; } string tabledata = "<table width='100%'> " + " <thead style='background-color: #ddd;'> " + " <tr>" + " <th style='padding: 10px 0px 10px 0px;'>Airline</th>" + " <th style='padding: 10px 0px 10px 0px;'>Total</th>" + " <th style='padding: 10px 0px 10px 0px;'>Slab1</th>" + " <th style='padding: 10px 0px 10px 0px;'>Rate</th>" + " <th style='padding: 10px 0px 10px 0px;'>Freight</th>" + " <th style='padding: 10px 0px 10px 0px;'>FSC</th>" + " <th style='padding: 10px 0px 10px 0px;'>WSC</th>" + " <th style='padding: 10px 0px 10px 0px;'>X Ray</th>" + " <th style='padding: 10px 0px 10px 0px;'>MCC</th>" + " <th style='padding: 10px 0px 10px 0px;'>CTG</th>"; if (objMailModel.IsRate1 == true) { tabledata = tabledata + " <th style='padding: 10px 0px 10px 0px;'>" + objMailModel.DisplayRateName1 + "</th>"; } if (objMailModel.IsRate2 == true) { tabledata = tabledata + " <th style='padding: 10px 0px 10px 0px;'>" + objMailModel.DisplayRateName2 + "</th>"; } if (objMailModel.IsRate3 == true) { tabledata = tabledata + " <th style='padding: 10px 0px 10px 0px;'>" + objMailModel.DisplayRateName3 + "</th>"; } tabledata = tabledata + " " + " </tr>" + " </thead>" + " <tbody style='background-color: #ece9e6;'>"; foreach (var data in objCRList) { if (data.IsSelect == true) { oCity = data.OCityCode; dCity = data.DCityCode; cargotariff = data.TariffMode; tabledata = tabledata + " <tr>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Airline; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.TotalCost; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Slab1; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Rate; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Freight; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.FSC; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.WSC; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Xray; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Mcc; tabledata = tabledata + " </td>"; tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>"; tabledata = tabledata + data.Ctc; tabledata = tabledata + " </td>"; if (objMailModel.IsRate1 == true) { tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>" + data.Rate1 + "</td>"; } if (objMailModel.IsRate2 == true) { tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>" + data.Rate2 + "</td>"; } if (objMailModel.IsRate3 == true) { tabledata = tabledata + " <td style='padding: 10px 0px 10px 0px;text-align: center;'>" + data.Rate3 + "</td>"; } tabledata = tabledata + " <tr>"; } } tabledata = tabledata + " </tbody></table>"; string cargodetails = "Ex- " + oCity + " Airport to " + dCity + " Airport, for " + cargotariff + " cargo"; string cargodetails2 = cargotariff + " Cargo Rates Ex- " + oCity + " Airport to " + dCity + " Airport Currency: INR"; fileContents = fileContents.Replace("dynamic_tabledata", tabledata); fileContents = fileContents.Replace("{{Sir}}", sirreplace); fileContents = fileContents.Replace("{{CargoDetails}}", cargodetails); fileContents = fileContents.Replace("{{CargoDetails2}}", cargodetails2); var vendordata = objVendorVM.GetOneVendorDetails(objMailModel.VendorId); //fileContents = fileContents.Replace("{{VendorAddress}}", vendordata.Address); //fileContents = fileContents.Replace("{{VendorMobile}}", vendordata.Mobile); //fileContents = fileContents.Replace("{{VendorEmail}}", vendordata.Email); //fileContents = fileContents.Replace("{{VendorName}}", vendordata.VendorName); return(fileContents); }
public void Parse(EmailMessageInfo messageInfo) { try { Stopwatch stopwatch = new Stopwatch(); List <AttachmentInfo> attachments = null; if (_multiAttachmentPersistor.Active || _multiDenormalisedRecordPersistor.Active || _multiAggregateReportPersistor.Active) { _log.Debug($"Processing {messageInfo.EmailMetadata.OriginalUri}."); stopwatch.Start(); attachments = _mimeMessageFactory .Create(messageInfo.EmailStream) .BodyParts.OfType <MimePart>() .Select(_attachmentStreamNormaliser.Normalise) .Where(_ => !_.Equals(AttachmentInfo.EmptyAttachmentInfo)) .ToList(); if (attachments.Count == 0) { _log.Warn($"Didnt find any aggregate report attachments for {messageInfo.EmailMetadata.OriginalUri}."); } else { _log.Debug($"Found {attachments.Count} aggregate report attachment(s) for {messageInfo.EmailMetadata.OriginalUri}."); } _log.Debug($"Aggregate report attachment processing took {stopwatch.Elapsed}"); stopwatch.Reset(); } else { _log.Warn($"Not Processing {messageInfo.EmailMetadata.OriginalUri} as no persistors found."); } List <AggregateReportInfo> aggregateReports = null; if (_multiDenormalisedRecordPersistor.Active || _multiAggregateReportPersistor.Active) { stopwatch.Start(); aggregateReports = attachments .Select(_ => _aggregateReportDeserialiser.Deserialise(_, messageInfo.EmailMetadata)) .ToList(); _log.Debug($"Deserialising aggregate reports took {stopwatch.Elapsed}"); stopwatch.Reset(); aggregateReports.ForEach(_ => _log.Debug($"Found {_.AggregateReport.Records.Length} records in {_.AttachmentMetadata.Filename}")); } List <DenormalisedRecord> denormalisedRecords = null; if (_multiDenormalisedRecordPersistor.Active) { stopwatch.Start(); denormalisedRecords = aggregateReports .Select(_ => _denormalisedRecordConverter.ToDenormalisedRecord(_.AggregateReport, messageInfo.EmailMetadata.OriginalUri)) .SelectMany(_ => _) .ToList(); _log.Debug($"Denormalised record processing took {stopwatch.Elapsed}"); stopwatch.Reset(); } if (_multiAttachmentPersistor.Active) { stopwatch.Start(); _multiAttachmentPersistor.Persist(attachments); _log.Debug($"Persisting attachments took {stopwatch.Elapsed}"); stopwatch.Reset(); } if (_multiDenormalisedRecordPersistor.Active) { stopwatch.Start(); _multiDenormalisedRecordPersistor.Persist(denormalisedRecords); _log.Debug($"Persisting denormalised records took {stopwatch.Elapsed}"); stopwatch.Reset(); } if (_multiAggregateReportPersistor.Active) { stopwatch.Start(); _multiAggregateReportPersistor.Persist(aggregateReports); _log.Debug($"Persisting denormalised records took {stopwatch.Elapsed}"); stopwatch.Reset(); } attachments?.ForEach(_ => _.Dispose()); } catch (Exception e) { _log.Error($"An error occurred processing {messageInfo.EmailMetadata.OriginalUri}{Environment.NewLine}{e.Message}{Environment.NewLine}{Environment.NewLine}{e.StackTrace}"); } }
private async Task Process(S3SourceInfo s3SourceInfo) { using (_logger.BeginScope(new Dictionary <string, object> { ["MessageId"] = s3SourceInfo.MessageId, ["RequestId"] = s3SourceInfo.RequestId, ["S3ObjectPath"] = $"{ s3SourceInfo.BucketName }/{ s3SourceInfo.ObjectName }" })) { _logger.LogDebug( $"Processing report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}."); try { EmailMessageInfo emailMessageInfo = await _s3Client.GetEmailMessage(s3SourceInfo); using (_logger.BeginScope(new Dictionary <string, object> { ["EmailAttachmentFileName"] = emailMessageInfo?.EmailMetadata?.Filename, })) { _logger.LogDebug( $"Successfully retrieved report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}."); if (emailMessageInfo.EmailMetadata.FileSizeKb > _config.MaxS3ObjectSizeKilobytes) { _logger.LogWarning( $"Didnt process report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName} " + $" as MaxS3ObjectSizeKilobytes of {_config.MaxS3ObjectSizeKilobytes} Kb was exceeded, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}."); } else { AggregateReportInfo aggregateReportInfo = null; try { aggregateReportInfo = _parser.Parse(emailMessageInfo); } finally { emailMessageInfo.EmailStream.Dispose(); aggregateReportInfo?.AttachmentInfo.AttachmentStream.Dispose(); } _logger.LogDebug( $"Successfully parsed report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}."); using (_logger.BeginScope(new Dictionary <string, object> { ["AggregateReportInfoId"] = aggregateReportInfo?.Id, ["AggregateReportId"] = aggregateReportInfo?.AggregateReport?.ReportMetadata?.ReportId, ["AggregateReportOrgName"] = aggregateReportInfo?.AggregateReport?.ReportMetadata?.OrgName, ["AggregateReportDomain"] = aggregateReportInfo?.AggregateReport?.PolicyPublished?.Domain, })) using (TransactionScope transactionScope = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TimeSpan.FromSeconds(300) }, TransactionScopeAsyncFlowOption.Enabled)) { aggregateReportInfo = await _persistor.Persist(aggregateReportInfo); _logger.LogDebug( $"Successfully persisted report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}."); await _publisher.Publish(aggregateReportInfo); _logger.LogDebug( $"Successfully published report/s in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}."); transactionScope.Complete(); } } } } catch (DuplicateAggregateReportException) { _logger.LogInformation( $"Duplicate report in s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName}, " + $"message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId} ignored."); } catch (Exception e) { _logger.LogError(e, $"Failed to process s3 object {s3SourceInfo.BucketName}/{s3SourceInfo.ObjectName} message Id: {s3SourceInfo.MessageId}, request Id: {s3SourceInfo.RequestId}"); throw; } } }