コード例 #1
0
        public static string DecodeContent(
            this SMTPImpostorMessage message)
        {
            var encoding = message.GetEncodingOrUTF8();

            return(SMTPImpostorDecoder.FromQuotedPrintable(message.Content, encoding));
        }
コード例 #2
0
        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}");
                    }
                })
                                   );
            }
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        Task PutAsync(SMTPImpostorMessage message)
        {
            _messages.Add(message);
            if (_settings.MaxMessages != null)
            {
                while (_messages.Count > _settings.MaxMessages)
                {
                    _messages.RemoveAt(0);
                }
            }

            return(Task.CompletedTask);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        async Task <SMTPImpostorMessage> GetAsync(
            string messageId)
        {
            var content = await TryGetMessageContentAsync(messageId);

            if (content == null)
            {
                return(null);
            }

            return(SMTPImpostorMessage
                   .Parse(content, messageId));
        }
コード例 #7
0
        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
                       ));
        }
コード例 #8
0
        /// <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);
                }
            }
        }
コード例 #9
0
 public static Encoding GetEncodingOrUTF8(
     this SMTPImpostorMessage message)
 {
     return(message.TryGetEncoding()
            ?? Encoding.GetEncoding("utf-8"));
 }
コード例 #10
0
 async Task ISMTPImpostorMessagesStore
 .PutAsync(SMTPImpostorMessage message) => await PutAsync(message);