Каталоги IMAP - как парсить список?

zombie

Client
Регистрация
14.08.2012
Сообщения
479
Благодарностей
117
Баллы
43
Добрый день.
Работаю с мульти-почтами , у интересующих меня сервисов нужные мне письма приходят в разные каталоги, которых я не знаю .
Например, на почте orange.fr нужные мне письма приходят в INBOX/adelyne_craignou@orange_fr (adelyne_craignou@orange_fr - логин аккаунта).

Вопрос:
- можно ли как-то парсить каталоги перед подтверждением как это в самом экшне?
- даже если и спарсить, то как подставить? тамнет места для вставки переменной

да ещё заметил что он не все письма видит вуказанном каталоге
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 165
Благодарностей
2 167
Баллы
113
Добрый день.
Работаю с мульти-почтами , у интересующих меня сервисов нужные мне письма приходят в разные каталоги, которых я не знаю .
Например, на почте orange.fr нужные мне письма приходят в INBOX/adelyne_craignou@orange_fr (adelyne_craignou@orange_fr - логин аккаунта).

Вопрос:
- можно ли как-то парсить каталоги перед подтверждением как это в самом экшне?
- даже если и спарсить, то как подставить? тамнет места для вставки переменной

да ещё заметил что он не все письма видит вуказанном каталоге
Столкнулся с подобной задачей, оставлю тут ответ:
1. Качаем шаблон с готовыми библиотеками из топика VerBin:
mailkit.dll mimekit.dll yandex.ru перенос всех писем из спама в инбокс. пометить как важное. перенести в спам.
2. Вставляем там кубик C# отдельный, который и будем запускать:
C#:
List<string> stringlist = new List<string>();
string email = project.Variables["EMAIL"].Value;
string password = project.Variables["PASSWORD"].Value;

using (var client = new MailKit.Net.Imap.ImapClient()) {
    client.CheckCertificateRevocation = false;
    client.ServerCertificateValidationCallback = (s,c,h,e) => true;
    //client.ServerCertificateValidationCallback = (mysender, certificate, chain, sslPolicyErrors) => { return true; };
   
    client.Connect("imap.yandex.ru", 993, MailKit.Security.SecureSocketOptions.SslOnConnect);
    client.Authenticate(email, password);
   
    // в цикле перебираем все папки:
    foreach (var folder in client.GetFolders(client.PersonalNamespaces[0])) {
        //return(folder.Name);
        project.SendInfoToLog(folder.Name.ToString());
        stringlist.Add(folder.Name.ToString());      
}
   
    client.Disconnect(true);
}
return String.Join(Environment.NewLine, stringlist);
На моей почте (это не яндекс) результат:
75550
 
  • Спасибо
Реакции: TeslaCo, BAZAg и Phoenix78

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Столкнулся с подобной задачей, оставлю тут ответ:
1. Качаем шаблон с готовыми библиотеками из топика VerBin:
mailkit.dll mimekit.dll yandex.ru перенос всех писем из спама в инбокс. пометить как важное. перенести в спам.
2. Вставляем там кубик C# отдельный, который и будем запускать:
C#:
List<string> stringlist = new List<string>();
string email = project.Variables["EMAIL"].Value;
string password = project.Variables["PASSWORD"].Value;

using (var client = new MailKit.Net.Imap.ImapClient()) {
    client.CheckCertificateRevocation = false;
    client.ServerCertificateValidationCallback = (s,c,h,e) => true;
    //client.ServerCertificateValidationCallback = (mysender, certificate, chain, sslPolicyErrors) => { return true; };
  
    client.Connect("imap.yandex.ru", 993, MailKit.Security.SecureSocketOptions.SslOnConnect);
    client.Authenticate(email, password);
  
    // в цикле перебираем все папки:
    foreach (var folder in client.GetFolders(client.PersonalNamespaces[0])) {
        //return(folder.Name);
        project.SendInfoToLog(folder.Name.ToString());
        stringlist.Add(folder.Name.ToString());     
}
  
    client.Disconnect(true);
}
return String.Join(Environment.NewLine, stringlist);
На моей почте (это не яндекс) результат:
Посмотреть вложение 75550
есть небольшое замечание.
Вот в этом месте
75551

Получение имени папки не вызовет ошибок, а вот если папку брать в работу и пытаться из нее что то считывать может возникнуть исключение , доступ запрещен к папке. причем так может возникнуть на любой папке, а так же может быть что следующие папки будут доступны, но код уже вылетел по ошибке.
Причем если возникает исключение то что бы вернуться к перебору папок, надо начинать с коннекта, так как он сбрасывается.
Мне пришлось сделать список недоступных папок и сделать еще один внешний цикл повтора прохождения по папкам , а так же проверку наличия имени папки в списке плохих папок.
вот такие костыли :-)
 
  • Спасибо
Реакции: BAZAg и orka13

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
есть небольшое замечание.
Вот в этом месте
Посмотреть вложение 75551

Получение имени папки не вызовет ошибок, а вот если папку брать в работу и пытаться из нее что то считывать может возникнуть исключение , доступ запрещен к папке. причем так может возникнуть на любой папке, а так же может быть что следующие папки будут доступны, но код уже вылетел по ошибке.
Причем если возникает исключение то что бы вернуться к перебору папок, надо начинать с коннекта, так как он сбрасывается.
Мне пришлось сделать список недоступных папок и сделать еще один внешний цикл повтора прохождения по папкам , а так же проверку наличия имени папки в списке плохих папок.
вот такие костыли :-)
Может поделитесь своим готовым фрагментом кода с сообществом, чтобы каждому по-отдельности не приходилось проходить Ваш путь?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Может поделитесь своим готовым фрагментом кода с сообществом, чтобы каждому по-отдельности не приходилось проходить Ваш путь?
да у меня там такие костыли что мама не горюй, сам чешу голову иногда :-)
про ошибки с папками интересует ?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
да у меня там такие костыли что мама не горюй, сам чешу голову иногда :-)
про ошибки с папками интересует ?
У меня пока таких ошибок нет (так как первый раз использую эту библиотечку). Но, в целом думаю инфа в теме не помешала бы - чтобы если вдруг появится, можно было сразу взять готовое решение и не думать о том, все ли исключения обработал, или ещё чего-то может вылезти.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
готовое решения вряд ли будет, так как у каждого свои задачи для работы с почтой. тупо чекнуть, или принять или из спама в инбокс переложить... ну и тд и тд.
ну суть в общем одна. оборачиваем весь код в try{}catch{} используем метки для удачных/неудачных действий и все это оборачиваем в цикл попыток.
я щас глянул свой код, и ужаснулся :-) такое точно выкладывать не буду :-)
Я при приеме письма, сделал 2 ветки. при первом проходе считывает только с инбокса и спама. все остальные проходы в цикле перебирает папки. если возникает ошибка то папку добавляю в плохие и уменьшаю попытки. что бы не превратилось в мертвый цикл , то в начале цикла чекаю время работы. 200 секунд. при получении папки в работу чекаю имя папки в плохих.
77274

честно говоря костыль на костыле :ca:
 
  • Спасибо
Реакции: DevOps и BAZAg

DevOps

Client
Регистрация
30.11.2020
Сообщения
495
Благодарностей
311
Баллы
63
Спасибо. Решил тоже сделать почтовый чекер для проверки на нужное письмо. Фрагменты кода забрал себе, буду разбираться на досуге
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)