@@ -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}
0 commit comments