public object FetchSection(long uid, ImapBodyPart part, bool peek) { SendReceiveResult result = SendReceive(string.Format("UID FETCH {0} BODY{1}[{2}]", uid, peek ? ".PEEK" : string.Empty, part.Section)); byte[] bytes = null; Encoding enc = null; try { enc = Encoding.GetEncoding(part.ContentType.CharSet.Trim(new char[] { '"' })); } catch (ArgumentException) { } if (null == enc) { // Fall back on ASCII if we have any trouble getting the encoding for // specified character set. enc = ASCIIEncoding.ASCII; } if (result.Status == SendReceiveStatus.OK) { ImapList sectionList = null; string sectionLine = null; SafeEnumerateLines(result.Lines, (line) => { bool keepGoing = true; if (sectionList == null) { ImapList list = ImapList.Parse(line); if (list.GetStringAt(0) == "*" && list.GetStringAt(2) == "FETCH") { sectionList = list; } } else if (sectionLine == null) { sectionLine = line; } else if (line == ")") { if (!string.IsNullOrEmpty(sectionLine)) { if (part.Encoding.Equals("BASE64", StringComparison.InvariantCultureIgnoreCase)) { try { bytes = Convert.FromBase64String(sectionLine); } catch { } } else if ( part.Encoding.Equals("7BIT", StringComparison.InvariantCultureIgnoreCase) || part.Encoding.Equals("8BIT", StringComparison.InvariantCultureIgnoreCase)) { bytes = Encoding.ASCII.GetBytes(sectionLine); } else if ( part.Encoding.Equals("QUOTED-PRINTABLE", StringComparison.InvariantCultureIgnoreCase)) { var qpDecoded = RFC2047Decoder.ParseQuotedPrintable(enc, sectionLine); bytes = enc.GetBytes(qpDecoded); } else if ( part.Encoding.Equals("BINARY", StringComparison.InvariantCultureIgnoreCase)) { bytes = Encoding.ASCII.GetBytes(sectionLine); } } keepGoing = false; } return keepGoing; }); } else if (result.Status == SendReceiveStatus.Bad) { throw new InvalidOperationException(); } if (bytes != null && part.ContentType.CharSet != null) { try { string intermediate = enc.GetString(bytes); return intermediate; } catch (ArgumentException) { } } return bytes; }
public object FetchSection(long uid, ImapBodyPart part) { return FetchSection(uid, part, false); }