Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 13.04.2019
Сообщений: 34

Чтение писем

05.02.2022, 13:35. Показов 1488. Ответов 3

Студворк — интернет-сервис помощи студентам
Создаю программу для чтения электронных писем из почтового ящика. Создал два поля TextBox по имени txtUsername2 и txtPassword2, в которые вписывается логин и пароль собственной эл. почты. Также создал и настроил DataGridView с вкладками "Дата", "Отправитель", "Тема" и "Вложения" и xpBindingSource1. Ну а также, кнопку cmdReceive, по нажатию на которую должен выводиться список. Код компилируется, но при нажатии на кнопку никакой реакции нет. Подозреваю, что проблема в авторизации (неправильно прописан код для неё). Подскажите, как решить проблему?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using DevExpress.XtraEditors;
using MailKit;
using MailKit.Net.Imap;
using MailKit.Search;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
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();
            xpBindingSource1.DataSource = list;
        }
 
        private List<MailListItem> getMails()
        {
            var list = new List<MailListItem>();
            try
                {
                    using (var client = new ImapClient())
                        {
                            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.SentSince(DateTime.Now.AddDays(-7)));
 
                            var messages = client.Inbox.Fetch(uids, MessageSummaryItems.Envelope | MessageSummaryItems.BodyStructure);
 
                            if (messages != null && messages.Count > 0);
                                {
                                    foreach (var msg in messages)
                                        {
                            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,
                            });
                                        }
                                }
                        }
                }
            catch (Exception ex){ }
 
            return list;
        }
    }
}
Ещё есть два предупреждения от Visual Studio.
1) CS0642 Возможно, ошибочный пустой оператор (if)
2) CS0168 Переменная "ex" объявлена, но ни разу не использована.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2022, 13:35
Ответы с готовыми решениями:

Чтение писем с сервера по протоколу IMAP
Всем привет, нужно подключаться к почтовому серверу по протоколу IMAP4, выбирать нужные письма и пересылать их на какие-то адреса. ...

Чтение писем IMAP
Всем привет. Нужно читать письма с ящика. В идеале ловить мессадж о новом письме и читать его, или хотя бы фильтровать по тексту и...

Чтение писем с gmail
Привет! Нужно читать письма с gmail. Понаходил какие-то библиотеки, но завести их не получилось. Плюнул, думаю, попробую сделать в...

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
05.02.2022, 14:00
Цитата Сообщение от Glendale192 Посмотреть сообщение
Подскажите, как решить проблему?
Начните с того что удалите try/catch в методе getMails чтобы иметь возможность хотя бы узнать об исключении в своем коде.

Цитата Сообщение от Glendale192 Посмотреть сообщение
CS0642 Возможно, ошибочный пустой оператор (if)
Очень даже возможно. Посмотрите внимательно на строку 46.
0
0 / 0 / 0
Регистрация: 13.04.2019
Сообщений: 34
05.02.2022, 14:55  [ТС]
Try/catch удалил, а насчёт пустого оператора кажется понял, в чём была проблема. Нужно было убрать лишнюю точку с запятой, и теперь все предупреждения исчезли. Но вот незадача, всё запускается, но при нажатии кнопки получения сообщений ничего не происходит. Также, программу не выкидывает в ошибку, и никаких исключений не происходит.

Добавлено через 15 минут
Ещё поэкспериментировал без try/catch. Вы знаете, похоже, я ошибаюсь насчёт того, что проблема именно с передачей данных для входа. Потому что если ввести логин, и скажем, неправильный пароль, то при нажатии на кнопку получения, программа уходит в исключение и выключается с ошибкой Invalid Credentials. А если всё правильно введено, то ошибки не происходит. Кнопка получения подвисает зажатой где-то на 4 секунды, и список DataGridView после этого как бы моргает, но всё равно ничего не выводится...

Добавлено через 13 минут
Тем временем, разгадка уже совсем близка. И я наконец понял, почему DataGridView моргает, но ничего не выводит. А всё потому, что при создании проекта я забыл подключить к нему xpBindingSource. Теперь выводятся строки, но есть одно НО. Они пустые... Т.е. количество строк равно количеству сообщений на почтовом ящике, но вот все они почему-то пустые...

Добавлено через 14 минут
Решил-таки проблему. Удалил xpBindingSource от DevExpress и добавил обычный BindingSource, который предлагает Visual Studio. Теперь текст сообщений выводится. Остаётся только понять, как выводить сам текст сообщения в многострочное поле, скажем, по двойному клику по ряду с сообщением.
0
0 / 0 / 0
Регистрация: 13.04.2019
Сообщений: 34
05.02.2022, 17:24  [ТС]
Теперь остаётся открытым вопрос, а как же всё-таки сделать вывод самого письма? В данный момент имеется вот такой код, но в строку с письмом он выводит совсем не то, что надо.
Код прилагается ниже:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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,
                                Body = msg.BodyParts.First(),
                                HasAttachments = msg.Attachments != null && msg.Attachments.Count() > 0,
                            });;
 
                                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)
        {
 
        }
    }
}
Ниже представлена картинка
Миниатюры
Чтение писем  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2022, 17:24
Помогаю со студенческими работами здесь

Чтение электронных писем
Всем привет!:) Пишу почтовый клиент. У меня такая проблема, когда к письму прикреплено вложение, то текст письма всегда равен ничему. Вот...

Чтение писем с почты
Несколько раз поднималась тема почтового клиента на vb.net есть ли у кого примеры как -считать письма на эл. почте -вывести список ...

Чтение почты, и удаление прочитанных писем
Здравствуйте, хотел узнать, можно сделать на vbs(hta) программу которая будет заходить на почту и читать письма, а после чтения удалять их?

Чтение писем и сохранения вложений Outlook
Добрый день. Интересует задача, проанализировать отдельно входящие и исходящие письма на предмет писем содержания в теме текста и...

Sendmail и Claws: настроить на чтение писем с localhost
Всем доброго дня. Имеется Debian 9, на него водрузил LAMP и Sendmail. С помощью telnet'а и php-mail отправляю письма на localhost. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru