예제 #1
0
 /// Body部のテキストがセットされているか確認し、セットされてない場合はBody部の文字列をセットします。
 /// <summary>
 /// Ensure that body text is set or not,and set body text if body text is not set.
 /// Body部のテキストがセットされているか確認し、セットされてない場合はBody部の文字列をセットします。
 /// </summary>
 /// <returns></returns>
 protected virtual void EnsureBodyText()
 {
     if (this.BodyTextCreated == false)
     {
         if (this.ContentType.Value.IndexOf("message/rfc822") > -1)
         {
             this.BodyText = this.BodyData;
         }
         else if (this.IsMultiPart == true)
         {
             if (this.BodyContent == null)
             {
                 this.BodyText = "";
             }
             else
             {
                 this.BodyText = this.BodyContent.BodyText;
             }
         }
         else if (this.IsText == true)
         {
             this.BodyText = MailParser.DecodeFromMailBody(this.BodyData, this.ContentTransferEncoding, this.ContentEncoding);
         }
         else
         {
             this.BodyText = this.BodyData;
         }
     }
     this.BodyTextCreated = true;
 }
예제 #2
0
        /// Content-Typeの解析を行います。
        /// <summary>
        /// Parse content-type.
        /// Content-Typeの解析を行います。
        /// </summary>
        /// <param name="contentType"></param>
        /// <param name="line"></param>
        public static void ParseContentType(ContentType contentType, String line)
        {
            Match m = null;

            //name=???;
            foreach (Regex rx in MailParser.RegexList.ContentTypeName)
            {
                m = rx.Match(line);
                if (String.IsNullOrEmpty(m.Groups["Value"].Value) == false)
                {
                    contentType.Name = m.Groups["Value"].Value;
                    break;
                }
            }
            if (String.IsNullOrEmpty(contentType.Name) == true)
            {
                contentType.Name = MailParser.ParseHeaderParameterValue("name", line);
            }

            //boundary
            foreach (Regex rx in MailParser.RegexList.ContentTypeBoundary)
            {
                m = rx.Match(line);
                if (String.IsNullOrEmpty(m.Groups["Value"].Value) == false)
                {
                    contentType.Boundary = m.Groups["Value"].Value;
                    break;
                }
            }
            if (String.IsNullOrEmpty(contentType.Boundary) == true)
            {
                contentType.Boundary = MailParser.ParseHeaderParameterValue("boundary", line);
            }
        }
예제 #3
0
        /// メールヘッダーの文字列をデコードします。
        /// <summary>
        /// メールヘッダーの文字列をデコードします。
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        public static String DecodeFromMailHeaderLine(String line)
        {
            Regex           rg = RegexList.DecodeByRfc2047;
            MatchCollection mc = null;
            Match           m  = null;

            Byte[]        bb         = null;
            Encoding      en         = null;
            Int32         StartIndex = 0;
            StringBuilder sb         = new StringBuilder();

            if (String.IsNullOrEmpty(line) == true)
            {
                return("");
            }

            m  = RegexList.DecodeByRfc2231.Match(line);
            mc = rg.Matches(line);
            if (m.Success == true && mc.Count == 0)
            {
                en = MailParser.GetEncoding(m.Groups["Encoding"].Value);
                sb.Append(MailParser.DecodeFromMailHeaderLineByRfc2231(m.Groups["Value"].Value, en));
            }
            else
            {
                for (int i = 0; i < mc.Count; i++)
                {
                    m = mc[i];
                    sb.Append(line.Substring(StartIndex, m.Index - StartIndex));
                    StartIndex = m.Index + m.Length;

                    if (m.Groups.Count < 3)
                    {
                        throw new InvalidDataException();
                    }
                    if (m.Groups["BorQ"].Value.ToUpper() == "B")
                    {
                        bb = Convert.FromBase64String(m.Groups["Value"].Value);
                    }
                    else if (m.Groups["BorQ"].Value.ToUpper() == "Q")
                    {
                        bb = MailParser.FromQuotedPrintableTextOnHeader(m.Groups["Value"].Value);
                    }
                    else
                    {
                        throw new InvalidDataException();
                    }
                    en = MailParser.GetEncoding(m.Groups["Encoding"].Value);
                    sb.Append(en.GetString(bb));
                }
                sb.Append(line.Substring(StartIndex, line.Length - StartIndex));
            }
            return(sb.ToString());
        }
예제 #4
0
 /// メール本文の文字列をメールの仕様に従ってエンコードします。
 /// <summary>
 /// メール本文の文字列をメールの仕様に従ってエンコードします。
 /// </summary>
 /// <param name="text"></param>
 /// <param name="encodeType"></param>
 /// <param name="encoding"></param>
 /// <returns></returns>
 public static String EncodeToMailBody(String text, TransferEncoding encodeType, Encoding encoding)
 {
     Byte[] bb = encoding.GetBytes(text);
     if (encodeType == TransferEncoding.Base64)
     {
         return(Convert.ToBase64String(bb));
     }
     else if (encodeType == TransferEncoding.QuotedPrintable)
     {
         return(MailParser.ToQuotedPrintable(encoding.GetString(bb)));
     }
     return(encoding.GetString(bb));
 }
