private async Task OnMessageReceived(object sender, MessageEventArgs e) { Message message = new MessageConverter().ConvertAsync(e.Message).Result; Console.WriteLine($"Message received. Client address {e.Message.Session.ClientAddress}. From {e.Message.From}. To {message.To}."); message.IsUnread = true; await taskQueue.QueueTask(() => { Console.WriteLine("Processing received message"); using var scope = serviceScopeFactory.CreateScope(); Smtp4devDbContext dbContext = scope.ServiceProvider.GetService <Smtp4devDbContext>(); Dictionary <MailboxAddress, Exception> relayErrors = TryRelayMessage(message, null); message.RelayError = string.Join("\n", relayErrors.Select(e => e.Key.ToString() + ": " + e.Value.Message)); ImapState imapState = dbContext.ImapState.Single(); imapState.LastUid = Math.Max(0, imapState.LastUid + 1); message.ImapUid = imapState.LastUid; message.Session = dbContext.Sessions.Find(activeSessionsToDbId[e.Message.Session]); dbContext.Messages.Add(message); dbContext.SaveChanges(); TrimMessages(dbContext); dbContext.SaveChanges(); notificationsHub.OnMessagesChanged().Wait(); Console.WriteLine("Processing received message DONE"); }, false).ConfigureAwait(false); }
private async Task OnMessageReceived(object sender, MessageEventArgs e) { Message message = new MessageConverter().ConvertAsync(e.Message).Result; log.Information("Message received. Client address {clientAddress}. From {messageFrom}. To {messageTo}.", e.Message.Session.ClientAddress, e.Message.From, message.To); message.IsUnread = true; await taskQueue.QueueTask(() => { log.Information("Processing received message"); using var scope = serviceScopeFactory.CreateScope(); Smtp4devDbContext dbContext = scope.ServiceProvider.GetService <Smtp4devDbContext>(); var relayResult = TryRelayMessage(message, null); message.RelayError = string.Join("\n", relayResult.Exceptions.Select(e => e.Key + ": " + e.Value.Message)); ImapState imapState = dbContext.ImapState.Single(); imapState.LastUid = Math.Max(0, imapState.LastUid + 1); message.ImapUid = imapState.LastUid; message.Session = dbContext.Sessions.Find(activeSessionsToDbId[e.Message.Session]); if (relayResult.WasRelayed) { foreach (var relay in relayResult.RelayRecipients) { message.AddRelay(new MessageRelay { SendDate = DateTime.UtcNow, To = relay.Email }); } } dbContext.Messages.Add(message); dbContext.SaveChanges(); TrimMessages(dbContext); dbContext.SaveChanges(); notificationsHub.OnMessagesChanged().Wait(); log.Information("Processing received message DONE"); }, false).ConfigureAwait(false); }