Esempio n. 1
0
        public async Task GetMessage_ValidMime()
        {
            DateTime startDate = DateTime.Now;

            DbModel.Message testMessage1 = await GetTestMessage1();

            TestMessagesRepository messagesRepository = new TestMessagesRepository(testMessage1);
            MessagesController     messagesController = new MessagesController(messagesRepository);

            ApiModel.Message result = messagesController.GetMessage(testMessage1.Id);

            Assert.Null(result.MimeParseError);
            Assert.Equal(testMessage1.Id, result.Id);
            Assert.InRange(result.ReceivedDate, startDate, DateTime.Now);
            Assert.Equal("*****@*****.**", result.From);
            Assert.Equal("*****@*****.**", result.To);
            Assert.Equal("*****@*****.**", result.Bcc);
            Assert.Equal("*****@*****.**", result.Cc);
            Assert.Equal("subject", result.Subject);

            var allParts = result.Parts.Flatten(p => p.ChildParts).ToList();

            Assert.Equal(6, allParts.Count);


            Assert.All(allParts, p => {
                Assert.Equal(testMessage1.Id, p.MessageId);
                Assert.NotNull(p.Id);
                Assert.NotEqual("", p.Id);
            });

            //All parts have a unique Id
            Assert.Equal(allParts.Count, allParts.Select(p => p.Id).Distinct().Count());
        }
Esempio n. 2
0
        public RelayResult TryRelayMessage(Message message, MailboxAddress[] overrideRecipients)
        {
            var result = new RelayResult(message);

            if (!relayOptions.CurrentValue.IsEnabled)
            {
                return(result);
            }

            MailboxAddress[] recipients;

            if (overrideRecipients == null)
            {
                recipients = message.To
                             .Split(",")
                             .Select(r => MailboxAddress.Parse(r))
                             .Where(r => relayOptions.CurrentValue.AutomaticEmails.Contains(r.Address, StringComparer.OrdinalIgnoreCase))
                             .ToArray();
            }
            else
            {
                recipients = overrideRecipients;
            }

            foreach (MailboxAddress recipient in recipients)
            {
                try
                {
                    log.Information("Relaying message to {recipient}", recipient);

                    using SmtpClient relaySmtpClient = relaySmtpClientFactory(relayOptions.CurrentValue);
                    var            apiMsg   = new ApiModel.Message(message);
                    MimeMessage    newEmail = apiMsg.MimeMessage;
                    MailboxAddress sender   = MailboxAddress.Parse(
                        !string.IsNullOrEmpty(relayOptions.CurrentValue.SenderAddress)
                            ? relayOptions.CurrentValue.SenderAddress
                            : apiMsg.From);
                    relaySmtpClient.Send(newEmail, sender, new[] { recipient });
                    result.RelayRecipients.Add(new RelayRecipientResult()
                    {
                        Email = recipient.Address, RelayDate = DateTime.UtcNow
                    });
                }
                catch (Exception e)
                {
                    log.Error(e, "Can not relay message to {recipient}: {errorMessage}", recipient, e.ToString());
                    result.Exceptions[recipient] = e;
                }
            }

            return(result);
        }
