Skip to content

Commit 224976c

Browse files
committed
added more logging to import process
1 parent 96d03b1 commit 224976c

File tree

5 files changed

+86
-7
lines changed

5 files changed

+86
-7
lines changed

SimpleMailArchiver/SimpleMailArchiver/Pages/FileDownload.cshtml.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44

55
namespace SimpleMailArchiver.Pages;
66

7-
public class FileDownloadsModel(MailMessageHelperService helperService) : PageModel
7+
public class FileDownloadsModel(MailMessageHelperService helperService, ILogger<FileDownloadsModel> logger) : PageModel
88
{
99
public async Task<IActionResult> OnGet(int id)
1010
{
11+
logger.LogInformation("Downloading EML file for message ID {MessageId}", id);
1112
var path = helperService.GetEmlPath(id);
12-
if (!System.IO.File.Exists(path)) return NotFound();
13+
if (!System.IO.File.Exists(path))
14+
{
15+
logger.LogWarning("File {Path} does not exist", path);
16+
return NotFound();
17+
}
1318

1419
var content = await System.IO.File.ReadAllBytesAsync(path);
1520
return File(content, "message/rfc822", "mail.eml");

SimpleMailArchiver/SimpleMailArchiver/Pages/ImportApi.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
catch (Exception ex)
7272
{
7373
var errmsg = $"API import failed with error \"{ex.Message}\"";
74-
_logger.LogError(errmsg);
74+
_logger.LogError(ex, errmsg);
7575

7676
if (callBackUrl != string.Empty)
7777
await HttpPostRetry(client, callBackUrl + "/fail", errmsg, 10, CancellationToken.None);

SimpleMailArchiver/SimpleMailArchiver/Services/MessageImportService/MessageImportService.ImportFromFolder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public partial class MessageImportService
88
public async Task ImportFromFolder(string importFolderRoot, string basePathInArchive, ImportProgress progress,
99
CancellationToken ct)
1010
{
11+
_logger.BeginScope(nameof(ImportFromFolder));
1112
_logger.LogInformation("Start import from folder");
1213

1314
var emlPaths = Directory.GetFiles(importFolderRoot, "*.eml", SearchOption.AllDirectories);

SimpleMailArchiver/SimpleMailArchiver/Services/MessageImportService/MessageImportService.ImportFromServer.cs

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,36 @@ public partial class MessageImportService
1212
{
1313
public async Task ImportFromServer(string accountFilename, ImportProgress progress, CancellationToken ct)
1414
{
15+
_logger.BeginScope(nameof(ImportFromServer));
1516
_logger.LogInformation("Starting import from server on {AccountFilename}", accountFilename);
1617

1718
var account = appContext.Accounts.First(item => item.AccountFilename == accountFilename);
19+
_logger.LogDebug("Account loaded: {Username} on {ImapUrl}", account.Username, account.ImapUrl);
1820

1921
using var client = new ImapClient();
22+
_logger.LogDebug("Connecting to IMAP server {ImapUrl}:993", account.ImapUrl);
2023
await client.ConnectAsync(account.ImapUrl, 993, SecureSocketOptions.SslOnConnect, ct);
24+
_logger.LogDebug("Connected to IMAP server successfully");
25+
2126
await client.AuthenticateAsync(account.Username, account.Password, ct);
27+
_logger.LogDebug("Authenticated as {Username}", account.Username);
2228

2329
await using var context = await dbContextFactory.CreateDbContextAsync(ct);
2430
var folders = await client.GetFoldersAsync(new FolderNamespace('/', ""), cancellationToken: ct);
31+
_logger.LogDebug("Retrieved {FolderCount} folders from server", folders.Count);
32+
2533
try
2634
{
2735
foreach (var folder in folders)
2836
{
2937
var folderOptions = account.FolderOptions?.FirstOrDefault(f => f.Name == folder.FullName);
30-
if (folderOptions is { Exclude: true }) continue;
38+
if (folderOptions is { Exclude: true })
39+
{
40+
_logger.LogInformation("Skipping excluded folder {Folder}", folder.FullName);
41+
continue;
42+
}
43+
44+
_logger.LogInformation("Processing folder {Folder}", folder.FullName);
3145

3246
var archiveFolder = "";
3347
if (account.BasePathInArchive != null && account.BasePathInArchive.Trim().TrimEnd('/') != string.Empty)
@@ -38,34 +52,60 @@ public async Task ImportFromServer(string accountFilename, ImportProgress progre
3852
else
3953
archiveFolder += folder.FullName;
4054

55+
_logger.LogDebug("Archive folder path: {ArchiveFolder}", archiveFolder);
56+
4157
ct.ThrowIfCancellationRequested();
4258

4359
progress.Report(new ProgressData(InfoMessage: "Import running", CurrentFolder: folder.FullName));
4460

4561
var folderAccess = await folder.OpenAsync(FolderAccess.ReadWrite, ct);
62+
4663
var msgUids = await folder.SearchAsync(SearchQuery.All, ct);
64+
_logger.LogDebug("Found {MessageCount} messages in folder {Folder}", msgUids.Count, folder.FullName);
65+
4766
var messageSummaries = await folder.FetchAsync(msgUids,
4867
MessageSummaryItems.InternalDate | MessageSummaryItems.Headers, ct);
4968
var messageToDeleteIds = new List<UniqueId>();
5069
var messagesOnServer = new List<string>();
5170

5271
var deleteAfterDays = account.DeleteAfterDays;
5372
if (folderOptions?.DeleteAfterDays is { } folderSpecificDeleteAfterDays)
73+
{
5474
deleteAfterDays = folderSpecificDeleteAfterDays;
75+
_logger.LogDebug("Using folder-specific delete policy: {DeleteAfterDays} days", deleteAfterDays);
76+
}
77+
else
78+
{
79+
_logger.LogDebug("Using account-level delete policy: {DeleteAfterDays} days", deleteAfterDays);
80+
}
5581

82+
_logger.LogInformation("Processing {MessageCount} messages in folder {Folder}", messageSummaries.Count, folder.FullName);
83+
84+
int processedCount = 0;
5685
foreach (var messageSummary in messageSummaries)
5786
{
5887
ct.ThrowIfCancellationRequested();
5988

89+
_logger.LogDebug("Processing message UID {Uid} with InternalDate {Date}", messageSummary.UniqueId, messageSummary.InternalDate);
90+
6091
using var hmsg = new MimeMessage(messageSummary.Headers);
6192
hmsg.Date = (DateTimeOffset)messageSummary.InternalDate!;
6293
var headerMsg = await MailParser.Construct(hmsg, archiveFolder, ct);
94+
_logger.LogDebug("Parsed message header: Subject={Subject}, From={From}, Hash={Hash}",
95+
hmsg.Subject ?? "<no subject>", hmsg.From.ToString(), headerMsg.Hash);
96+
6397
progress.Report(new ProgressData(ParsedMessageCount: progress.ParsedMessageCount + 1));
6498

6599
// mark message to be deleted if meets the deletion date.
66100
// delete will only be executed if whole folder is processed successfully.
67101
if (deleteAfterDays > 0 && Math.Abs((headerMsg.Date - DateTime.Now).TotalDays) > deleteAfterDays)
102+
{
103+
_logger.LogDebug("Message UID {Uid} marked for deletion (age: {DaysOld} days, threshold: {DeleteAfterDays})",
104+
messageSummary.UniqueId,
105+
Math.Abs((headerMsg.Date - DateTime.Now).TotalDays),
106+
deleteAfterDays);
68107
messageToDeleteIds.Add(messageSummary.UniqueId);
108+
}
69109
else
70110
messagesOnServer.Add(headerMsg.Hash);
71111

@@ -74,60 +114,90 @@ public async Task ImportFromServer(string accountFilename, ImportProgress progre
74114
.FirstOrDefaultAsync(msg => msg.Hash == headerMsg.Hash, ct);
75115
if (existingMsg != null)
76116
{
117+
_logger.LogDebug("Message UID {Uid} already exists in archive with ID {MsgId}", messageSummary.UniqueId, existingMsg.Id);
118+
77119
// check if message is now in different folder on the server
78120
// if yes, move in archive
79121
if (existingMsg.Folder != archiveFolder)
80122
{
123+
_logger.LogDebug("Moving message {MsgId} from folder '{OldFolder}' to '{NewFolder}'",
124+
existingMsg.Id, existingMsg.Folder, archiveFolder);
125+
81126
var oldEmlPath = messageHelperService.GetEmlPath(existingMsg);
82127
existingMsg.Folder = archiveFolder;
83128
var newEmlPath = messageHelperService.GetEmlPath(existingMsg);
84129
var dirName = Path.GetDirectoryName(newEmlPath);
85130
Directory.CreateDirectory(dirName!);
86131
File.Move(oldEmlPath, newEmlPath);
87132
await context.SaveChangesAsync(CancellationToken.None);
133+
134+
_logger.LogDebug("Message moved successfully from {OldPath} to {NewPath}", oldEmlPath, newEmlPath);
88135
}
89136

90137
continue;
91138
}
92139

140+
_logger.LogDebug("Downloading full message UID {Uid} from server", messageSummary.UniqueId);
93141
using var msg = await folder.GetMessageAsync(messageSummary.UniqueId, ct);
94142
msg.Date = (DateTimeOffset)messageSummary.InternalDate;
95143

96144
var saved = await messageHelperService.SaveMessage(msg, folder.FullName, ct);
97145
progress.Report(new ProgressData(ParsedMessageCount: progress.ParsedMessageCount + 1));
98146

99-
100147
if (saved)
148+
{
149+
_logger.LogDebug("Message UID {Uid} successfully saved to archive", messageSummary.UniqueId);
101150
progress.Report(new ProgressData(ImportedMessageCount: progress.ImportedMessageCount + 1));
151+
}
152+
else
153+
{
154+
_logger.LogError("Message UID {Uid} was not saved - should not happen since duplicate is checked before", messageSummary.UniqueId);
155+
}
156+
157+
processedCount++;
102158
}
103159

160+
_logger.LogInformation("Completed processing {ProcessedCount} messages in folder {Folder}", processedCount, folder.FullName);
161+
104162
// delete messages marked for deletion.
105163
if (messageToDeleteIds.Count > 0)
106164
{
107165
#if DEBUG
108-
_logger.LogInformation("Debug mode, not deleting on server");
166+
_logger.LogInformation("Debug mode active, not deleting {DeleteCount} messages on server", messageToDeleteIds.Count);
109167
#else
168+
_logger.LogInformation("Deleting {DeleteCount} messages from server folder {Folder}", messageToDeleteIds.Count, folder.FullName);
169+
foreach (var id in messageToDeleteIds)
170+
_logger.LogDebug("Deleting message with UID {Uid}", id);
171+
110172
await folder.AddFlagsAsync(messageToDeleteIds, MessageFlags.Deleted, true, ct);
111173
await folder.ExpungeAsync(ct);
174+
_logger.LogDebug("Deletion and expunge completed for folder {Folder}", folder.FullName);
112175
#endif
113176
progress.Report(new ProgressData(
114177
RemoteMessagesDeletedCount: progress.RemoteMessagesDeletedCount + messageToDeleteIds.Count));
115178
}
116179

117180
if (folderOptions is { SyncServerFolder: true })
118181
{
182+
_logger.LogDebug("Syncing folder {Folder} - checking for messages to delete locally", folder.FullName);
183+
119184
var msgsToDelete = context.MailMessages.Where(msg =>
120185
messagesOnServer.All(onServer => msg.Hash != onServer) && msg.Folder == folder.FullName)
121186
.ToArray();
187+
188+
_logger.LogDebug("Found {DeleteCount} messages in archive not present on server", msgsToDelete.Length);
189+
122190
if (msgsToDelete is { Length: > 0 })
123191
{
124192
var deletedMessages = new List<MailMessage>();
125193
foreach (var msg in msgsToDelete)
126194
try
127195
{
196+
_logger.LogDebug("Deleting local message {MsgId} (Hash: {Hash})", msg.Id, msg.Hash);
128197
var emlPath = messageHelperService.GetEmlPath(msg);
129198
File.Delete(emlPath);
130199
deletedMessages.Add(msg);
200+
_logger.LogDebug("Deleted file {FilePath}", emlPath);
131201
}
132202
catch (Exception ex)
133203
{
@@ -136,6 +206,8 @@ public async Task ImportFromServer(string accountFilename, ImportProgress progre
136206

137207
context.MailMessages.RemoveRange(deletedMessages);
138208
await context.SaveChangesAsync(CancellationToken.None);
209+
_logger.LogInformation("Removed {DeleteCount} messages from database", deletedMessages.Count);
210+
139211
progress.Report(new ProgressData(
140212
LocalMessagesDeletedCount: progress.LocalMessagesDeletedCount + deletedMessages.Count));
141213
}
@@ -147,6 +219,7 @@ public async Task ImportFromServer(string accountFilename, ImportProgress progre
147219
finally
148220
{
149221
await context.SaveChangesAsync(ct);
222+
_logger.LogDebug("Final SaveChangesAsync completed");
150223
}
151224
}
152225
}

SimpleMailArchiver/SimpleMailArchiver/appsettings.Development.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"Logging": {
33
"LogLevel": {
4-
"Default": "Information",
4+
"Default": "Debug",
55
"Microsoft.AspNetCore": "Warning"
66
}
77
}

0 commit comments

Comments
 (0)