// Метод получения альтернативного способа просмотра письма private void GetView(string text) { if (text.Contains("\r\n\r\n")) { // Заголовок альтернативного способа просмотра письма string header = text.Substring(0, text.IndexOf("\r\n\r\n")); // Тело альтернативного способа просмотра письма string body = text.Substring(text.IndexOf("\r\n\r\n") + 4); // Тип контента альтернативного способа просмотра письма ContentType ct = ParserMessage.GetContentType(header); // Получение транспортной кодировки TransferEncoding transEncode = ParserMessage.GetBodyTransfer(header); // Получение текста письма в формате html-страницы if (ct.MediaType == MediaTypeNames.Text.Html) { BodyEncoding = ParserMessage.MyGetEncoding(ct.CharSet); BodyTransferEncoding = transEncode; Body = body; IsBodyHtml = true; } // Получение текста письма в виде обычного текста else if (ct.MediaType == MediaTypeNames.Text.Plain && !IsBodyHtml) { BodyEncoding = ParserMessage.MyGetEncoding(ct.CharSet); BodyTransferEncoding = transEncode; Body = body; } } }
// Метод отправляет запрос на IMAP-сервер и получает с него ответ private string SRComand(string cmd) { if (busyStream) { throw new Exception("Поток занят"); } else { string response = null; busyStream = true; // Увеличение счетчика команд lastIndex++; // Ключевое слово для окончания чтения string key = "KiR35" + lastIndex.ToString(); string _cmd = key + " " + cmd + "\r\n"; Write(_cmd); do { // Получение ответа и удаление из него лишних символов response += ParserMessage.RemChar(Read(key), "\0"); } while (!(response.Contains(key))); busyStream = false; // Ограничение ответа до ключевого слова return(response.Substring(0, response.IndexOf(key) + key.Length + 4)); } }
// Команда загрузки списка папок public void List() { if (Connected) { string _cmd = "LIST " + "\"\"" + " \"*\""; string answer = SRComand(_cmd); if (answer.Contains(" OK ")) { // Получение списка папок из строки ответа сервера // и наступление события завершения выполнения команды LIST ListCompleted(ParserMessage.GetFolders(answer)); } else { throw new Exception("Ошибка загрузки списка почтовых ящиков"); } } else { throw new Exception("Нет соединения"); } }
// Команда загрузки тела письма public void LoadMessage(string num) { if (Connected) { string _cmd = "FETCH " + num + " BODY[TEXT]"; string answer = SRComand(_cmd); if (answer.Contains(" OK ")) { // Получение тела письма из строки ответа сервера // и наступление события завершения выполнения команды LoadMessage LoadMessageCompleted(ParserMessage.GetBody(answer)); } else { throw new Exception("Ошибка загрузки письма"); } } else { throw new Exception("Нет соединения"); } }
// Метод добавления тела письма public void AddBody(string body) { Body = body; if (isHaveAttachments) { // Добавление вложений AddAttachments(body, mainContentType.Boundary); // Если после добавления вложений текст письма не изменился // значит письмо имеет пустой текст if (Body == body) { Body = ""; } } if (mainContentType.MediaType == "multipart/alternative") { // Добавление альтернативных способов представления текста письма AddViews(body, mainContentType.Boundary); } // Декодирование текста письма Body = ParserMessage.GetCodeLine(Body, BodyEncoding, BodyTransferEncoding); }
// Команда получения количества писем в папке public int MessInFolder(string path) { int num = 0; if (Connected) { string _cmd = "STATUS " + path + " (messages)"; string answer = SRComand(_cmd); if (answer.Contains("OK")) { num = ParserMessage.GetNumberMess(answer); } else { throw new Exception("Ошибка загрузки количества писем в почтовом ящике"); } } else { throw new Exception("Нет соединения"); } return(num); }
// Создание письма с заголовком public MyMailMessage(string header) : base() { Headers.Add("main", header.Substring(header.IndexOf("\r\n") + 2)); num = Convert.ToInt32(ParserMessage.FirstFromTo(header, " ", " ")); id = ParserMessage.GetID(header); Sender = From = ParserMessage.GetFrom(header); MailAddressCollection temp = ParserMessage.GetTo(header); foreach (MailAddress adr in temp) { To.Add(adr); } Subject = ParserMessage.GetSubject(header); temp = ParserMessage.GetReply(header); foreach (MailAddress adr in temp) { ReplyToList.Add(adr); } temp = ParserMessage.GetCC(header); foreach (MailAddress adr in temp) { CC.Add(adr); } temp = ParserMessage.GetBcc(header); foreach (MailAddress adr in temp) { Bcc.Add(adr); } date = ParserMessage.GetDate(header); displayDate = new DateString(date); mainContentType = ParserMessage.GetContentType(header); BodyEncoding = ParserMessage.MyGetEncoding(mainContentType.CharSet); BodyTransferEncoding = ParserMessage.GetBodyTransfer(header); isHaveAttachments = (mainContentType.MediaType == "multipart/mixed" || mainContentType.MediaType == "multipart/related"); IsBodyHtml = (mainContentType.MediaType == MediaTypeNames.Text.Html); myAttachments = new List <MyAttachment>(); }
// Метод получения вложения private void GetAttach(string text) { // Получение заголовка вложения string header = text.Substring(0, text.IndexOf("\r\n\r\n")); // Получение тела вложения string body = text.Substring(text.IndexOf("\r\n\r\n") + 4); // Тип контента вложения ContentType ct = ParserMessage.GetContentType(header); // Расположение контента ContentDisposition cd = ParserMessage.GetDisposition(header); // Получение транспортной кодировки TransferEncoding transEncode = ParserMessage.GetBodyTransfer(header); // Декодирование строки с именем вложения if (ct.Name != null) { ct.Name = ParserMessage.DecodeString(ct.Name); } // Добавление вложения внутри вложения if (ct.MediaType == "multipart/mixed" || ct.MediaType == "multipart/related") { AddAttachments(body, ct.Boundary); } // Получение текста письма в формате html-страницы else if (ct.MediaType == MediaTypeNames.Text.Html) { if (cd == null) { BodyEncoding = ParserMessage.MyGetEncoding(ct.CharSet); BodyTransferEncoding = transEncode; Body = body; IsBodyHtml = true; } else if (cd.DispositionType != DispositionTypeNames.Attachment) { BodyEncoding = ParserMessage.MyGetEncoding(ct.CharSet); BodyTransferEncoding = transEncode; Body = body; IsBodyHtml = true; } } // Получение текста письма в виде обычного текста else if (ct.MediaType == MediaTypeNames.Text.Plain && !IsBodyHtml) { if (cd == null) { BodyEncoding = ParserMessage.MyGetEncoding(ct.CharSet); BodyTransferEncoding = transEncode; Body = body; } else if (cd.DispositionType != DispositionTypeNames.Attachment) { BodyEncoding = ParserMessage.MyGetEncoding(ct.CharSet); BodyTransferEncoding = transEncode; Body = body; } } // Добавление альтернативных способов представления текста письма else if (ct.MediaType == "multipart/alternative") { AddViews(body, ct.Boundary); } // Декодирование тела вложения и добавление в список else { body = ParserMessage.GetCodeLine(body, Encoding.Default, transEncode); myAttachments.Add(new MyAttachment(ct, body)); } }