нельзя использовать строковый шаблон в байтовоподобном объекте в Outlook API - PullRequest
0 голосов
/ 02 мая 2020

Я использую сценарий main.py (который зависит от другого сценария: functions.py и txt-файла для учетных данных), но сценарий не работает: ошибка: не может использовать строковый шаблон в байтовоподобном объекте (список содержит байты id_list)

Main.py

import email
import imaplib
from bs4 import BeautifulSoup
from functions import array_from_csv
from functions import get_imap_server
from functions import parse_uid


def move_and_print_junk(login):
    try:
        user = login[0]
        password = login[1]
        imap_server = get_imap_server(user)

        client = imaplib.IMAP4_SSL(imap_server)
        client.login(user, password)
        client.select("junk")

        # get email ids
        _, data = client.search(None, 'ALL')
        mail_ids = data[0]
        id_list = mail_ids.split()
        id_list.reverse()

        # iterate over ids, fetch messages and print them
        for id in id_list:
            client.select(mailbox='junk', readonly=False)
            resp, data = client.fetch(id, "(UID)")
            msg_uid = parse_uid(data[0])

            result = client.uid('COPY', msg_uid, 'inbox')

            if result[0] == 'OK':
                mov, data = client.uid('STORE', msg_uid, '+FLAGS', '(\Deleted)')
                client.expunge()

        client.select("inbox")

        _, data = client.search(None, '(UNSEEN)')
        mail_ids = data[0]
        id_list = mail_ids.split()
        id_list.reverse()

        # iterate over ids, fetch messages and print them
        for id in id_list:
            resp, data = client.fetch(id, "(RFC822)")

            email_body = data[0][1]

            mail = email.message_from_string(email_body)

            try:
                soup = BeautifulSoup(mail.get_payload()[0].get_payload(), 'html.parser')
                print(soup.get_text())
            except:
                soup = BeautifulSoup(mail.get_payload(), 'html.parser')
                print(soup.get_text())

        client.logout()
    except Exception as error:
        print('\033[1;31mACCOUNT: {}  ERROR: \033[1;m'.format(login[0]) + str(error))
    else:
        print('\033[1;32m\nACCOUNT {} is DONE!\n\033[1;m'.format(account[0]))


login = array_from_csv('accounts')

print("\n{} accounts to process\n".format(len(login)))
print("Processing Begins:\n")

for account in login:
    move_and_print_junk(account)

Funtions.py

import csv
import re
import sys
pattern_uid = re.compile('\d+ \(UID (?P<uid>\d+)\)')


def parse_uid(data):
    match = pattern_uid.match(data)
    return match.group('uid')


def array_from_csv(filename):  # function that reads data from csv files
    with open('{}.txt'.format(filename), 'rU') as f:  # open file
        reader = csv.reader(f, delimiter=",")  # create reader object
        read_raw = list(reader)  # read raw data
    data = read_raw  # store raw data

    result = []  # create list object to properly format data
    for row_index in range(len(data)):
        result.append([])
        for index in range(len(data[row_index])):
            result[row_index].append(data[row_index][index])
    return result


def get_imap_server(email):
    if 'outlook' in email or 'hotmail' in email or 'windowslive' in email:
        imap_server = 'imap-mail.outlook.com'
    elif 'gmail' in email:
        imap_server = 'imap.gmail.com'
    else:
        print("Error: email {} is not Google or Microsoft (not supported)".format(email))
        sys.exit()
    return imap_server

Account.txt

myemail@hotmail.fr, mypassword

Ошибка:

ошибка: невозможно использовать строковый шаблон для байтовоподобных объект (список, содержащий байты - id_list)

...