예제 #5
0
        /// Content-Dispositionの解析を行います。
        /// <summary>
        /// Parse content-disposision.
        /// Content-Dispositionの解析を行います。
        /// </summary>
        /// <param name="contentDisposition"></param>
        /// <param name="line"></param>
        public static void ParseContentDisposition(ContentDisposition contentDisposition, String line)
        {
            Match m = null;

            //filename=???;
            foreach (Regex rx in MailParser.RegexList.ContentDispositionFileName)
            {
                m = rx.Match(line);
                if (String.IsNullOrEmpty(m.Groups["Value"].Value) == false)
                {
                    contentDisposition.FileName = m.Groups["Value"].Value;
                    return;
                }
            }
            contentDisposition.FileName = MailParser.ParseHeaderParameterValue("filename", line);
        }
예제 #6
0
        /// メール本文の文字列を解析し、デコードされたメール本文の文字列を取得します。
        /// <summary>
        /// メール本文の文字列を解析し、デコードされたメール本文の文字列を取得します。
        /// </summary>
        /// <param name="text"></param>
        /// <param name="encodeType"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static String DecodeFromMailBody(String text, TransferEncoding encodeType, Encoding encoding)
        {
            Byte[] b = null;

            if (encodeType == TransferEncoding.Base64)
            {
                b = Convert.FromBase64String(text);
            }
            else if (encodeType == TransferEncoding.QuotedPrintable)
            {
                b = MailParser.FromQuotedPrintableText(text);
            }
            else
            {
                b = encoding.GetBytes(text);
            }
            return(encoding.GetString(b));
        }
예제 #7
0
 /// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。
 /// <summary>
 /// Get mail address text encoded by specify encoding.
 /// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。
 /// </summary>
 /// <param name="encoding"></param>
 /// <param name="transferEncoding"></param>
 /// <param name="mailAddress"></param>
 /// <param name="displayName"></param>
 /// <param name="doubleQuote"></param>
 /// <returns></returns>
 public static String ToMailAddressText(Encoding encoding, TransferEncoding transferEncoding
                                        , String mailAddress, String displayName, Boolean doubleQuote)
 {
     if (String.IsNullOrEmpty(displayName) == true)
     {
         return(mailAddress);
     }
     else
     {
         if (doubleQuote == true)
         {
             return(String.Format("\"{0}\" <{1}>", displayName, mailAddress));
         }
         else
         {
             return(String.Format("{0} <{1}>"
                                  , MailParser.EncodeToMailHeaderLine(displayName, transferEncoding, encoding, MailParser.MaxCharCountPerRow - mailAddress.Length - 3)
                                  , mailAddress));
         }
     }
 }
예제 #8
0
        /// このインスタンスの値を元に、SmtpMessageクラスのインスタンスを生成します。
        /// <summary>
        /// Create SmtpMessage instance with this instance value.
        /// このインスタンスの値を元に、SmtpMessageクラスのインスタンスを生成します。
        /// </summary>
        /// <returns></returns>
        public Smtp.SmtpMessage CreateSmtpMessage()
        {
            Smtp.SmtpMessage mg = new HigLabo.Net.Smtp.SmtpMessage();
            Field            f  = null;

            mg.To.AddRange(MailAddress.CreateMailAddressList(this.To));
            mg.Cc.AddRange(MailAddress.CreateMailAddressList(this.Cc));
            for (int i = 0; i < this.Header.Count; i++)
            {
                f = this.Header[i];
                if (String.IsNullOrEmpty(f.Value) == true)
                {
                    continue;
                }
                if (f.Key.ToLower() == "to" ||
                    f.Key.ToLower() == "cc")
                {
                    continue;
                }
                mg[f.Key] = MailParser.DecodeFromMailHeaderLine(f.Value);
            }
            for (int i = 0; i < this.ContentType.Fields.Count; i++)
            {
                f = this.ContentType.Fields[i];
                mg.ContentType.Fields.Add(new Field(f.Key, MailParser.DecodeFromMailHeaderLine(f.Value)));
            }
            for (int i = 0; i < this.ContentDisposition.Fields.Count; i++)
            {
                f = this.ContentDisposition.Fields[i];
                mg.ContentDisposition.Fields.Add(new Field(f.Key, MailParser.DecodeFromMailHeaderLine(f.Value)));
            }
            mg.BodyText = this.BodyText;
            for (int i = 0; i < this.Contents.Count; i++)
            {
                mg.Contents.Add(this.Contents[i].CreateSmtpContent());
            }
            return(mg);
        }
