Skip to content

Commit d03f07a

Browse files
committed
Fixed cached source folder in move method #70
1 parent d0acdd1 commit d03f07a

File tree

8 files changed

+138
-89
lines changed

8 files changed

+138
-89
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace MailKitSimplified.Sender.Models
2+
{
3+
public class EmailWorkerOptions
4+
{
5+
public const string SectionName = "EmailWorker";
6+
7+
public string DefaultFromAddress { get; set; } = "noreply@localhost";
8+
public string DefaultToAddress { get; set; } = "noreply@localhost";
9+
}
10+
}

samples/WorkerServiceExample/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using MailKitSimplified.Sender;
22
using MailKitSimplified.Receiver;
3+
using MailKitSimplified.Sender.Models;
34

45
IHost host = Host.CreateDefaultBuilder(args)
56
.ConfigureServices((context, services) =>
@@ -8,6 +9,8 @@
89
//services.AddMailKitSimplifiedEmail(context.Configuration);
910
services.AddScopedMailKitSimplifiedEmailSender(context.Configuration);
1011
services.AddScopedMailKitSimplifiedEmailReceiver(context.Configuration);
12+
var workerSection = context.Configuration.GetRequiredSection(EmailWorkerOptions.SectionName);
13+
services.Configure<EmailWorkerOptions>(workerSection);
1114
})
1215
.Build();
1316

samples/WorkerServiceExample/Worker.cs

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
using MailKitSimplified.Receiver.Extensions;
99
using MailKitSimplified.Receiver.Services;
1010
using MailKitSimplified.Sender.Abstractions;
11+
using MailKitSimplified.Sender.Models;
12+
using Microsoft.Extensions.Options;
1113

1214
namespace 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

samples/WorkerServiceExample/appsettings.Development.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
"ImapHost": "localhost",
88
"ImapPort": 143
99
},
10+
"EmailWorker": {
11+
"DefaultFromAddress": "[email protected]",
12+
"DefaultToAddress": "[email protected]"
13+
},
1014
"Mailbox": {
1115
"EmailReceivers": [
1216
{

0 commit comments

Comments
 (0)