Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 26.05.2018
Сообщений: 101
.NET 4.x

Работа с обработчиком почты

29.06.2023, 18:23. Показов 961. Ответов 8

Студворк — интернет-сервис помощи студентам
Всем привет. Я пишу обработчик почты. Задача: скачать вложения из сообщений в определенной папке. На данный момент создал метод который, через протокол Imap подключаюсь к почтовому серверу, выбираю нужную папку, выбрал сообщения в нужном мне временном промежутке, затем через UId вытащил из тела письма вложения и успешно их скачал. Но есть одна проблема, в сообщениях созданных вручную вложения скачиваются без проблем и есть электронный адрес с которого письмо составляется автоматически и программно вложения не видно. Собственно вопрос в том где как не в теле сообщения может храниться вложение. В программе использую библиотеку MailKit. К сообщениям обращаюсь через тип BodyPartBasic. Помогите пожалуйста, может кто-нибудь сталкивался с такой проблемой.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2023, 18:23
Ответы с готовыми решениями:

Работа с обработчиком
Есть собственно реквизит справочника, который ссылается на определённое перечисление. На форме элемента у этого реквизита есть варианты...

Работа jquery-ui sortable нарушается обработчиком click (срабатывает при отпускании)
Имеется такой код var imgDiv = $('#img-div'), imgList = $('.p__image', imgDiv); imgList.sortable({containment: "parent"}); ...

Работа С Отправкой Почты
Можно ли настроить работу с почтой так: - открываем новое письмо - начинаем набирать первые буквы - (без нажатия разделителя) выдает...

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14159 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
29.06.2023, 19:27
Цитата Сообщение от PurpleLoris Посмотреть сообщение
Собственно вопрос в том где как не в теле сообщения может храниться вложение.
Отдельно может храниться вообще-то. Коллекцию Attachments посмотрите.
0
1 / 1 / 0
Регистрация: 26.05.2018
Сообщений: 101
30.06.2023, 09:39  [ТС]
Её тоже проверил, там тоже вложений не оказалось. Я вообще только в ней и искал пока что, больше просто не знаю куда копать.

Добавлено через 5 часов 45 минут
Нашёл интересную вещь, но не уверен что это связано напрямую, не сохраняет именно те вложения ContentDisposition которых равен inline, подскажите это может быть связано друг с другом или я не туда залез.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14159 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
30.06.2023, 16:10
Лучший ответ Сообщение было отмечено PurpleLoris как решение

Решение

