Совет Как

Как программно получить файл из почты (через протоколы IMAP или POP3)?

Для получения файлов из электронной почты используются протоколы IMAP или POP3. Оба протокола позволяют получать и отправлять электронные сообщения, но есть небольшие отличия в их работе.

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

IMAP

IMAP (англ. Internet Message Access Protocol) - это протокол получения электронной почты. Используя IMAP можно подключиться к любому почтовому серверу и просмотреть не только заголовки писем, но и их содержимое. IMAP сохраняет письма на сервере, а не на вашем устройстве. Это позволяет работать с почтой с разных устройств, где вы будете видеть одинаковые письма.

Чтобы получить файл из IMAP, необходимо выполнить следующие шаги:

  1. Подключиться к почтовому серверу
import imaplib

server = 'imap.gmail.com'
username = 'example@gmail.com'
password = 'password'

mail = imaplib.IMAP4_SSL(server)
mail.login(username, password)
  1. Выбрать папку, в которой находится нужное сообщение
mailbox = 'INBOX'
mail.select(mailbox)
  1. Отфильтровать сообщения, чтобы осталось только те, которые содержат нужный файл
result, data = mail.uid('search', None, 'SUBJECT "Subject of the email"')
  1. Получить UID первого письма с нужным заголовком
latest_email_uid = data[0].split()[0]
  1. Подключиться к новому сообщению и получить его содержимое
result, data = mail.fetch(latest_email_uid, '(RFC822)')
raw_email = data[0][1].decode('utf-8')
  1. Разобрать содержимое сообщения, чтобы получить содержимое файла
import email
import os

email_message = email.message_from_string(raw_email)

for part in email_message.walk():
    if part.get_content_type() == "application/octet-stream":
        filename = part.get_filename()
        if filename:
            if not os.path.isdir(folder):
                os.makedirs(folder)
            filepath = os.path.join(folder, filename)
            open(filepath, 'wb').write(part.get_payload(decode=True))

POP3

POP3 (англ. Post Office Protocol version 3) - это более старый протокол для получения электронной почты. Он скачивает полные сообщения на клиент, что может занять много места. Также, после скачивания сообщение удаляется с сервера. Но POP3 может быть полезен, если нужна быстрая загрузка сообщений.

Чтобы получить файл из POP3, необходимо выполнить следующие шаги:

  1. Подключиться к почтовому серверу
import poplib

server = 'pop.gmail.com'
username = 'example@gmail.com'
password = 'password'

mail = poplib.POP3_SSL(server)
mail.user(username)
mail.pass_(password)
  1. Выбрать папку, в которой находится нужное сообщение
mailbox = 'INBOX'
numMessages = len(mail.list()[1])
msgList = mail.list()

for i in reversed(range(numMessages)):
    mailNum, size = msgList[1][i].decode().split(' ')
    response, headerLines = mail.top(mailNum, 0)
    for j in range(len(headerLines)):
        if headerLines[j].decode("utf-8").startswith('Subject: '):
            if 'Subject of the email' in headerLines[j].decode("utf-8"):
                response, message = mail.retr(mailNum)
  1. Разобрать содержимое сообщения, чтобы получить содержимое файла
import email
import os

raw_email = '\n'.join(map(lambda x: x.decode(), message))

email_message = email.message_from_string(raw_email)

for part in email_message.walk():
    if part.get_content_type() == "application/octet-stream":
        filename = part.get_filename()
        if filename:
            if not os.path.isdir(folder):
                os.makedirs(folder)
            filepath = os.path.join(folder, filename)
            open(filepath, 'wb').write(part.get_payload(decode=True))

Вот и все! Теперь вы знаете, как получить файл из почты с помощью протоколов IMAP или POP3. Успешной работы!