/
Andrey_Tishenkov
/
preparing_for_interviews
Обзор
Документация
Войти
/
Andrey_Tishenkov
/
preparing_for_interviews
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
mail_ref_code.py
142 строки
6 KB
Andrey_Tishenkov
upload files
07 ноя 2025, 20:38
07 ноя 2025, 20:38
3c78ac3
Код
Авторство
О чём код?
import email import smtplib import imaplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart class EmailClient: # Класс для работы с почтой через Gmail. GMAIL_SMTP = "smtp.gmail.com" GMAIL_IMAP = "imap.gmail.com" SMTP_PORT = 587 def __init__(self, login, password): # Инициализация почтового клиента. # Аргументы по Google Docstring: # Args: # login (str): Логин/email пользователя # password (str): Пароль от почтового ящика или пароль приложения self.login = login self.password = password def send_message(self, recipients, subject, message): # Отправка письма. # Аргументы по Google Docstring: # Args: # recipients (list): Список получателей # subject (str): Тема письма # message (str): Текст письма # # Исключения: # Raises: # SMTPAuthenticationError: Ошибка аутентификации # SMTPException: Другие ошибки SMTP try: # Создание сообщения email_message = MIMEMultipart() email_message['From'] = self.login email_message['To'] = ', '.join(recipients) email_message['Subject'] = subject email_message.attach(MIMEText(message)) # Отправка через SMTP with smtplib.SMTP(self.GMAIL_SMTP, self.SMTP_PORT) as server: server.ehlo() server.starttls() server.ehlo() server.login(self.login, self.password) server.sendmail( self.login, recipients, email_message.as_string() ) print(f"Письмо успешно отправлено получателям: {recipients}") except smtplib.SMTPAuthenticationError: print("Ошибка аутентификации. Проверьте:") print("1. Правильность логина и пароля") print("2. Для Gmail был введён пароль приложения") print("3. Включены ли настройки доступа для ненадежных приложений") raise except smtplib.SMTPException as e: print(f"Ошибка при отправке письма: {e}") raise def receive_message(self, header=None, mailbox="inbox"): # Получение последнего письма. # Аргументы по Google Docstring: # Args: # header (str, optional): Заголовок для фильтрации писем # mailbox (str): Папка для поиска писем # # Возвращаемые объекты: # Returns: # email.message.Message: Объект письма # # Исключения: # Raises: # IMAP.error: Ошибки IMAP соединения # ValueError: Нет писем с указанным заголовком try: # Получение письма через IMAP with imaplib.IMAP4_SSL(self.GMAIL_IMAP) as mail: mail.login(self.login, self.password) mail.select(mailbox) criterion = '(HEADER Subject "%s")' % header if header else 'ALL' result, data = mail.uid('search', None, criterion) if not data[0]: raise ValueError('There are no letters with current header') latest_email_uid = data[0].split()[-1] result, data = mail.uid('fetch', latest_email_uid, '(RFC822)') raw_email = data[0][1] email_message = email.message_from_bytes(raw_email) print(f"Письмо получено успешно! Тема: {email_message.get('Subject', 'Без темы')}") return email_message except imaplib.IMAP4.error as e: print(f"Ошибка IMAP соединения: {e}") raise except Exception as e: print(f"Ошибка при получении письма: {e}") raise if __name__ == '__main__': # Проверка работы класса с тестовыми данными # Для тестирования работы ЗАМЕНИТЕ эти значения на реальные login = 'your_email@gmail.com' # Замените на ваш email password = 'your_app_password' # Замените на ваш пароль или пароль приложения email_client = EmailClient(login, password) # Тестовые данные для отправки recipients = ['test_1@x-mail.com', 'test_2@x-mail.com'] # Замените на реальные адреса subject = 'Тестовое письмо' message = 'Это тестовое письмо, отправленное через EmailClient.' try: # Отправка письма email_client.send_message(recipients, subject, message) # Получение письма received_email = email_client.receive_message() except Exception as e: print(f"Произошла ошибка: {e}") print("\nДля Gmail необходимо:") print("1. Включить двухфакторную аутентификацию") print("2. Создать пароль приложения в настройках аккаунта Google") print("3. Использовать этот пароль приложения вместо обычного пароля") print("4. Убедиться, что разрешен доступ для 'ненадежных приложений'")