public static string DecodeContent( this SMTPImpostorMessage message) { var encoding = message.GetEncodingOrUTF8(); return(SMTPImpostorDecoder.FromQuotedPrintable(message.Content, encoding)); }
async void LoadMessageIndex() { if (CheckMessagePath(out var path, false)) { var directory = new DirectoryInfo(path); var query = directory.EnumerateFiles($"*{MESSAGE_EXTN}") .OrderByDescending(fi => fi.CreationTimeUtc) .AsEnumerable(); await Task.WhenAll(query .Select(async fi => { var content = await File.ReadAllTextAsync(fi.FullName); var messageId = Path.GetFileNameWithoutExtension(fi.FullName); try { var message = SMTPImpostorMessage.TryParseInfo(content, messageId); _index.Add(message); } catch (Exception ex) { _logger.LogError(ex, $"Could not load message id {messageId}"); } }) ); } }
public static Encoding TryGetEncoding( this SMTPImpostorMessage message) { var charmap = message.Headers .TryGetValue(SMTPImpostorMessageHeader.CONTENT_TYPE, SMTPImpostorMessageHeader.PART_CHAR_SET); return(charmap == null ? null : Encoding.GetEncoding(charmap)); }
Task PutAsync(SMTPImpostorMessage message) { _messages.Add(message); if (_settings.MaxMessages != null) { while (_messages.Count > _settings.MaxMessages) { _messages.RemoveAt(0); } } return(Task.CompletedTask); }
async Task PutAsync(SMTPImpostorMessage message) { if (message is null) { throw new ArgumentNullException(nameof(message)); } _index.Insert(0, message); CheckMessagePath(out var path, true); var messagePath = GetMessageFilePath(path, message.Id); await File.WriteAllTextAsync(messagePath, message.Content); }
async Task <SMTPImpostorMessage> GetAsync( string messageId) { var content = await TryGetMessageContentAsync(messageId); if (content == null) { return(null); } return(SMTPImpostorMessage .Parse(content, messageId)); }
public static HostMessage Map( this SMTPImpostorMessage source) { if (source == null) { return(null); } return(new HostMessage( source.Id, source.Date, source.From.ToString(), source.Subject, source.Content )); }
/// <summary> /// <para>Process the current data read</para> /// </summary> void Process(string data) { var terminator = SMTPImpostorMessage.LINE_TERMINATOR; try { if (Status == SocketHandlerStates.Data) { var content = _data.ToString(0, _data.Length - _terminator.Length); _data.Clear(); var message = SMTPImpostorMessage.Parse(content); // _logger.LogInformation("Session.Process Data: => {0}", data); Write(ReplyCodes.Completed_250); Status = SocketHandlerStates.Identified; _taskCompletion.SetResult(message); return; } // command expected var command = data.Length < 4 ? string.Empty : data.Substring(0, 4).ToUpper(); // _logger.LogInformation("Session.Process Command: => {0}", command); if (command.Equals(COMMAND_QUIT)) { Dispose(); } else if (command.Equals(COMMAND_EHLO) || command.Equals(COMMAND_HELO)) { ClientId = data.Substring(4).Trim(); // _logger.LogInformation("Session.Process ClientId: => {0}", ClientId); Write(ReplyCodes.Completed_250, String.Format(Resources.Hello_250, ClientId)); Status = SocketHandlerStates.Identified; //Host.RaiseEvent(HostEventTypes.SessionIdentified, this); } else if (command.Equals(COMMAND_NOOP)) { Write(ReplyCodes.Completed_250, String.Format(Resources.Hello_250, ClientId)); } else if (command.Equals(COMMAND_RSET)) { Write(ReplyCodes.Completed_250, String.Format(Resources.Hello_250, ClientId)); _from = null; _to = null; Status = SocketHandlerStates.Identified; //Host.RaiseEvent(HostEventTypes.SessionIdentified, this); } else if (Status < SocketHandlerStates.Identified) { Write(ReplyCodes.CommandSequenceError_503, Resources.ExpectedHELO_503); } else if (command.Equals(COMMAND_MAIL)) { if (Status != SocketHandlerStates.Identified) { Write(ReplyCodes.CommandSequenceError_503); } else { // store the from address, in case its not in the header _from = data.Tail(":").ToMailAddress(); // _logger.LogInformation("Session.Process From: => {0}", _from); Status = SocketHandlerStates.Mail; Write(ReplyCodes.Completed_250); } } else if (command.Equals(COMMAND_RCPT)) { if (Status != SocketHandlerStates.Mail && Status != SocketHandlerStates.Recipient) { Write(ReplyCodes.CommandSequenceError_503); } else { if (_to == null) { _to = new List <MailAddress>(); } var to = data.Tail(":").ToMailAddress(); _to.Add(to); // _logger.LogInformation("Session.Process To: => {0}", to); Status = SocketHandlerStates.Recipient; Write(ReplyCodes.Completed_250); } } else if (command.Equals(COMMAND_DATA)) { // request data Status = SocketHandlerStates.Data; Write(ReplyCodes.StartInput_354); terminator = SMTPImpostorMessage.DATA_TERMINATOR; } else { Write(ReplyCodes.CommandNotImplemented_502); } } catch (SMTPImpostorInvalidMailAddressException ex) { Write( ReplyCodes.ParameterError_501, string.Format("Invalid Address '{0}'", ex.Address)); } finally { if (_networkStream != null) { // next read StartRead(terminator); } } }
public static Encoding GetEncodingOrUTF8( this SMTPImpostorMessage message) { return(message.TryGetEncoding() ?? Encoding.GetEncoding("utf-8")); }
async Task ISMTPImpostorMessagesStore .PutAsync(SMTPImpostorMessage message) => await PutAsync(message);