Beispiel #1
0
        private async Task HandleData()
        {
            await SendLine("354 OK, send");

            _connection.SetTimeout(_configuration.DataCommandTimeout);

            using (var target = new MemoryStreamWithFileBacking(DataTransferMemoryBufferMaxSize, _configuration.TempDirectory))
            {
                var transmissionBuffer = new TransmissionBuffer(target);

                while (!transmissionBuffer.TransmissionEnded)
                {
                    using (var maildata = await _connection.Read())
                    {
                        maildata.Seek(0, SeekOrigin.Begin);

                        transmissionBuffer.Append(maildata);
                    }
                }

                transmissionBuffer.Flush();

                var commandResult = await _commandHandler.HandleData(target);

                await SendCommandResult(commandResult);

                _state.HasMailFrom = false;
                _state.HasRcptTo   = false;
            }
        }
        public void MemoryShouldBeFlushedWhenBufferLimitExceeded()
        {
            using (var bufferedFileStream = new MemoryStreamWithFileBacking(4))
            {
                bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
                bufferedFileStream.Flush();

                Assert.IsTrue(File.Exists(bufferedFileStream.BackingFilePath));
            }
        }
 public void WhenSwappingFromMemoryBufferToFileBufferMemoryBufferShouldBeMigrated()
 {
     using (var bufferedFileStream = new MemoryStreamWithFileBacking(6))
     {
         bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
         bufferedFileStream.Write(Encoding.UTF8.GetBytes(" WORLD"), 0, 6);
         bufferedFileStream.Flush();
         Assert.IsTrue(File.Exists(bufferedFileStream.BackingFilePath));
     }
 }
Beispiel #4
0
 public void WhenSwappingFromMemoryBufferToFileBufferMemoryBufferShouldBeMigrated()
 {
     using (var bufferedFileStream = new MemoryStreamWithFileBacking(6))
     {
         bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
         bufferedFileStream.Write(Encoding.UTF8.GetBytes(" WORLD"), 0, 6);
         bufferedFileStream.Flush();
         Assert.IsTrue(File.Exists(bufferedFileStream.BackingFilePath));
     }
 }
Beispiel #5
0
        public void MemoryShouldBeFlushedWhenBufferLimitExceeded()
        {
            using (var bufferedFileStream = new MemoryStreamWithFileBacking(4))
            {
                bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
                bufferedFileStream.Flush();

                Assert.IsTrue(File.Exists(bufferedFileStream.BackingFilePath));
            }
        }
Beispiel #6
0
        public void MemoryShouldNotBeFlushUntilBufferLimitReached()
        {
            using (var bufferedFileStream = new MemoryStreamWithFileBacking(6))
            {
                bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
                bufferedFileStream.Flush();

                Assert.IsFalse(File.Exists(bufferedFileStream.BackingFilePath));
            }
        }
        public void MemoryShouldNotBeFlushUntilBufferLimitReached()
        {
            using (var bufferedFileStream = new MemoryStreamWithFileBacking(6))
            {
                bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
                bufferedFileStream.Flush();
                
                Assert.IsFalse(File.Exists(bufferedFileStream.BackingFilePath));
            }

        }
        public void BackingFileShouldBeRemovedWhenDisposed()
        {
            string backingFileName;

            using (var bufferedFileStream = new MemoryStreamWithFileBacking(1))
            {
                bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
                bufferedFileStream.Flush();

                backingFileName = bufferedFileStream.BackingFilePath;

                Assert.IsTrue(File.Exists(backingFileName));
            }

            Assert.IsFalse(File.Exists(backingFileName));
        }
Beispiel #9
0
        public void BackingFileShouldBeRemovedWhenDisposed()
        {
            string backingFileName;

            using (var bufferedFileStream = new MemoryStreamWithFileBacking(1))
            {
                bufferedFileStream.Write(Encoding.UTF8.GetBytes("HELLO"), 0, 5);
                bufferedFileStream.Flush();

                backingFileName = bufferedFileStream.BackingFilePath;

                Assert.IsTrue(File.Exists(backingFileName));
            }

            Assert.IsFalse(File.Exists(backingFileName));
        }
        private async Task HandleData()
        {
            await SendLine("354 OK, send");

            _connection.SetTimeout(_configuration.DataCommandTimeout);

            using (var target = new MemoryStreamWithFileBacking(DataTransferMemoryBufferMaxSize, _configuration.TempDirectory))
            {
                var transmissionBuffer = new TransmissionBuffer(target);

                while (!transmissionBuffer.TransmissionEnded)
                {
                    using (var maildata = await _connection.Read())
                    {
                        maildata.Seek(0, SeekOrigin.Begin);

                        transmissionBuffer.Append(maildata);
                    }
                }

                transmissionBuffer.Flush();

                var commandResult = await _commandHandler.HandleData(target);

                await SendCommandResult(commandResult);

                _state.HasMailFrom = false;
                _state.HasRcptTo = false;
            }
        }
        private async Task SubmitBounceMessageAsync(Message message, IEnumerable <DeliveryResult> failedRecipients)
        {
            if (string.IsNullOrWhiteSpace(message.From))
            {
                return;
            }

            if (IsMailerDaemonAddress(message.From))
            {
                return;
            }

            DateTimeOffset sent;
            string         subject;

            using (var messageData = _messageRepository.GetMessageData(message))
            {
                var originialMimeMessage = MimeMessage.Load(messageData);

                sent    = originialMimeMessage.Date;
                subject = originialMimeMessage.Subject;
            }

            // TODO: Dont' hardcode this.
            string bounceMessageBody = @"Your message did not reach some or all of the intended recipients.

   Sent: %MACRO_SENT%
   Subject: %MACRO_SUBJECT%

The following recipient(s)could not be reached:

%MACRO_RECIPIENTS%

hMailServer";

            bounceMessageBody = bounceMessageBody.Replace("%MACRO_SENT%", sent.ToString());
            bounceMessageBody = bounceMessageBody.Replace("%MACRO_SUBJECT", subject);

            var recipientList = new StringBuilder();

            foreach (var failedRecipient in failedRecipients)
            {
                recipientList.AppendFormat("Recipient: {0}\r\n", failedRecipient.Recipient);
                recipientList.AppendFormat("Message: {1}\r\n", failedRecipient.ResultMessage);
                recipientList.AppendLine();
            }

            bounceMessageBody = bounceMessageBody.Replace("%MACRO_RECIPIENTS%", recipientList.ToString());

            var mimeMessage = new MimeMessage();

            // TODO: Sender address should be generated off domain name.
            mimeMessage.From.Add(new MailboxAddress("", "mailer-daemon@" + Environment.MachineName));
            mimeMessage.To.Add(new MailboxAddress("", message.From));

            // TODO: Don't hard-code
            mimeMessage.Subject = "Delivery failure";

            mimeMessage.Body = new TextPart("plain")
            {
                Text = bounceMessageBody
            };


            // TODO: Don't hardcode buffer size.
            using (var mailStream = new MemoryStreamWithFileBacking(10000))
            {
                mimeMessage.WriteTo(mailStream, CancellationToken.None);

                var bounceMessage = new Message()
                {
                    Recipients = new List <Recipient>()
                    {
                        new Recipient()
                        {
                            Address         = message.From,
                            OriginalAddress = message.From
                        }
                    },
                    From  = "mailer-daemon" + Environment.MachineName,
                    Size  = mailStream.Length,
                    State = MessageState.Delivering,
                };

                await _messageRepository.InsertAsync(bounceMessage);
            }

            throw new NotImplementedException();
        }