JavaRush /Курсы /Модуль 1: Python Core /Работа с почтой

Работа с почтой

Модуль 1: Python Core
13 уровень , 7 лекция
Открыта

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 строчек. Попробуйте — это очень интересно.

2
Задача
Модуль 1: Python Core, 13 уровень, 7 лекция
Недоступна
Чтение почты с POP3-сервера
Чтение почты с POP3-сервера
2
Задача
Модуль 1: Python Core, 13 уровень, 7 лекция
Недоступна
Отправка почты с использованием SMTP
Отправка почты с использованием SMTP
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 35
11 июля 2025
- подключаемся к почтовому серверу через SSL Что такое SSL? - Для парсинга и отображения содержимого есть специальная библиотека — email. Она может декодировать содержимое писем, приложений к ним, включая заголовки и тело письма. Рассказывать про нее мы конечно же не будем. Лекция абсолютно пустая: - вот знаете есть трактор? Сейчас мы его разберём. Вот это болт, а вот это гаечный ключ. Ну собственно вы поняли как собрать трактор.
Виталий Уровень 33
22 июня 2025
Работа с переменными окружения: 1. Создать файл `.env` в корне проекта и добавить в `.gitignore`, чтобы не попадал в репозиторий:

SMTP_USER="ваша@почта.ru"
SMTP_PASSWORD="ваш_пароль"
SMTP_SERVER="smtp.yandex.ru"
SMTP_PORT=465
2. Установить библиотеку `python-dotenv`:

pip install python-dotenv
3. В начале скрипта:

import os
from dotenv import load_dotenv

load_dotenv()  # Загружает переменные из .env

# Получение параметров
smtp_server = os.environ['SMTP_SERVER']
smtp_port = int(os.environ['SMTP_PORT'])
username = os.environ['SMTP_USER']
password = os.environ['SMTP_PASSWORD']
_den Уровень 67
13 апреля 2025
mailbox.retr(n) - это получить письмо под номером n (в данном случае — последнее). response - служебная инфа от сервера (например, "OK"). lines - список байтовых строк с телом письма. octets - размер письма в байтах (не особо нужен тут).
Денис Уровень 37
14 января 2025
ansible vault вам в переменные среды ) Мне вот любопытно, многие из дошедших сюда хотя бы про env переменные знали?)
Ivan Уровень 59
14 мая 2025
Несколько лекций назад было про запись и чтение в переменные среды, но что это такое и зачем нужно не объяснялось.
Денис Уровень 37
14 мая 2025
Переменные среды это глобальные для окружения значения на уровне системы к которым можно обратиться. Ну например $HOME вместо /home/megaPihar999 Это достаточно удобный метод конфигурации приложения, например в конфиге ты пишешь не жёсткие значения, а именно переменные среды, и значения подтягиваются уже в зависимости от того где именно это приложение работает, на локальной машине, или на дев окружении, или это прод. Ну и в гите не лежит какой ни будь password: 1234 А очень миленькая password: ${MY_AWESOME_PASSWORD} Удобно же)