CoderCastrov logo
CoderCastrov
Gmail

Как читать электронные письма из Gmail с помощью Python: Часть 3

Как читать электронные письма из Gmail с помощью Python: Часть 3
просмотров
3 мин чтение
#Gmail

Как получить токен доступа для Gmail с использованием Python для службы Pub/Sub: Часть 2

Чтение электронных писем довольно просто и может быть выполнено с использованием протокола IMAP. Вам нужно включить доступ IMAP в своей учетной записи Gmail. Вы можете прочитать руководство по включению IMAP в Gmail здесь

Gmail IMAP

Как получить доступ к IMAP имени пользователя и паролю?

Следуйте этим шагам ТОЛЬКО если у вас включена двухэтапная проверка

  1. В левой панели навигации нажмите Безопасность.
Страница безопасности Gmail для пароля приложения
  1. На панели "Вход в Google" нажмите Пароли приложений. Если потребуется, введите свой пароль.Примечание: Если вы не можете перейти на эту страницу, двухэтапная проверка:

Не настроена для вашей учетной записи Настроена только для ключей безопасности

  1. Убедитесь, что в раскрывающемся меню "Выберите приложение" выбрано "Почта" или "Другое (пользовательское имя)". Если вы выбрали "Почта", выберите компьютер или устройство из меню "Выберите устройство". Если вы выбрали "Другое (пользовательское имя)", введите название приложения
Настройка пароля приложения для электронной почты IMAP
  1. Нажмите Создать.

Сохраните эти учетные данные в файле .env


Пришло время писать код……

Напишите функцию для установления соединения с Gmail

#USER={ВАШ_EMAIL}
#PASSWORD={ВАШ_ПАРОЛЬ}
#IMAP_URL=imap.gmail.com

def build_connection(imap_url, username, password):

    # это делается для установления SSL-соединения с GMAIL
    con = imaplib.IMAP4_SSL(imap_url)

    # вход в систему под указанным пользователем
    con.login(username, password)

    # вызов функции для проверки электронной почты в этой папке
    con.select("Входящие")

    res, messages = con.select("INBOX")

    return con

Вы можете искать определенное письмо или непрочитанные письма в папке "Входящие" Gmail

connection = build_connection(imap_url=IMAP_URL, username=USER, password=PASSWORD)

Искать непрочитанные письма таким образом и получить идентификатор письма

result, data = connection.search(None, "UNSEEN")
email_id = data[0].decode().split(" ")[0]

ИЛИ искать с указанием строки темы и непрочитанных писем

result2, data2 = connection.search(None, "SUBJECT", f'"{ВАША_СТРОКА_ТЕМЫ}"', "UNSEEN")

Получив идентификатор письма, затем нужно извлечь информацию из письма.

Тело письма содержит информацию в формате html и text. Вам нужно искать их в теле письма.

def extract_all_emails(email_id, con):
    text_list = []
    res, msg = con.fetch(str(email_id), "(RFC822)")
    if res == "OK":
        for response in msg:
            if isinstance(response, tuple):
                msg = email.message_from_bytes(response[1])

                # Сохранить адрес электронной почты отправителя
                sender = msg["From"]
                # Сохранить тему письма
                subject = msg["Subject"]
                
                html = msg.get_payload()[1].get_payload()
                soup = BeautifulSoup(html, "lxml")

Здесь нам нужно использовать Beautiful Soup для очистки HTML. С помощью этой библиотеки данные могут быть легко разобраны.

Как удалить нежелательные HTML-кодированные шаблоны?

Вы можете написать функцию, в которой создадите словарь шаблонов. Здесь я использую библиотеку re и передаю словарь нежелательных шаблонов, которая вернет очищенный текст.

def basic_post_processing(results):
    """передайте список слов для базовой предварительной обработки текста    Args:        results (list): список слов    Returns:        str: исправленная строка    """

    rep = {
        "=E2=80=9D": " -дюймовый ",
        "=C2=A0": "",
        "/p>": "",
        "\r\n": "",
        "<=": "",
        "/u>": "",
        "span>": "",
        "=E2=80=93": "",
        "=\r\n": "",
        "<u>": "",
        "u>": "",
        "</u>": "",
        "</": "",
        "</p>": "",
        "=": "",
        "\r": "",
        "<": "",
        "\n": " ",
        ":": "",
        "b>": "",
        "p>":"",
        "/o":"",
        "op>":"",
        "o":"",
        "–":"-"
    }
    rep = dict((re.escape(k), v) for k, v in rep.items())
    pattern = re.compile("|".join(rep.keys()))
    basic_correction = pattern.sub(lambda m: rep[re.escape(m.group(0))], results)

    return basic_correction

Это шаблоны, которые я обнаружил в процессе очистки таблиц. Большая часть текста электронной почты оформлена в виде таблицы, и на основе этого в электронной почте содержится слишком много ненужных специальных символов.

Важные библиотеки

Подпишитесь на Muhammad Umer Javed на Medium. Если вам понравилась эта статья, поделитесь ею и оставьте комментарий ниже.

Вы можете связаться с ним на LinkedIn, Twitter, и Facebook**.**