88using MailKitSimplified . Receiver . Extensions ;
99using MailKitSimplified . Receiver . Services ;
1010using MailKitSimplified . Sender . Abstractions ;
11+ using MailKitSimplified . Sender . Models ;
12+ using Microsoft . Extensions . Options ;
1113
1214namespace ExampleNamespace ;
1315
@@ -47,8 +49,8 @@ protected override async Task ExecuteAsync(CancellationToken cancellationToken =
4749 //await GetMailFolderCacheAsync();
4850 //await CreateFolderAndMoveTopOneAsync();
4951 //await MonitorAsync(cancellationToken);
50- //await MonitorMoveAsync( cancellationToken);
51- // await MoveToAsync("Process", 2, cancellationToken);
52+ //await MoveToAsync(_processed, 1, cancellationToken);
53+ await MonitorMoveAsync ( cancellationToken ) ;
5254 }
5355
5456 private static ImapReceiver CreateExchangeOAuth2ImapClientExample ( SaslMechanismOAuth2 oauth2 )
@@ -84,8 +86,9 @@ private async Task MailFolderMonitorMoveFolderAsync(string destinationFolderFull
8486 {
8587 using var mailFolderClient = _serviceScope . ServiceProvider . GetRequiredService < IMailFolderClient > ( ) ;
8688 var mailFolderMonitorFactory = _serviceScope . ServiceProvider . GetRequiredService < IMailFolderMonitorFactory > ( ) ;
89+ var destinationFolder = await mailFolderClient . GetFolderAsync ( _processed , createIfNotFound : true , cancellationToken ) ;
8790 async Task UniqueIdArrivedAsync ( IMessageSummary messageSummary ) =>
88- await mailFolderClient . MoveToAsync ( messageSummary , destinationFolderFullName , cancellationToken ) ;
91+ await mailFolderClient . MoveToAsync ( messageSummary , destinationFolder , cancellationToken ) ;
8992 await mailFolderMonitorFactory . MonitorAllMailboxesAsync ( UniqueIdArrivedAsync , cancellationToken ) ;
9093 }
9194
@@ -132,7 +135,8 @@ private async Task MoveSeenToSentAsync(CancellationTokenSource cancellationToken
132135 private async Task AddToDraftFolderAsync ( )
133136 {
134137 using var smtpSender = _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
135- var mimeMessage = CreateTemplate ( smtpSender ) . MimeMessage ;
138+ var options = _serviceScope . ServiceProvider . GetRequiredService < IOptions < EmailWorkerOptions > > ( ) . Value ;
139+ var mimeMessage = CreateTemplate ( smtpSender , options . DefaultFromAddress , options . DefaultToAddress ) . MimeMessage ;
136140 var draftsFolder = _imapReceiver . MailFolderClient . DraftsFolder ;
137141 var uniqueId = await draftsFolder . AppendAsync ( mimeMessage ) ;
138142 _logger . LogInformation ( $ "Added mime message to { _imapReceiver } { draftsFolder . FullName } folder as #{ uniqueId } .") ;
@@ -144,7 +148,7 @@ private async Task MoveTopOneToFolderAsync(IMailFolderClient mailFolderClient, s
144148 var uniqueId = await mailFolderClient . MoveToAsync ( messageSummary , destinationFolderFullName , cancellationToken ) ;
145149 //var destinationFolder = await mailFolderClient.GetFolderAsync([destinationFolderFullName], cancellationToken);
146150 //var uniqueId = await messageSummary.MoveToAsync(destinationFolder, cancellationToken);
147- _logger . LogInformation ( $ "Moved { _imapReceiver } mime message { messageSummary . UniqueId } to { destinationFolderFullName } folder as #{ uniqueId } .") ;
151+ _logger . LogInformation ( $ "Moved { _imapReceiver } mime message # { messageSummary . UniqueId } to { destinationFolderFullName } folder as #{ uniqueId } .") ;
148152 }
149153
150154 private async Task CreateFolderAndMoveTopOneAsync ( string mailFolderFullName = _processed , CancellationToken cancellationToken = default )
@@ -157,19 +161,6 @@ private async Task CreateFolderAndMoveTopOneAsync(string mailFolderFullName = _p
157161 await MoveTopOneToFolderAsync ( mailFolderClient , mailFolderFullName , cancellationToken ) ;
158162 }
159163
160- private async Task GetMailFolderCacheAsync ( string mailFolderFullName = _processed , CancellationToken cancellationToken = default )
161- {
162- using var mailFolderClient = _serviceScope . ServiceProvider . GetRequiredService < IMailFolderClient > ( ) ;
163- var mailFolderCache = _serviceScope . ServiceProvider . GetRequiredService < IMailFolderCache > ( ) ;
164- var folder = await mailFolderCache . GetMailFolderAsync ( _imapReceiver , mailFolderFullName , createIfMissing : true , cancellationToken ) ;
165- _logger . LogInformation ( folder . FullName ) ;
166- var messageSummary = await GetTopMessageSummaryAsync ( cancellationToken ) ;
167- var uniqueId = await mailFolderCache . MoveToAsync ( _imapReceiver , messageSummary , mailFolderFullName , cancellationToken ) ;
168- //var destinationFolder = await mailFolderClient.GetFolderAsync([destinationFolderFullName], cancellationToken);
169- //var uniqueId = await messageSummary.MoveToAsync(destinationFolder, cancellationToken);
170- _logger . LogInformation ( $ "Moved { _imapReceiver } mime message #{ messageSummary . UniqueId } to { mailFolderFullName } folder as #{ uniqueId } .") ;
171- }
172-
173164 public async Task GetMailFolderAsync ( string mailFolderFullName , CancellationToken cancellationToken = default )
174165 {
175166 var messageSummary = await GetTopMessageSummaryAsync ( cancellationToken ) ;
@@ -394,14 +385,15 @@ private async Task QueryAsync(CancellationToken cancellationToken = default)
394385 _logger . LogInformation ( $ "{ _imapReceiver } received { messageSummaries . Count } email(s) in { stopwatch . Elapsed . TotalSeconds : n1} s: { messageSummaries . Select ( m => m . UniqueId ) . ToEnumeratedString ( ) } .") ;
395386 }
396387
397- private IEmailWriter CreateTemplate ( ISmtpSender smtpSender , string from = "[email protected] " ) 388+ private IEmailWriter CreateTemplate ( ISmtpSender smtpSender , string from = "[email protected] " , string ? to = null ) 398389 {
399390 if ( ! from . IsEmail ( ) )
400391 _logger . LogWarning ( $ "{ from } is not a valid email.") ;
401392 var id = $ "{ Guid . NewGuid ( ) : N} "[ ..8 ] ;
393+ to ??= $ "{ id } @localhost";
402394 var template = smtpSender . WriteEmail
403395 . From ( from )
404- . To ( $ " { id } @localhost" )
396+ . To ( to )
405397 . Subject ( id )
406398 . BodyText ( "text/plain." )
407399 . BodyHtml ( "text/html." )
@@ -412,9 +404,10 @@ private IEmailWriter CreateTemplate(ISmtpSender smtpSender, string from = "me@ex
412404 private async Task TemplateSendAsync ( byte numberToSend = 1 , CancellationToken cancellationToken = default )
413405 {
414406 using var smtpSender = _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
407+ var options = _serviceScope . ServiceProvider . GetRequiredService < IOptions < EmailWorkerOptions > > ( ) . Value ;
415408 //var template = await GetTemplate().SaveTemplateAsync();
416409 //var template = await smtpSender.WithTemplateAsync();
417- var template = CreateTemplate ( smtpSender ) ;
410+ var template = CreateTemplate ( smtpSender , options . DefaultFromAddress , options . DefaultToAddress ) ;
418411 int count = 0 ;
419412 do
420413 {
@@ -428,19 +421,21 @@ private async Task TemplateSendAsync(byte numberToSend = 1, CancellationToken ca
428421 private async Task SendAttachmentAsync ( int millisecondsDelay , string filePath = "..\\ ..\\ README.md" , CancellationToken cancellationToken = default )
429422 {
430423 using var smtpSender = _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
431- bool isSent = await CreateTemplate ( smtpSender )
424+ var options = _serviceScope . ServiceProvider . GetRequiredService < IOptions < EmailWorkerOptions > > ( ) . Value ;
425+ bool isSent = await CreateTemplate ( smtpSender , options . DefaultFromAddress , options . DefaultToAddress )
432426 . TryAttach ( filePath )
433427 . TrySendAsync ( cancellationToken ) ;
434428 _logger . LogInformation ( $ "Email { ( isSent ? "sent" : "failed to send" ) } .") ;
435429 await Task . Delay ( millisecondsDelay , cancellationToken ) ;
436430 }
437431
438- private async Task DelayedSendAsync ( int millisecondsDelay , ISmtpSender ? smtpSender = null , CancellationToken cancellationToken = default )
432+ private async Task DelayedSendAsync ( TimeSpan delay , ISmtpSender ? smtpSender = null , CancellationToken cancellationToken = default )
439433 {
440434 var temporarySender = smtpSender == null ;
441435 smtpSender ??= _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
442- await Task . Delay ( millisecondsDelay , cancellationToken ) ;
443- smtpSender . Enqueue ( CreateTemplate ( smtpSender ) . MimeMessage ) ;
436+ var options = _serviceScope . ServiceProvider . GetRequiredService < IOptions < EmailWorkerOptions > > ( ) . Value ;
437+ await Task . Delay ( delay , cancellationToken ) ;
438+ smtpSender . Enqueue ( CreateTemplate ( smtpSender , options . DefaultFromAddress , options . DefaultToAddress ) . MimeMessage ) ;
444439 //bool isSent = await CreateTemplate(smtpSender).TrySendAsync(cancellationToken);
445440 //_logger.LogInformation($"Email {(isSent ? "sent" : "failed to send")}.");
446441 if ( temporarySender ) smtpSender . Dispose ( ) ;
@@ -450,7 +445,7 @@ private async Task NotReentrantAsync(CancellationToken cancellationToken = defau
450445 {
451446 using var cancellationTokenSource = CancellationTokenSource . CreateLinkedTokenSource ( cancellationToken ) ;
452447 using var smtpSender = _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
453- var sendTask = DelayedSendAsync ( 500 , smtpSender , cancellationToken ) ;
448+ var sendTask = DelayedSendAsync ( TimeSpan . FromMilliseconds ( 500 ) , smtpSender , cancellationToken ) ;
454449 var newestEmail = await GetNewestMessageSummaryAsync ( ) ;
455450 await _imapReceiver . MonitorFolder . SetMessageSummaryItems ( )
456451 . SetIgnoreExistingMailOnConnect ( )
@@ -487,11 +482,10 @@ private async Task MonitorMoveAsync(CancellationToken cancellationToken = defaul
487482 using var cancellationTokenSource = CancellationTokenSource . CreateLinkedTokenSource ( cancellationToken ) ;
488483 using var smtpSender = _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
489484 using var mailFolderClient = _serviceScope . ServiceProvider . GetRequiredService < IMailFolderClient > ( ) ;
490- int delayMs = 1000 ;
491485 var sendTasks = new List < Task > ( ) ;
492486 for ( int waitCount = 1 ; waitCount <= 2 ; waitCount ++ )
493487 {
494- var sendTask = DelayedSendAsync ( waitCount * delayMs , smtpSender , cancellationToken ) ;
488+ var sendTask = DelayedSendAsync ( TimeSpan . FromSeconds ( waitCount + 4 ) , smtpSender , cancellationToken ) ;
495489 sendTasks . Add ( sendTask ) ;
496490 }
497491 var destinationFolder = await mailFolderClient . GetFolderAsync ( _processed , createIfNotFound : true , cancellationToken ) ;
@@ -505,18 +499,18 @@ await _imapReceiver.MonitorFolder
505499
506500 async Task ProcessMessageAsync ( IMessageSummary messageSummary )
507501 {
508- var uniqueId = await mailFolderClient . MoveToAsync ( messageSummary . UniqueId , destinationFolder , cancellationToken ) ;
502+ var uniqueId = await mailFolderClient . MoveToAsync ( messageSummary , destinationFolder , cancellationToken ) ;
509503 if ( uniqueId == null )
510504 _logger . LogInformation ( $ "{ _imapReceiver } message #{ messageSummary . UniqueId } not moved to [{ _processed } ], UniqueId is null.") ;
511505 else
512- _logger . LogDebug ( $ "{ _imapReceiver } message #{ messageSummary . UniqueId } moved to [{ _processed } ] { uniqueId } .") ;
506+ _logger . LogDebug ( $ "{ _imapReceiver } message #{ messageSummary . UniqueId } moved to [{ _processed } ] # { uniqueId } .") ;
513507 }
514508 }
515509
516510 private async Task MonitorAsync ( CancellationToken cancellationToken = default )
517511 {
518512 using var smtpSender = _serviceScope . ServiceProvider . GetRequiredService < ISmtpSender > ( ) ;
519- var sendTask = DelayedSendAsync ( 500 , smtpSender , cancellationToken ) ;
513+ var sendTask = DelayedSendAsync ( TimeSpan . FromMilliseconds ( 500 ) , smtpSender , cancellationToken ) ;
520514 void ProcessMessage ( IMessageSummary messageSummary ) =>
521515 _logger . LogInformation ( $ "{ _imapReceiver } message #{ messageSummary . UniqueId } processed.") ;
522516 await _imapReceiver . MonitorFolder
0 commit comments