Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2022, 20:48   #1
VladIvanov192
Новичок
Джуниор
 
Регистрация: 07.02.2022
Сообщений: 1
По умолчанию Как вытянуть тело сообщения при помощи IMAP?

Создаю почтовый клиент, который отправляет письма Gmail по Smtp и принимает по Imap. С отправкой проблем не возникло, а вот с получением имеется. Суть приёма сообщения такова: есть форма, где размещены два textBox'а. В первый нужно ввести логин, во второй - пароль. Дальше нажать на кнопку cmdReceive, и она передаст информацию в bindingSource1, а тот в свою очередь - в таблицу DataGridView.

Код программы изображён ниже:

Код:
using DevExpress.XtraEditors;
using MailKit;
using MailKit.Net.Imap;
using MailKit.Search;
using MimeKit;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Simple_Email_Client
{
    public partial class Receive : DevExpress.XtraEditors.XtraForm
    {
        public Receive()
        {
            InitializeComponent();
        }
 
        private void cmdReceive_Click(object sender, EventArgs e)
        {
            var list = getMails();
            bindingSource1.DataSource = list;
        }
 
        private List<MailListItem> getMails()
        {
            var list = new List<MailListItem>();
 
                    using (var client = new ImapClient())
                        {
                            client.ServerCertificateValidationCallback = (mysender, certificate, chain, sslPolicyErrors) => { return true; };
                            client.CheckCertificateRevocation = false;
                            client.Connect("imap.gmail.com", 993, true);
                            client.Authenticate(txtUsername2.Text, txtPassword2.Text);
 
                            client.Inbox.Open(MailKit.FolderAccess.ReadOnly);
 
                            var uids = client.Inbox.Search(SearchQuery.DeliveredAfter(DateTime.Today.AddDays(-1)));
 
                            var messages = client.Inbox.Fetch(uids, MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure);
 
                            if (messages != null && messages.Count > 0)
                                {
                                    foreach (var msg in messages)
                                        {
                            var body = client.Inbox.GetBodyPart(msg.UniqueId, msg.BodyParts.First());
 
                        list.Add(new MailListItem
                            {
                                Date = msg.Date.ToString(),
                                From = msg.Envelope.From.ToString(),
                                Subj = msg.Envelope.Subject,
                                HasAttachments = msg.Attachments != null && msg.Attachments.Count() > 0,
                                Body = msg.BodyParts.First(),
                                
                            });
 
                                foreach (var att in msg.Attachments.OfType<BodyPartBasic>())
                                        {
                                            var part = (MimePart)client.Inbox.GetBodyPart(msg.UniqueId, att);
 
                                            var pathDir = Path.Combine(Environment.CurrentDirectory, "Emails", msg.UniqueId.ToString());
                                            if(!Directory.Exists(pathDir))
                                            {
                                                Directory.CreateDirectory(pathDir);
                                            }
 
                                            var path = Path.Combine(pathDir, part.FileName);
                                            if (!File.Exists(path))
                                                {
                                                    using(var strm = File.Create(path))
                                                    {
                                                        part.Content.DecodeTo(strm);
                                                    }
                                                }
                                        }
 
 
                                        }
                                }
                        }
 
            return list;
        }
 
        private void xpBindingSource1_ListChanged(object sender, ListChangedEventArgs e)
        {
 
        }
    }
}
В результате выполнения такого кода в строку, где должно быть тело сообщения, мне выводится текст, который изображён на картинке ниже. Т.е. ("TEXT" "HTML" (Charset = UTF8)N...) и т.д.

Прошу помочь решить эту проблему.
Изображения
Тип файла: png Снимок экрана 2022-02-05 162052.png (12.4 Кб, 10 просмотров)
VladIvanov192 вне форума Ответить с цитированием
Старый 13.02.2022, 17:09   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Нужно было указывать, что используется библиотека: MailKit
а лучше и посмотреть как там в ней работает загрузка тела:
https://github.com/jstedfast/MailKit...an-imap-folder
Если есть уверенность, что только текстовые сообщения, то получать через свойство TextBody, а не BodyParts.First()
Иначе уже перебирать все возможные куски и придумывать, что там выводить.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подключить прокси при отправки сообщения на почту Mariush Работа с сетью в Delphi 0 23.07.2020 04:14
Как исправить эту ошибку при попытке вытянуть информацию из ячейки в DataGrid? - WPF Артём001 Помощь студентам 2 08.01.2017 12:29
[РЕШЕНО] Как при помощи модуля CRt реализовать вывод сообщения на экран которое будет периодически менять свой цвет? baton00711 Паскаль, Turbo Pascal, PascalABC.NET 5 21.02.2016 15:20
Подвисание программы при подключении через POP или IMAP XVG C++ Builder 2 01.09.2015 18:30
Как изменить текст сообщения при нажатии на кнопку? motaro Помощь студентам 2 14.07.2007 13:15