Error handling for rendering mail on request.

This commit is contained in:
Burak Kaan Köse
2024-07-21 01:58:17 +02:00
parent ebf4bc6f97
commit 1f472d78e0

View File

@@ -318,26 +318,13 @@ namespace Wino.Mail.ViewModels
renderCancellationTokenSource = new CancellationTokenSource(); renderCancellationTokenSource = new CancellationTokenSource();
// Mime content might not be available for now and might require a download. // Mime content might not be available for now and might require a download.
try
{
if (parameters is MailItemViewModel selectedMailItemViewModel)
await RenderAsync(selectedMailItemViewModel, renderCancellationTokenSource.Token);
else if (parameters is MimeMessageInformation mimeMessageInformation)
await RenderAsync(mimeMessageInformation);
InitializeCommandBarItems(); if (parameters is MailItemViewModel selectedMailItemViewModel)
} await RenderAsync(selectedMailItemViewModel, renderCancellationTokenSource.Token);
catch (OperationCanceledException) else if (parameters is MimeMessageInformation mimeMessageInformation)
{ await RenderAsync(mimeMessageInformation);
Log.Information("Canceled mail rendering.");
}
catch (Exception ex)
{
DialogService.InfoBarMessage(Translator.Info_MailRenderingFailedTitle, string.Format(Translator.Info_MailRenderingFailedMessage, ex.Message), InfoBarMessageType.Error);
Crashes.TrackError(ex); InitializeCommandBarItems();
Log.Error(ex, "Render Failed");
}
} }
private async Task HandleSingleItemDownloadAsync(MailItemViewModel mailItemViewModel) private async Task HandleSingleItemDownloadAsync(MailItemViewModel mailItemViewModel)
@@ -393,59 +380,74 @@ namespace Wino.Mail.ViewModels
private async Task RenderAsync(MimeMessageInformation mimeMessageInformation) private async Task RenderAsync(MimeMessageInformation mimeMessageInformation)
{ {
var message = mimeMessageInformation.MimeMessage; try
var messagePath = mimeMessageInformation.Path;
initializedMimeMessageInformation = mimeMessageInformation;
// TODO: Handle S/MIME decryption.
// initializedMimeMessageInformation.MimeMessage.Body is MultipartSigned
var renderingOptions = PreferencesService.GetRenderingOptions();
await ExecuteUIThread(() =>
{ {
Attachments.Clear(); var message = mimeMessageInformation.MimeMessage;
var messagePath = mimeMessageInformation.Path;
Subject = message.Subject; initializedMimeMessageInformation = mimeMessageInformation;
// TODO: FromName and FromAddress is probably not correct here for mail lists. // TODO: Handle S/MIME decryption.
FromAddress = message.From.Mailboxes.FirstOrDefault()?.Address ?? Translator.UnknownAddress; // initializedMimeMessageInformation.MimeMessage.Body is MultipartSigned
FromName = message.From.Mailboxes.FirstOrDefault()?.Name ?? Translator.UnknownSender;
CreationDate = message.Date.DateTime;
// Extract to,cc and bcc var renderingOptions = PreferencesService.GetRenderingOptions();
LoadAddressInfo(message.To, ToItems);
LoadAddressInfo(message.Cc, CCItemsItems);
LoadAddressInfo(message.Bcc, BCCItems);
// Automatically disable images for Junk folder to prevent pixel tracking. await ExecuteUIThread(() =>
// This can only work for selected mail item rendering, not for EML file rendering.
if (initializedMailItemViewModel != null &&
initializedMailItemViewModel.AssignedFolder.SpecialFolderType == SpecialFolderType.Junk)
{ {
renderingOptions.LoadImages = false; Attachments.Clear();
}
// Load images if forced. Subject = message.Subject;
if (forceImageLoading)
{
renderingOptions.LoadImages = true;
}
CurrentRenderModel = _mimeFileService.GetMailRenderModel(message, messagePath, renderingOptions); // TODO: FromName and FromAddress is probably not correct here for mail lists.
FromAddress = message.From.Mailboxes.FirstOrDefault()?.Address ?? Translator.UnknownAddress;
FromName = message.From.Mailboxes.FirstOrDefault()?.Name ?? Translator.UnknownSender;
CreationDate = message.Date.DateTime;
Messenger.Send(new HtmlRenderingRequested(CurrentRenderModel.RenderHtml)); // Extract to,cc and bcc
LoadAddressInfo(message.To, ToItems);
LoadAddressInfo(message.Cc, CCItemsItems);
LoadAddressInfo(message.Bcc, BCCItems);
foreach (var attachment in CurrentRenderModel.Attachments) // Automatically disable images for Junk folder to prevent pixel tracking.
{ // This can only work for selected mail item rendering, not for EML file rendering.
Attachments.Add(new MailAttachmentViewModel(attachment)); if (initializedMailItemViewModel != null &&
} initializedMailItemViewModel.AssignedFolder.SpecialFolderType == SpecialFolderType.Junk)
{
renderingOptions.LoadImages = false;
}
OnPropertyChanged(nameof(IsImageRenderingDisabled)); // Load images if forced.
if (forceImageLoading)
{
renderingOptions.LoadImages = true;
}
StatePersistanceService.IsReadingMail = true; CurrentRenderModel = _mimeFileService.GetMailRenderModel(message, messagePath, renderingOptions);
});
Messenger.Send(new HtmlRenderingRequested(CurrentRenderModel.RenderHtml));
foreach (var attachment in CurrentRenderModel.Attachments)
{
Attachments.Add(new MailAttachmentViewModel(attachment));
}
OnPropertyChanged(nameof(IsImageRenderingDisabled));
StatePersistanceService.IsReadingMail = true;
});
}
catch (OperationCanceledException)
{
Log.Information("Canceled mail rendering.");
}
catch (Exception ex)
{
DialogService.InfoBarMessage(Translator.Info_MailRenderingFailedTitle, string.Format(Translator.Info_MailRenderingFailedMessage, ex.Message), InfoBarMessageType.Error);
Crashes.TrackError(ex);
Log.Error(ex, "Render Failed");
}
} }
public override void OnNavigatedFrom(NavigationMode mode, object parameters) public override void OnNavigatedFrom(NavigationMode mode, object parameters)