Esempio n. 3
0
        public Dictionary <MailboxAddress, Exception> TryRelayMessage(Message message, MailboxAddress[] overrideRecipients)
        {
            Dictionary <MailboxAddress, Exception> result = new Dictionary <MailboxAddress, Exception>();

            if (!relayOptions.CurrentValue.IsEnabled)
            {
                return(result);
            }

            MailboxAddress[] recipients;

            if (overrideRecipients == null)
            {
                recipients = message.To
                             .Split(",")
                             .Select(r => MailboxAddress.Parse(r))
                             .Where(r => relayOptions.CurrentValue.AutomaticEmails.Contains(r.Address, StringComparer.OrdinalIgnoreCase))
                             .ToArray();
            }
            else
            {
                recipients = overrideRecipients;
            }

            foreach (MailboxAddress recipient in recipients)
            {
                try
                {
                    Console.WriteLine($"Relaying message to {recipient}");

                    using (SmtpClient relaySmtpClient = relaySmtpClientFactory(relayOptions.CurrentValue))
                    {
                        var            apiMsg   = new ApiModel.Message(message);
                        MimeMessage    newEmail = apiMsg.MimeMessage;
                        MailboxAddress sender   = MailboxAddress.Parse(
                            !string.IsNullOrEmpty(relayOptions.CurrentValue.SenderAddress)
                            ? relayOptions.CurrentValue.SenderAddress
                            : apiMsg.From);
                        relaySmtpClient.Send(newEmail, sender, new[] { recipient });
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Can not relay message to {recipient}: {e.ToString()}");
                    result[recipient] = e;
                }
            }

            return(result);
        }
Esempio n. 4
0
            private void Session_Fetch(object sender, IMAP_e_Fetch e)
            {
                foreach (var msgInfo in e.MessagesInfo)
                {
                    var dbMessage = this.messagesRepository.GetMessages().FirstOrDefault(m => m.Id == new Guid(msgInfo.ID));

                    if (dbMessage != null)
                    {
                        ApiModel.Message apiMessage = new ApiModel.Message(dbMessage);
                        Mail_Message     message    = Mail_Message.ParseFromByte(apiMessage.Data);
                        e.AddData(msgInfo, message);
                    }
                }
            }
Esempio n. 5
0
            private void Session_Fetch(object sender, IMAP_e_Fetch e)
            {
                using (var scope = this.serviceScopeFactory.CreateScope())
                {
                    var messagesRepository = scope.ServiceProvider.GetService <IMessagesRepository>();

                    foreach (var msgInfo in e.MessagesInfo)
                    {
                        var dbMessage = messagesRepository.GetMessages().SingleOrDefault(m => m.Id == new Guid(msgInfo.ID));

                        if (dbMessage != null)
                        {
                            ApiModel.Message apiMessage = new ApiModel.Message(dbMessage);
                            Mail_Message     message    = Mail_Message.ParseFromByte(apiMessage.Data);
                            e.AddData(msgInfo, message);
                        }
                    }
                }
            }
Esempio n. 6
0
        public async Task <DbModel.Message> ConvertAsync(Stream messageData, string envelopeFrom, string envelopeTo)
        {
            string subject        = "";
            string mimeParseError = null;

            byte[] data = new byte[messageData.Length];
            await messageData.ReadAsync(data, 0, data.Length);


            bool foundHeaders   = false;
            bool foundSeparator = false;

            using (StreamReader dataReader = new StreamReader(new MemoryStream(data)))
            {
                while (!dataReader.EndOfStream)
                {
                    if (dataReader.ReadLine().Length != 0)
                    {
                        foundHeaders = true;
                    }
                    else
                    {
                        foundSeparator = true;
                        break;
                    }
                }
            }

            if (!foundHeaders || !foundSeparator)
            {
                mimeParseError = "Malformed MIME message. No headers found";
            }
            else
            {
                messageData.Seek(0, SeekOrigin.Begin);
                try
                {
                    CancellationTokenSource cts = new CancellationTokenSource();
                    cts.CancelAfter(TimeSpan.FromSeconds(10));
                    MimeMessage mime = await MimeMessage.LoadAsync(messageData, true, cts.Token).ConfigureAwait(false);

                    subject = mime.Subject;
                }
                catch (OperationCanceledException e)
                {
                    mimeParseError = e.Message;
                }
                catch (FormatException e)
                {
                    mimeParseError = e.Message;
                }
            }


            DbModel.Message message = new DbModel.Message()
            {
                Id = Guid.NewGuid(),

                From            = PunyCodeReplacer.DecodePunycode(envelopeFrom),
                To              = PunyCodeReplacer.DecodePunycode(envelopeTo),
                ReceivedDate    = DateTime.Now,
                Subject         = PunyCodeReplacer.DecodePunycode(subject),
                Data            = data,
                MimeParseError  = mimeParseError,
                AttachmentCount = 0
            };

            var parts = new ApiModel.Message(message).Parts;

            foreach (var part in parts)
            {
                message.AttachmentCount += CountAttachments(part);
            }


            return(message);
        }