Цитата Сообщение от PurpleLoris Посмотреть сообщение
не сохраняет именно те вложения ContentDisposition которых равен inline
Попробуйте такой вариант
C#
1
var attachments = message.BodyParts.Where (x => x.ContentDisposition != null && x.ContentDisposition.FileName != null).ToList ();
или такой
C#
1
var images = message.BodyParts.OfType<MimePart> ().Where (x => x.ContentType.IsMimeType ("image", "*")).ToList ();
1
1 / 1 / 0
Регистрация: 26.05.2018
Сообщений: 101
01.07.2023, 16:11  [ТС]
Спасибо за совет, как на работе буду опробую и отпишу.
0
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
02.07.2023, 12:53
У меня часть получающая почту выглядит так:
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
using (ImapClient client = new ImapClient())
{                   
   client.Connect(mailImap, mailPort, SecureSocketOptions.SslOnConnect);
 
   client.Authenticate(System.Text.Encoding.Default, mail, mailPass);
 
   IMailFolder folder = null;
 
   folder = client.GetFolder(mailFolder);
 
   folder.Open(FolderAccess.ReadOnly);
 
   IList<UniqueId> list_All = folder.Search(SearchQuery.All); // все письма
   IList<UniqueId> list_NotSeen = folder.Search(SearchQuery.NotSeen); // не прочитанные
 
   for (int i = folder.Count - 1; i >= 0; i--)
   {
      MimeMessage message = folder.GetMessage(i);
 
      ReceiveMailData mailData = new ReceiveMailData
      {
         Number = (folder.Count - i).ToString(), // нумерация в обратную сторону, потому что почтовик выдает сначала позднюю почту
         Uid = list_All[i],
         Subject = message.Subject == null ? "" : message.Subject.ToString(),
         TextBody = message.TextBody == null ? "" : message.TextBody.ToString(),
         HtmlBody = message.HtmlBody == null ? "" : message.HtmlBody.ToString(),
         Date = DateTime.Parse(message.Date.ToString()).Date.ToString("dd.MM.yyyy"),
         From = message.From == null ? "" : message.From.ToString(),
         To = message.To == null ? "" : message.To.ToString(),
         Attachments = message.Attachments, // вложение типа (IEnumerable<MimeEntity> Attachments)
         Length = FIleSize(in message)
      };
 
      // проверяем по списку и отмечаем непрочитанные
      foreach (UniqueId item in list_NotSeen)
      {
         if (list_All[i].Id == item.Id)
         {
           mailData.Seen = false;
         }
      }
 
      MailReceived?.Invoke(mailData); // инициируем событие получения одного нового почтового сообщения
}
1
1 / 1 / 0
Регистрация: 26.05.2018
Сообщений: 101
03.07.2023, 12:00  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Попробуйте такой вариант
Помогло, большое спасибо.

Добавлено через 5 часов 36 минут
Если кому то нужно вот мой вариант скачивания вложений:

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
public void DownLoadAttachments()
        { 
            using (ImapClient client = new ImapClient())
            {
                //Подключение по протоколу Imap к почтовому серверу
                client.Connect(data.HostName, data.Port, true);
                //Авторизация на сервере с логином и паролем
                client.Authenticate(data.UserName, data.UserPassword);
                Console.WriteLine("Скачивание файлов");
 
                //Выбор папки "Списки прикрепления и открепления"
                var folder = client.GetFolder("Списки открепления и прикрепления");
                //Открытие выбранной папки для работы с ней
                folder.Open(FolderAccess.ReadOnly);
 
                //Определяем идентификаторы сообщений которые будем использовать
                var UIds = folder.Search(SearchQuery.SentSince(DateTime.Now.AddDays(-3)));
                //Определяем какая часть письма будет использована для выгрузки, в данном случае это структура тела необходимая для определения вложений
                var Messages = folder.Fetch(UIds, MessageSummaryItems.BodyStructure);
                
                //Проверка массива на наличие записей в них
                if (Messages != null && Messages.Count > 0)
                {
                    //Перебираем сообщения для сбора вложений
                    foreach (var msg in Messages)
                    {
                        //Определяем путь сохранения файлов, указывая директорию сохранения, папку сохранения, имя сохраняемого файла
                        var pathDir = Path.Combine("Какой-то путь", "Какая-то папка", msg.SaveDate.ToString());
 
                        //Определиние списка вложений у которых ContentDisposition = inline и проверка дабы убрать из выборки картинки
                        var attachments = msg.BodyParts.Where(x => x.ContentDisposition != null && x.ContentDisposition.FileName != null && !x.ContentType.IsMimeType("image","png")).ToList();
                        // Обработка и скачивание получившегося списка вложений
                        ProccessingAttachments(folder,msg, attachments, pathDir);
 
                        //Определение вложений у которых СontentDisposition = attachment
                        var attachments2 = msg.Attachments.OfType<BodyPartBasic>().ToList();
                        //Обработка и скачивание получившегося списка вложений
                        ProccessingAttachments(folder, msg, attachments2, pathDir);
                    }
                }
                else Console.WriteLine("Файлы отсутствуют");
                folder.Close();
                client.Disconnect(true);
                Console.WriteLine("Скачивание завершено");
            }
        }
 
        private void ProccessingAttachments(IMailFolder folder, IMessageSummary msg, List<BodyPartBasic> at, string pathDirr)
        {
            foreach (var att in at)
            {
                //Получаем необходимую часть сообщений по уникальным идентификаторам
                var part = (MimePart)folder.GetBodyPart(msg.UniqueId, att);
 
                //Проверка наличия дирректории, в случае её отсутствия создаётся этот путь со всеми отсутствующими папками
                if (!Directory.Exists(pathDirr))
                {
                    Directory.CreateDirectory(pathDirr);
                }
 
                //Определение пути, где будет сохраняться файл
                var path = Path.Combine(pathDirr, part.FileName);
 
                //Если файл с таким путём не существует, создаём файл и в него декодируем скачанную часть
                if (!File.Exists(path))
                {
                    using (var stream = File.Create(path))
                    {
                        part.Content.DecodeTo(stream);
                    }
                }
            }
        }
Добавлено через 2 минуты
Цитата Сообщение от Tatarin78 Посмотреть сообщение
У меня часть получающая почту выглядит так:
Тоже интересный вариант, но как я понимаю вы полностью сообщения выгружаете? В принципе интересно, для себя кое что подчерпнул. Спасибо.
0
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
04.07.2023, 06:43
Цитата Сообщение от PurpleLoris Посмотреть сообщение
...но как я понимаю вы полностью сообщения выгружаете?...
Да целиком. С отображением вложений, возможностью их открытия, сохранения.
Ну и просмотр самого текста письма в HTML или обычном текстовом формате.
Плюс отправка писем.

Могу скинуть.
Сразу предупреждаю, с IT вообще не связан. Просто интересно. Поэтому как умел.
0
1 / 1 / 0
Регистрация: 26.05.2018
Сообщений: 101
05.07.2023, 05:58  [ТС]
Цитата Сообщение от Tatarin78 Посмотреть сообщение
Могу скинуть.
Спасибо, конечно, но не стоит) Не хочу вас утруждать, да и незачем...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.07.2023, 05:58
Помогаю со студенческими работами здесь

Работа с API Новой Почты
Здравствуйте. Я новичок в php и в программировании. Поэтому прошу сильно не пинать. Разбираю пример...

Дипломная работа, клиент для почты
Здравствуйте! Грядет июнь, сдача и защита дипломной работы крадется незаметно, а я еще не начинал ее делать, поскольку не знаю, с чего...

Работа правил при отправке почты
Добрый день, уважаемые коллеги! Возникли 2 сабжевых вопроса. Первый попроще. Дано. В серверном документе в SMPT Outbound...

Работа с active directory - отображение почты пользователя
Доброго времени суток, столкнулся с такой проблемой, при задании параметров для пользователей в Active directory на вкладке порофиль надо...

Возникли затруднения с программным чтением почты, работа с библиотекой imaplib
Думаю тема уже чуть ли не каждому знакома, пытаюсь написать программу, которая читает последнее &quot;свежее&quot; письмо? и выводит...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru