0

Работа с EMail

Как читать электронные письма в Python?

В ходе моего учебного процесса на паре было опробовано приложение, которое позволяло читать мои электронные письма, их удалять, писать и отправлять кому-либо от моего имени, как единичным письмом, так и рассылкой. Все это было реализовано с помощью встроенного модуля imaplib. Что вообще такое IMAP? IMAP — это стандартный протокол Интернета, который используется почтовыми клиентами для получения сообщений электронной почты с почтового сервера.
Начать я бы хотел с чтения отправленных мне писем. Для этого, нам не нужно ничего устанавливать, все модули, которые используются в этом руководстве, являются встроенными:

Для того чтобы читать электронные письма, можно использовать вот этот код:

import imaplib
import email
from email.header import decode_header
import webbrowser
import os

# учетные данные
username = ""
password = "password"

def clean(text):
    # чистый текст для создания папки
    return "".join(c if c.isalnum() else "_" for c in text)
# create an IMAP4 class with SSL
imap = imaplib.IMAP4_SSL("imap.gmail.com")
# authenticate
imap.login(username, password)
status, messages = imap.select("INBOX")
# количество популярных писем для получения
N = 1

# общее количество писем
messages = int(messages[0])
for i in range(messages, messages-N, -1):
    # fetch the email message by ID
    res, msg = imap.fetch(str(i), "(RFC822)")
    for response in msg:
        if isinstance(response, tuple):
            # parse a bytes email into a message object
            msg = email.message_from_bytes(response[1])
            # decode the email subject
            subject, encoding = decode_header(msg["Subject"])[0]
            if isinstance(subject, bytes):
                # if it's a bytes, decode to str
                subject = subject.decode(encoding)
            # decode email sender
            From, encoding = decode_header(msg.get("From"))[0]
            if isinstance(From, bytes):
                From = From.decode(encoding)
            print("Subject:", subject)
            print("From:", From)
            # if the email message is multipart
            if msg.is_multipart():
                # iterate over email parts
                for part in msg.walk():
                    # extract content type of email
                    content_type = part.get_content_type()
                    content_disposition = str(part.get("Content-Disposition"))
                    try:
                        # get the email body
                        body = part.get_payload(decode=True).decode()
                    except:
                        pass
                    if content_type == "text/plain" and "attachment" not in content_disposition:
                        # print text/plain emails and skip attachments
                        print(body)
                    elif "attachment" in content_disposition:
                        # download attachment
                        filename = part.get_filename()
                        if filename:
                            folder_name = clean(subject)
                            if not os.path.isdir(folder_name):
                                # make a folder for this email (named after the subject)
                                os.mkdir(folder_name)
                            filepath = os.path.join(folder_name, filename)
                            # download attachment and save it
                            open(filepath, "wb").write(part.get_payload(decode=True))
            else:
                # extract content type of email
                content_type = msg.get_content_type()
                # get the email body
                body = msg.get_payload(decode=True).decode()
                if content_type == "text/plain":
                    # print only text email parts
                    print(body)
            if content_type == "text/html":
                # if it's HTML, create a new HTML file and open it in browser
                folder_name = clean(subject)
                if not os.path.isdir(folder_name):
                    # make a folder for this email (named after the subject)
                    os.mkdir(folder_name)
                filename = "index.html"
                filepath = os.path.join(folder_name, filename)
                # write the file
                open(filepath, "w").write(body)
                # open in the default browser
                webbrowser.open(filepath)
            print("="*100)
# close the connection and logout
imap.close()
imap.logout()

Как удалить электронные письма в Python?

Для того чтобы удалять электронные письма, можно использовать вот этот код:

import imaplib
import email
from email.header import decode_header

# учетные данные
username = ""
password = "password"
# create an IMAP4 class with SSL
imap = imaplib.IMAP4_SSL("imap.gmail.com")
# authenticate
imap.login(username, password)
# select the mailbox I want to delete in
# if you want SPAM, use imap.select("SPAM") instead
imap.select("INBOX")
# поиск определенных писем по отправителю
status, messages = imap.search(None, "FROM", "")

# преобразовать сообщения в список адресов электронной почты
messages = messages[0].split(b' ')
try:
    for mail in messages:
        _, msg = imap.fetch(mail, "(RFC822)")
        # вы можете удалить цикл for для повышения производительности, если у вас длинный список писем
        # потому что он предназначен только для печати SUBJECT целевого электронного письма, которое нужно удалить
        for response in msg:
            if isinstance(response, tuple):
                msg = email.message_from_bytes(response[1])
                # расшифровать тему письма
                subject = decode_header(msg["Subject"])[0][0]
                if isinstance(subject, bytes):
                    # if it's a bytes type, decode to str
                    subject = subject.decode()
                print("Deleting", subject)
        # отметить письмо как удаленное
        imap.store(mail, "+FLAGS", "\\Deleted")
except:
    print("Все удаленно")
    # навсегда удалить письма, помеченные как удаленные
    # из выбранного почтового ящика (в данном случае INBOX)
    imap.expunge()

    # закрыть почтовый ящик
    imap.close()

    # выйти из аккаунта
    imap.logout()

Как отправлять электронные письма с Python?

Для того чтобы отправлять электронные письма, можно использовать вот этот код:

import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from bs4 import BeautifulSoup as bs

# ваши учетные данные
email = "uru07082000"
password = "password"

# электронная почта отправителя
FROM = ""

# адрес электронной почты получателя
TO = ""

# тема письма (тема)
subject = "Test"

# инициализируем сообщение, которое хотим отправить
msg = MIMEMultipart("alternative")

# установить адрес электронной почты отправителя
msg["From"] = FROM

# установить адрес электронной почты получателя
msg["To"] = TO

# задаем тему
msg["Subject"] = subject

# установить тело письма как HTML
html = """
Mail Python!
"""
# делаем текстовую версию HTML
text = bs(html, "html.parser").text

text_part = MIMEText(text, "plain")
html_part = MIMEText(html, "html")

# прикрепить тело письма к почтовому сообщению
# сначала прикрепите текстовую версию
msg.attach(text_part)
msg.attach(html_part)

print(msg.as_string())


def send_mail(email, password, FROM, TO, msg):
    # инициализировать SMTP-сервер
    server = smtplib.SMTP("smtp.gmail.com", 587)
    # подключиться к SMTP-серверу в режиме TLS (безопасный) и отправить EHLO
    server.starttls()
    # войти в учетную запись, используя учетные данные
    server.login(email, password)
    # отправить электронное письмо
    server.sendmail(FROM, TO, msg.as_string())
    # завершить сеанс SMTP
    server.quit()


send_mail(email, password, FROM, TO, msg)

Также можно делать рассылки с помощью этого кода:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from bs4 import BeautifulSoup as bs


to_list = ['', '']


def send_mail(email, password, FROM, TO, msg):
    # инициализировать SMTP-сервер
    server = smtplib.SMTP("smtp.gmail.com", 587)
    # подключиться к SMTP-серверу в режиме TLS (безопасный) и отправить EHLO
    server.starttls()
    # войти в учетную запись, используя учетные данные
    server.login(email, password)
    # отправить электронное письмо
    server.sendmail(FROM, TO, msg.as_string())
    # завершить сеанс SMTP
    server.quit()


for recipient in to_list:
    # ваши учетные данные
    email = ""
    password = "password"
    # электронная почта отправителя
    FROM = ""
    # адрес электронной почты получателя
    TO = recipient
    # тема письма (тема)
    subject = "Прикол"

    # инициализируем сообщение, которое хотим отправить
    msg = MIMEMultipart("alternative")
    # установить адрес электронной почты отправителя
    msg["From"] = FROM
    # установить адрес электронной почты получателя
    msg["To"] = TO
    # задаем тему
    msg["Subject"] = subject

    # установить тело письма как HTML
    html = """
    Рассылка - Пока!!!!!
    """
    # делаем текстовую версию HTML
    text = bs(html, "html.parser").text

    text_part = MIMEText(text, "plain")
    html_part = MIMEText(html, "html")
    # прикрепить тело письма к почтовому сообщению
    # сначала прикрепите текстовую версию
    msg.attach(text_part)
    msg.attach(html_part)

    # отправить почту
    send_mail(email, password, FROM, TO, msg)

 

 

 

Уржунцев Юрий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *