/// 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; }
/// 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); } }
/// メールヘッダーの文字列をデコードします。 /// <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()); }
/// メール本文の文字列をメールの仕様に従ってエンコードします。 /// <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)); }
/// 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); }
/// メール本文の文字列を解析し、デコードされたメール本文の文字列を取得します。 /// <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)); }
/// 指定したエンコード方式でエンコードされた表示名<メールアドレス>の文字列を取得します。 /// <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)); } } }
/// このインスタンスの値を元に、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); }
static MailParser() { MailParser.SetDateTimeFormatString(); MailParser.InitializeEncodingList(); }
/// メールヘッダーの文字列をエンコードします。 /// <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); } }
/// メールヘッダーの文字列をエンコードします。 /// <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)); }