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)); } }
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)); }
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(); }