Пример #1
0
        /// <summary>
        ///     Ranames the folder
        /// </summary>
        /// <param name="name">the name to set</param>
        /// <returns></returns>
        internal bool Rename(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("Folder name cannot be empty");
            }

            IList <string> data = new List <string>();

            string encodedName = ImapUTF7.Encode(name);

            int i = _path.LastIndexOf(_client.Behavior.FolderDelimeter);

            string newPath = i < 1 ? encodedName : _path.Substring(0, i + 1) + encodedName;

            if (!_client.SendAndReceive(string.Format(ImapCommands.Rename, _path, newPath), ref data))
            {
                return(false);
            }

            _name = name;
            _path = newPath;

            if (!HasChildren || _subFolders == null)
            {
                return(true);
            }
            foreach (var folder in SubFolders)
            {
                folder.UpdatePath(_path);
            }

            return(true);
        }
Пример #2
0
        public bool Download()
        {
            if (Downloaded)
            {
                return(true);
            }

            //ContentStream = new MemoryStream();
            // _writer = new StreamWriter(ContentStream);

            Encoding encoding = null;

            if (ContentType != null && ContentType.CharSet != null)
            {
                try
                {
                    encoding = Encoding.GetEncoding(ContentType.CharSet);
                }
                catch
                {
                }
            }
            else if (_message.ContentType != null && _message.ContentType.CharSet != null)
            {
                try
                {
                    encoding = Encoding.GetEncoding(_message.ContentType.CharSet);
                }
                catch
                {
                }
            }

            IList <string> data = new List <string>();

            _contentBuilder = new StringBuilder();

            bool result =
                _client.SendAndReceive(
                    string.Format(ImapCommands.Fetch, _message.UId,
                                  string.Format("BODY.PEEK[{0}.MIME] BODY.PEEK[{0}]", ContentNumber)), ref data,
                    this, encoding);

            //_writer.Flush();

            _fetchProgress = _fetchProgress | MessageFetchState.Body | MessageFetchState.Headers;

            ContentStream = _contentBuilder.ToString();

            if (ContentTransferEncoding == ContentTransferEncoding.QuotedPrintable && !string.IsNullOrEmpty(ContentStream))
            {
                ContentStream = StringDecoder.DecodeQuotedPrintable(ContentStream, encoding);
            }

            return(result);
        }
Пример #3
0
        /// <summary>
        /// Downloads the raw message (EML) returned by the server. It's not recommended to use this method unless you don't need to parse the message and only want to save it completely.
        /// </summary>
        /// <returns></returns>
        public string DownloadRawMessage()
        {
            IList <string> data = new List <string>();

            if (!_client.SendAndReceive(string.Format(ImapCommands.Fetch, UId, "BODY.PEEK[]"), ref data))
            {
                throw new OperationFailedException("The raw message could not be downloaded");
            }

            var sb = new StringBuilder();

            for (var i = 1; i < data.Count; i++)
            {
                if ((data[i].StartsWith(")") || data[i].Contains("UID")) && (i == data.Count - 1 || i == data.Count - 2))
                {
                    break;
                }
                sb.AppendLine(data[i]);
            }
            return(sb.ToString());
        }
Пример #4
0
        public bool Download(MessageFetchMode mode = MessageFetchMode.ClientDefault, bool reloadHeaders = false)
        {
            if (mode == MessageFetchMode.ClientDefault)
            {
                mode = _client.Behavior.MessageFetchMode;
            }

            if (mode == MessageFetchMode.None)
            {
                return(true);
            }

            var fetchParts = new StringBuilder();

            if (mode.HasFlag(MessageFetchMode.Flags) && !_downloadProgress.HasFlag(MessageFetchMode.Flags))
            {
                fetchParts.Append("FLAGS ");
            }

            if (mode.HasFlag(MessageFetchMode.InternalDate) && !_downloadProgress.HasFlag(MessageFetchMode.InternalDate))
            {
                fetchParts.Append("INTERNALDATE ");
            }

            if (mode.HasFlag(MessageFetchMode.Size) && !_downloadProgress.HasFlag(MessageFetchMode.Size))
            {
                fetchParts.Append("RFC822.SIZE ");
            }

            if (mode.HasFlag(MessageFetchMode.Headers) && (!_downloadProgress.HasFlag(MessageFetchMode.Headers) || reloadHeaders))
            {
                Headers.Clear();
                if (_client.Behavior.RequestedHeaders == null || _client.Behavior.RequestedHeaders.Length == 0)
                {
                    fetchParts.Append("BODY.PEEK[HEADER] ");
                }
                else
                {
                    fetchParts.Append("BODY.PEEK[HEADER.FIELDS (" +
                                      string.Join(" ",
                                                  _client.Behavior.RequestedHeaders.Where(_ => !string.IsNullOrEmpty(_))
                                                  .Select(_ => _.ToUpper())
                                                  .ToArray()) + ")] ");
                }
            }

            if (mode.HasFlag(MessageFetchMode.BodyStructure) &&
                !_downloadProgress.HasFlag(MessageFetchMode.BodyStructure))
            {
                fetchParts.Append("BODYSTRUCTURE ");
            }

            if (_client.Capabilities.XGMExt1)
            {
                if (mode.HasFlag(MessageFetchMode.GMailMessageId) &&
                    !_downloadProgress.HasFlag(MessageFetchMode.GMailMessageId))
                {
                    fetchParts.Append("X-GM-MSGID ");
                }

                if (mode.HasFlag(MessageFetchMode.GMailThreads) &&
                    !_downloadProgress.HasFlag(MessageFetchMode.GMailThreads))
                {
                    fetchParts.Append("X-GM-THRID ");
                }

                if (mode.HasFlag(MessageFetchMode.GMailLabels) &&
                    !_downloadProgress.HasFlag(MessageFetchMode.GMailLabels))
                {
                    fetchParts.Append("X-GM-LABELS ");
                }
            }


            IList <string> data = new List <string>();

            if (
                !_client.SendAndReceive(string.Format(ImapCommands.Fetch, UId, fetchParts.ToString().Trim()), ref data,
                                        this))
            {
                return(false);
            }

            BindHeadersToFields();

            if (!mode.HasFlag(MessageFetchMode.Body))
            {
                return(true);
            }

            foreach (MessageContent bodyPart in BodyParts)
            {
                if (mode.HasFlag(MessageFetchMode.Full) ||
                    (bodyPart.ContentDisposition == null && bodyPart.ContentType != null &&
                     (bodyPart.ContentType.MediaType == "text/plain" || bodyPart.ContentType.MediaType == "text/html")))
                {
                    bodyPart.Download();
                }
            }

            return(true);
        }