Example #1
0
        /// <summary>
        /// Retrieves the message at the given index.
        /// </summary>
        /// <param name="message_index">The index of the message to be retrieved.</param>
        /// <returns>A Message object representing the message.</returns>
        /// <example>
        /// <code>
        /// C#
        /// 
        /// Pop3Client pop = new Pop3Client();
        /// pop.Connect("mail.myhost.com","user","pass");
        /// Message message = pop.RetrieveMessageObject(1);
        /// pop.Disconnect();
        /// 
        /// VB.NET
        /// 
        /// Dim pop As New Pop3Client
        /// pop.Connect("mail.myhost.com","user","pass")
        /// Dim message as Message = pop.RetrieveMessageObject(1)
        /// pop.Disconnect()
        /// 
        /// JScript.NET
        /// 
        /// var pop:Pop3Client = new Pop3Client();
        /// pop.Connect("mail.myhost.com","user","pass");
        /// var message:Message = pop.RetrieveMessageObject(1);
        /// pop.Disconnect();
        /// </code>
        /// </example>
        public Message RetrieveMessageObject(int message_index)
        {
            var msg = RetrieveMessageString(message_index);

            Message message;

            try
            {
                message = Parser.ParseMessage(ref msg);
            }
            catch (Exception ex)
            {
                if (ex is ParsingException || ex is IndexOutOfRangeException)
                {
                    var header_string = RetrieveHeaderString(message_index);

                    Header header;

                    if (!Parser.TryParseDefectiveHeader(header_string, out header))
                        throw;

                    message = new Message(header);

                    message.AddAttachmentFromString("original_message.eml", msg);

                    message.OriginalData = Encoding.GetEncoding("iso-8859-1").GetBytes(msg);

                    message.HasParseError = true;
                }
                else
                    throw;
            }

            return message;
        }
        private Message GetPop3MessageAfterParseError(Pop3Client client, int message_index)
        {
            var header = client.RetrieveHeaderObject(message_index);

            var eml_message_string = client.RetrieveMessageString(message_index);

            var message = new Message(header);

            message.AddAttachmentFromString("original_message.eml", eml_message_string);

            return message;
        }
Example #3
0
        /// <summary>
        /// Parses a Message from a string formatted accordingly to the RFC822.
        /// </summary>
        /// <param name="msg">The string containing the message data to be parsed.</param>
        /// <returns>The parsed message as a Message object.</returns>
        /// <example>
        /// <code>
        /// C#
        /// 
        /// Message message = Parser.ParseMessageString(rfc822string);
        /// //Expose the subject
        /// string subject = message.Subject;
        /// 
        /// VB.NET
        /// 
        /// Dim message As Message = Parser.ParseMessageString(rfc822string)
        /// 'Expose the subject
        /// Dim subject As String = message.Subject
        /// 
        /// JScript.NET
        /// 
        /// var message:Message = Parser.ParseMessageString(rfc822string);
        /// //Expose the subject
        /// var subject:string = message.Subject;
        /// </code>
        /// </example>
        public static Message ParseMessage(ref string msg)
        {
            var message = new Message();

            try
            {
                // Build a part tree and get all headers. 
                var part = ParseMimePart(ref msg, message);
                // Fill a new message object with the new information.
                //message.OriginalData = data;
                message.HeaderFields = part.HeaderFields;
                message.HeaderFieldNames = part.HeaderFieldNames;

                // Dispatch header fields to corresponding object.
                foreach (var key in message.HeaderFields.AllKeys)
                {
                    var name = key;
                    var value = message.HeaderFields[key];
                    // TODO : Fix trace
                    if (name.Equals("received")) message.Trace.Add(ParseTrace(key + ": " + value));
                    else if (name.Equals("to")) message.To = ParseAddresses(value);
                    else if (name.Equals("cc")) message.Cc = ParseAddresses(value);
                    else if (name.Equals("bcc")) message.Bcc = ParseAddresses(value);
                    else if (name.Equals("reply-to")) message.ReplyTo = ParseAddress(value);
                    else if (name.Equals("from")) message.From = ParseAddress(value);
                    else if (name.Equals("sender")) message.Sender = ParseAddress(value);
                    else if (name.Equals("content-type")) message.ContentType = GetContentType(key + ": " + value);
                    else if (name.Equals("content-disposition"))
                        message.ContentDisposition = GetContentDisposition(key + ": " + value);
                    else if (name.Equals("domainkey-signature"))
                        message.Signatures.DomainKeys = Signature.Parse(key + ": " + value, message);
                }

                if (message.ContentType.MimeType.Equals("application/pkcs7-mime")
                    || message.ContentType.MimeType.Equals("application/x-pkcs7-mime"))
                {
                    if (message.ContentType.Parameters["smime-type"] != null
                        && message.ContentType.Parameters["smime-type"].Equals("enveloped-data"))
                    {
                        message.IsSmimeEncrypted = true;
                    }

                    if (message.ContentType.Parameters["smime-type"] != null
                        && message.ContentType.Parameters["smime-type"].Equals("signed-data"))
                    {
                        message.HasSmimeSignature = true;
                    }
                }

                if (message.ContentType.MimeType.Equals("multipart/signed"))
                {
                    message.HasSmimeDetachedSignature = true;
                }

                if (message.ContentType.MimeType.Equals("multipart/report"))
                {
                    message.IsMultipartReport = true;
                }

                // Keep a reference to the part tree within the new Message object.
                message.PartTreeRoot = part;
                // Dispatch the part tree content to the appropriate collections and properties.
                DispatchParts(ref message);

                // Check message for text limit
                const int message_limit = 500000; // 500kb

                if (!string.IsNullOrEmpty(message.BodyHtml.Text))
                {
                    if (message.BodyHtml.Text.Length > message_limit)
                    {
                        var charset = (!string.IsNullOrEmpty(message.BodyHtml.Charset) ? message.BodyHtml.Charset : "iso-8859-1");

                        message.AddAttachmentFromString("original_message.html",
                                                        string.Format(
                                                            "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset={0}\"></head><body>{1}</body><html>",
                                                            charset,
                                                            message.BodyHtml.Text),
                                                        Encoding.GetEncoding(charset));
                    

                        // To long message's html body.
                        message.BodyHtml.Text =
                            "<div>The received email size is too big. The complete text was saved into a separate file and attached to this email.</div>";

                    }
                }
                else if (message.BodyText.Text.Length > message_limit)
                {
                    var charset = (!string.IsNullOrEmpty(message.BodyHtml.Charset) ? message.BodyHtml.Charset : "iso-8859-1");

                    message.AddAttachmentFromString("original_message.txt", message.BodyText.Text, Encoding.GetEncoding(charset));
                    
                    // To long message's text body.
                    var text_view = message.BodyText.Text.Substring(0, message_limit);

                    text_view += "\r\n...\r\n[The received email shown incompletely. The complete text was saved into a separate file and attached to this email.]";

                    message.BodyText.Text = text_view;
                }

                message.OriginalData = Encoding.GetEncoding("iso-8859-1").GetBytes(msg);
            }
            catch (Exception ex)
            {
                if (ErrorParsing != null)
                    ErrorParsing(null, ex);
                else
                    throw;
            }
            return message;
        }
        private Message GetImapMessageAfterParseError(Mailbox mb, int uid)
        {
            var header = GetImapHeader(mb, uid);

            var message = new Message(header);

            var eml_message_string = mb.Fetch.UidMessageString(uid);

            message.AddAttachmentFromString("original_message.eml", eml_message_string);

            return message;
        }