8.1 Читаємо пошту

Думаю, ми вже достатньо розібралися з основами роботи мережі. Давайте займемося чимось більш цікавим — адже в мережі стільки всього цікавого. Як щодо читання і відправлення пошти?

Електронна пошта з'явилася 50 років тому, за 20 років до появи першого браузера. Тоді для відправки пошти використовували спеціальні програми. Що це означає для нас? А те, що стандарт (протокол) роботи з поштою простий як три копійки.

Протокол POP3 (Post Office Protocol version 3) використовується для отримання електронної пошти з поштового сервера. На відміну від IMAP, POP3 зазвичай завантажує листи на локальний комп'ютер і видаляє їх з сервера. У Python для роботи з POP3 можна використовувати бібліотеку poplib.

Примітка: На відміну від POP3, протокол IMAP (Internet Message Access Protocol) дозволяє зберігати листи на сервері та синхронізувати їх стан між пристроями. IMAP більш зручний, якщо ви читаєте пошту з різних пристроїв, тоді як POP3 краще підходить для зберігання листів локально на одному пристрої.

Основні кроки для отримання списку листів:

  • Підключення до поштового сервера.
  • Аутентифікація.
  • Отримання списку листів.
  • Завантаження та читання листів.
  • Відключення від сервера.

Для написання першого додатка нам знадобляться дві бібліотеки: poplib і email. Якщо у вас їх немає — встановіть. Як користуватися pip менеджером ви вже знаєте.

Важливо: При роботі з електронною поштою завжди дотримуйтесь заходів безпеки. Ніколи не зберігайте паролі у відкритому вигляді в коді. Використовуйте змінні оточення або захищені сховища для облікових даних. Також переконайтеся, що ваш код не потрапить в публічний доступ, щоб уникнути витоку конфіденційної інформації.

1. Підключення та аутентифікація:

Підключаємося до поштового сервера через SSL і входимо в поштову скриньку з зазначеними обліковими даними.


mailbox = poplib.POP3_SSL(pop3_server)
mailbox.user(username)
mailbox.pass_(password)  # Використовуємо pass_ для уникнення конфлікту з ключовим словом pass в Python

2. Отримання інформації про поштову скриньку:

Отримуємо кількість листів у поштовій скриньці.


num_messages = len(mailbox.list()[1])
print(f"Кількість листів: {num_messages}")

3. Завантаження та читання листів:

Завантажуємо і читаємо останній лист.


# Приклад: Читання останнього листа
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("Вміст останнього листа:")
    print(message)

Для парсингу та відображення вмісту є спеціальна бібліотека — email. Вона може декодувати вміст листів, додатків до них, включаючи заголовки і тіло листа.

Ось як виглядатиме фінальний варіант нашого поштового клієнта.


import poplib

# Облікові дані для входу
username = 'your_email@example.com'
password = 'your_password'
            
# Підключення до поштового сервера Gmail
pop3_server = 'pop.gmail.com'
mailbox = poplib.POP3_SSL(pop3_server, 995)
            
# Вхід у поштову скриньку
mailbox.user(username)
mailbox.pass_(password)  # Використовуємо pass_ для уникнення конфлікту з ключовим словом pass в Python
            
# Отримання інформації про поштову скриньку
num_messages = len(mailbox.list()[1])
print(f"Кількість листів: {num_messages}")
            
# Приклад: Читання останнього листа
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("Вміст останнього листа:")
    print(message)
            
# Закриття з'єднання
mailbox.quit()

Можете спробувати прочитати ваші листи, тільки вкажіть правильний POP3-сервер. Наприклад, у прикладі вище я вказав дані сервера Gmail. Якщо у вас інший поштовий сервер, то його дані легко знайти в інтернеті.

8.2 Відправляємо пошту

Для відправки електронної пошти за допомогою протоколу SMTP (Simple Mail Transfer Protocol) у Python можна використовувати вбудовану бібліотеку smtplib. Цей модуль надає функції для встановлення з'єднання з SMTP-сервером, аутентифікації та відправки листів.

Основні кроки відправки пошти:

  • Підключення до SMTP-сервера.
  • Аутентифікація.
  • Формування повідомлення.
  • Відправка повідомлення.
  • Закриття з'єднання.

1. Підключення до SMTP-сервера:

Підключаємося до SMTP-сервера і переключаємося на захищене з'єднання з допомогою TLS.


server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()  # Захищене з'єднання

2. Аутентифікація:

Входимо на SMTP-сервер з використанням облікових даних.


server.login(username, password)

3. Формування простого повідомлення у форматі строки:


message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"

4. Відправка повідомлення:


server.sendmail(from_addr, to_addr, message)

5. Закриття з'єднання:


server.quit()

Виглядає простіше, ніж минулого разу, що не може не тішити.

Весь код разом з обробкою помилок буде виглядати так:


import smtplib

# Облікові дані для входу
smtp_server = 'smtp.gmail.com'
smtp_port = 587
username = 'your_email@gmail.com'
password = 'your_app_password'  # Використовуйте пароль додатка
            
# Адреси відправника і одержувача
from_addr = 'your_email@gmail.com'
to_addr = 'recipient@example.com'
            
# Тема і тіло листа
subject = 'Тема листа'
body = 'Це текст листа.'
            
# Формування повідомлення у форматі строки
message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"
            
try:
    # Підключення до SMTP-сервера
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # Захищене з'єднання
            
    # Аутентифікація
    server.login(username, password)
            
    # Відправка повідомлення
    server.sendmail(from_addr, to_addr, message)
    print("Лист успішно відправлено!")
except Exception as e:
    print(f"Помилка при відправці листа: {e}")
finally:
    # Закриття з'єднання
    server.quit()

Більша частина коду тут — це коментарі і налаштування сервера, реально можна відправити листа в 5 рядків. Спробуйте — це дуже цікаво.