SerW

pochta_serezhki_inbox.py

Nov 15th, 2020
2,782
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Задача: http://forum.ru-board.com/topic.cgi?forum=8&bm=1&topic=82194
  2. # Почта: username@yandex.ru / password
  3.  
  4. # TODO: после завершение - Убрать в настройках разрешение доступа по портальному паролю:
  5. # https://mail.yandex.ru/?uid=1130000012843751#setup/client
  6.  
  7. # Использованы материалы: https://eax.me/python-imap/
  8.  
  9. # Внешние зависимости:
  10. # pip install pandas
  11. # pip install tqdm
  12.  
  13.  
  14. # TODO: Добавить удаление дубликатов
  15.  
  16. import imaplib
  17. import email
  18. from email.message import EmailMessage
  19. import pandas as pd
  20. from tqdm import tqdm
  21.  
  22. print("\nStarted\n")
  23.  
  24. imap = imaplib.IMAP4_SSL('imap.yandex.ru')
  25. imap.login('username@yandex.ru', 'password')
  26.  
  27. # print(imap.list())
  28. imap.select("INBOX")
  29.  
  30. result, mail_ids = imap.search(None, 'ALL')
  31. mail_ids = mail_ids[0].split()
  32. # print(mail_ids)
  33.  
  34. contacts = pd.DataFrame(columns=['name', 'email', 'is_parsed'])
  35.  
  36. for mail_ids in tqdm(mail_ids):
  37.     status, data = imap.fetch(mail_ids, '(RFC822)')
  38.     msg = email.message_from_bytes(data[0][1], _class=EmailMessage)
  39.     # print(msg.items())
  40.     is_parsed = False
  41.     try:
  42.         name, addr = email.utils.parseaddr(msg['From'])
  43.         is_parsed = True
  44.     except Exception as e:
  45.         print(f"\nCannot parse msg['From']: '{msg['From']}'\n")
  46.         name = msg['From']
  47.         addr = ''
  48.     if is_parsed:
  49.         addr = addr.strip().lower()
  50.         if name:
  51.             name = name.strip()
  52.             decoded_string, charset = email.header.decode_header(name)[0]
  53.             if charset is not None:
  54.                 try:
  55.                     name = decoded_string.decode(charset)
  56.                 except UnicodeDecodeError:
  57.                     print(f"\nCannot decode name: '{name}'\n")
  58.                     name = ''
  59.             else:
  60.                 name = decoded_string
  61.     # print(f"\n{name}\t{addr}\t{is_parsed}")
  62.     contacts = contacts.append({'name': name, 'email': addr, 'is_parsed': is_parsed}, ignore_index=True)
  63.  
  64. with pd.ExcelWriter('pochta_serezhki_inbox.xlsx') as writer:
  65.     contacts.to_excel(writer, sheet_name='contacts', startrow=0, startcol=0)
  66.  
  67. print("\nCompleted\n")
  68.  
RAW Paste Data