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 рядків. Спробуйте — це дуже цікаво.