Асинхронная Python библиотека для работы с IMAP протоколом. Упрощает получение и поиск электронных писем с поддержкой прокси и различных почтовых сервисов.
- Асинхронная работа с IMAP серверами
- Поддержка прокси через better-proxy
- Автоматическое определение настроек IMAP по email адресу
- Гибкие возможности поиска и фильтрации писем
- Поддержка различных почтовых провайдеров
pip install better-imapimport asyncio
from better_imap import MailBox
async def main():
# Создание подключения к почтовому ящику
async with MailBox("user@example.com", "password") as mailbox:
# Получение всех писем
messages = await mailbox.fetch_messages()
for message in messages:
print(f"От: {message.sender}")
print(f"Тема: {message.subject}")
print(f"Дата: {message.date}")
print(f"Текст: {message.text[:100]}...")
print("-" * 50)
asyncio.run(main())import asyncio
from datetime import datetime, timedelta
from better_imap import MailBox
async def main():
async with MailBox("user@example.com", "password") as mailbox:
# Поиск писем за последние 7 дней
since_date = datetime.now() - timedelta(days=7)
messages = await mailbox.fetch_messages(
search_criteria="ALL",
since=since_date,
allowed_senders=["@important-sender.com"],
folders=["INBOX", "Sent"]
)
print(f"Найдено {len(messages)} писем")
asyncio.run(main())import asyncio
import re
from better_imap import MailBox
async def main():
async with MailBox("user@example.com", "password") as mailbox:
# Поиск писем содержащих код подтверждения
pattern = r'\b\d{4,6}\b' # 4-6 цифр подряд
matches = await mailbox.search_matches(
regex=pattern,
folders=["INBOX"],
search_criteria="UNSEEN"
)
for message in matches:
print(f"Код найден в письме от {message.sender}")
# Извлечение кода из текста
code = re.search(pattern, message.text).group()
print(f"Код подтверждения: {code}")
asyncio.run(main())import asyncio
from better_imap import MailBox
from better_proxy import Proxy
async def main():
# Настройка прокси
proxy = Proxy.from_str("http://user:pass@proxy-server.com:8080")
async with MailBox("user@example.com", "password", proxy=proxy) as mailbox:
messages = await mailbox.fetch_messages()
print(f"Получено {len(messages)} писем через прокси")
asyncio.run(main())import asyncio
from better_imap import MailBox
async def main():
async with MailBox("user@example.com", "password") as mailbox:
# Ожидание письма с кодом подтверждения в течение 5 минут
try:
message = await mailbox.search_with_retry(
regex=r'\b\d{6}\b', # 6-значный код
timeout=300, # 5 минут
interval=10 # проверка каждые 10 секунд
)
if message:
print("Код подтверждения получен!")
print(f"Текст: {message.text}")
else:
print("Письмо не найдено за указанное время")
except Exception as e:
print(f"Ошибка при поиске: {e}")
asyncio.run(main())address(str) - Email адрес для подключенияpassword(str) - Пароль от почтового ящикаservice(ServiceType, optional) - Настройки IMAP сервера (определяется автоматически)use_firstmail_on_unknown_domain(bool) - Использовать FirstMail для неизвестных доменовproxy(Proxy, optional) - Прокси сервер для подключенияtimeout(float) - Таймаут операций в секундах (по умолчанию 10)loop(asyncio.AbstractEventLoop, optional) - Event loop для асинхронных операций
Основной метод для получения писем с различными фильтрами:
folders- Список папок для поиска (по умолчанию ["INBOX"])search_criteria- Критерии поиска IMAP ("ALL", "UNSEEN")since- Поиск писем с указанной датыallowed_senders- Список разрешенных отправителей (regex паттерны)allowed_receivers- Список разрешенных получателей (regex паттерны)sender_regex- Регулярное выражение для фильтрации отправителей
Поиск писем по регулярному выражению в тексте письма.
Поиск одного письма по регулярному выражению.
Поиск письма с повторными попытками в течение заданного времени.
Библиотека предоставляет специализированные исключения:
IMAPLoginFailed- Ошибка авторизацииIMAPSearchTimeout- Таймаут при поискеWrongIMAPAddress- Неправильный IMAP адрес
import asyncio
from better_imap import MailBox
from better_imap.errors import IMAPLoginFailed, IMAPSearchTimeout
async def main():
try:
async with MailBox("user@example.com", "wrong_password") as mailbox:
messages = await mailbox.fetch_messages()
except IMAPLoginFailed:
print("Неверные учетные данные")
except IMAPSearchTimeout:
print("Превышено время ожидания поиска")
asyncio.run(main())MIT License