예제 #9
0
 static MailParser()
 {
     MailParser.SetDateTimeFormatString();
     MailParser.InitializeEncodingList();
 }
예제 #10
0
        /// メールヘッダーの文字列をエンコードします。
        /// <summary>
        /// メールヘッダーの文字列をエンコードします。
        /// </summary>
        /// <param name="text"></param>
        /// <param name="encodeType"></param>
        /// <param name="encoding"></param>
        /// <param name="maxCharCount"></param>
        /// <returns></returns>
        public static String EncodeToMailHeaderLine(String text, TransferEncoding encodeType, Encoding encoding, Int32 maxCharCount)
        {
            Byte[]        bb              = null;
            StringBuilder sb              = new StringBuilder();
            Int32         StartIndex      = 0;
            Int32         CharCountPerRow = 0;
            Int32         ByteCount       = 0;

            if (maxCharCount > MailParser.MaxCharCountPerRow)
            {
                throw new ArgumentException("maxCharCount must less than MailParser.MaxCharCountPerRow.");
            }

            if (String.IsNullOrEmpty(text) == true)
            {
                return("");
            }

            if (MailParser.AsciiCharOnly(text) == true)
            {
                StartIndex      = 0;
                CharCountPerRow = maxCharCount;
                for (int i = 0; i < text.Length; i++)
                {
                    sb.Append(text[i]);
                    if (StartIndex == CharCountPerRow)
                    {
                        sb.Append(MailParser.NewLine);
                        StartIndex      = 0;
                        CharCountPerRow = MailParser.MaxCharCountPerRow;
                        if (i < text.Length - 1)
                        {
                            sb.Append("\t");
                        }
                    }
                    else
                    {
                        StartIndex += 1;
                    }
                }
                return(sb.ToString());
            }
            if (encodeType == TransferEncoding.Base64)
            {
                CharCountPerRow = (Int32)Math.Floor((maxCharCount - (encoding.WebName.Length + 10)) * 0.75);
                for (int i = 0; i < text.Length; i++)
                {
                    ByteCount = encoding.GetByteCount(text.Substring(StartIndex, (i + 1) - StartIndex));
                    if (ByteCount > CharCountPerRow)
                    {
                        bb = encoding.GetBytes(text.Substring(StartIndex, i - StartIndex));
                        sb.AppendFormat("=?{0}?B?{1}?={2}\t", encoding.WebName, Convert.ToBase64String(bb), MailParser.NewLine);
                        StartIndex      = i;
                        CharCountPerRow = (Int32)Math.Floor((MailParser.MaxCharCountPerRow - (encoding.WebName.Length + 10)) * 0.75);
                    }
                }
                bb = encoding.GetBytes(text.Substring(StartIndex));
                sb.AppendFormat("=?{0}?B?{1}?=", encoding.WebName, Convert.ToBase64String(bb));

                return(sb.ToString());
            }
            else if (encodeType == TransferEncoding.QuotedPrintable)
            {
                CharCountPerRow = (Int32)Math.Floor((maxCharCount - (Double)(encoding.WebName.Length + 10)) / 3);
                for (int i = 0; i < text.Length; i++)
                {
                    ByteCount = encoding.GetByteCount(text.Substring(StartIndex, (i + 1) - StartIndex));
                    if (ByteCount > CharCountPerRow)
                    {
                        bb = encoding.GetBytes(text.Substring(StartIndex, i - StartIndex));
                        sb.AppendFormat("=?{0}?Q?{1}?={2}\t", encoding.WebName, MailParser.ToQuotedPrintableOnHeader(encoding.GetString(bb)), MailParser.NewLine);
                        StartIndex      = i;
                        CharCountPerRow = (Int32)Math.Floor((MailParser.MaxCharCountPerRow - (encoding.WebName.Length + 10)) * 0.75);
                    }
                }
                bb = encoding.GetBytes(text.Substring(StartIndex));
                sb.AppendFormat("=?{0}?Q?{1}?=", encoding.WebName, MailParser.ToQuotedPrintable(encoding.GetString(bb)));

                return(sb.ToString());
            }
            else
            {
                return(text);
            }
        }
예제 #11
0
 /// メールヘッダーの文字列をエンコードします。
 /// <summary>
 /// メールヘッダーの文字列をエンコードします。
 /// </summary>
 /// <param name="text"></param>
 /// <param name="encodeType"></param>
 /// <param name="encoding"></param>
 /// <returns></returns>
 public static String EncodeToMailHeaderLine(String text, TransferEncoding encodeType, Encoding encoding)
 {
     return(MailParser.EncodeToMailHeaderLine(text, encodeType, encoding, MailParser.MaxCharCountPerRow));
 }