Живой скрипт Python не работает для проверки новых писем в GmailPython

Программы на Python
Гость
Живой скрипт Python не работает для проверки новых писем в Gmail

Сообщение Гость »


Я пытаюсь создать сценарий приложения для анализа новых входящих писем. Я проверил свой сценарий на уже существующих электронных письмах от определенного отправителя, и он работает нормально, но поскольку я изменил его в работающий сценарий, он выдает мне сообщение об ошибке: Произошла ошибка: кодек 'utf-8' не может декодировать байт 0xa9 в позиции 802: недопустимый начальный байт

Ниже приведен код для этого:

импортировать imaplib импортировать электронную почту импортировать повторно импортировать ЯМЛ из даты и времени импорта даты и времени время импорта # Функция для извлечения промокода из тела письма защита Extract_promo_code (тело): promo_code_pattern = r'(?s)Enter (?:code|promo).*?\b([A-Z\d]{10,})' match = re.search(promo_code_pattern, body, re.MULTILINE) если совпадение: вернуть match.group(1) еще: возврат Нет # Функция для извлечения даты истечения срока действия из тела электронного письма защита Extract_expiry_date (тело): expiry_date_pattern = r'Предложение действительно до ([A-Za-z]+ \d{1,2}, \d{4})' match = re.search(expiry_date_pattern, body) если совпадение: original_date = match.group(1) parsed_date = datetime.strptime(original_date, '%B %d, %Y') formatted_date = parsed_date.strftime('%d/%m/%Y') вернуть форматированную_дату еще: возврат Нет # Чтение учетных данных из файла YAML с open('credentials.yaml') как f: содержимое = f.read() my_credentials = yaml.load(content, Loader=yaml.FullLoader) пользователь, пароль = my_credentials['пользователь'], my_credentials['пароль'] imap_url = 'imap.gmail.com' пока правда: пытаться: my_mail = imaplib.IMAP4_SSL (imap_url) my_mail.login(пользователь, пароль) my_mail.select('Входящие') _, данные = my_mail.search(Нет, «ВСЕ») mail_id_list = данные[0].split() для числа в mail_id_list: тип, данные = my_mail.fetch(num, '(RFC822)') сообщения = [] для сообщения в данных: если isinstance(msg, кортеж): my_msg = email.message_from_bytes(msg[1]) # Инициализируем поля данных msg_to = my_msg['to'] дата = my_msg['дата'] истечение_даты = Нет тема = my_msg['тема'] промо_код = Нет исключения = нет поставщик = "Идентификатор поставщика" message_id = my_msg['Идентификатор-сообщения'] # Извлечь промокод из тела письма для части my_msg.walk(): если part.get_content_type() == 'текст/обычный': body = part.get_payload(decode=True).decode('utf-8') промо_код = экстракт_промо_код(тело) # Извлечь исключения, если они есть (вы можете изменить эту часть) exclusions_match = re.search(r'\*\s*ИСКЛЮЧЕНИЯ И ОТКАЗЫ От ОТВЕТСТВЕННОСТИ\s*(.*?)Применяются некоторые исключения\.', body, re.IGNORECASE | re.MULTILINE | re.DOTALL) если исключения_соответствие: исключения = exclusions_match.group(1).strip() # Извлечь дату истечения срока действия из тела электронного письма expiry_date = extract_expiry_date(тело) # Проверьте, был ли найден промокод, прежде чем распечатывать или сохранять извлеченные данные если промо_код: # Распечатайте или сохраните извлеченные данные Распечатать('______________________________') print("msg_to:", msg_to) print("дата:", дата) print("expiry_date:", expiry_date) print("тема:", тема) print("промо_код:", промо_код) print("исключения:", исключения) print("поставщик:", поставщик) print("идентификатор_сообщения:", идентификатор_сообщения) Распечатать('______________________________') # Закрываем почтовый ящик my_mail.logout() # Поспите немного, прежде чем снова проверять наличие новых писем. time.sleep(60) # Спим на 60 секунд перед повторной проверкой кроме исключения как e: print(f"Произошла ошибка: {str(e)}") Код вызывает исключение каждые 60 секунд, даже если электронное письмо не получено. Я просто хочу, чтобы он проверял наличие новых входящих писем, которые не были прочитаны, и извлекал из них необходимые данные, если они существуют.

Вернуться в «Python»