Esempio n. 1
0
        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;
        }
Esempio n. 2
0
 public object FetchSection(long uid, ImapBodyPart part)
 {
     return FetchSection(uid, part, false);
 }