示例#1
0
        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);
        }
示例#2
0
        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);
        }