Как получить сообщение электронной почты в учетной записи Outlook с помощью IMAP? - PullRequest
0 голосов
/ 06 мая 2020

Я попробовал одну программу-образец для получения сообщения электронной почты в учетной записи Outlook с использованием IMAP. В этой учетной записи у меня есть 20 папок, в которых получаются все сообщения электронной почты, кроме этих папок (контакт, календарь, задача), не получающих данные о своей ошибке сервера. Как исправить эту ошибку.

Код

import imaplib
import pprint
import email
import base64
import json
import re
import os
import fileinput
imap_host = 'outlook.office365.com'
imap_user = 'XXXXXXXXXXX'
imap_pass = 'XXXXXXXXXXXXX'


count = 0
file_path = 'geek.txt'
# connect to host using SSL
imap = imaplib.IMAP4_SSL(imap_host,993)

# login to server
l = imap.login(imap_user, imap_pass)

# Get Flags,mailbox_name,delimiter using regex 
list_response_pattern = re.compile(r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)')

# Get List of Sync folders
list_data = imap.list()

# Check Local Storage is empty Sync All Folders Details.
print(os.stat(file_path).st_size)
if os.stat(file_path).st_size == 0:
    global day
    # Iterate folders in Sync folder
    for i in list_data[1]:
        # Get Folder name
        sample = re.findall('"\/"(.*)',i.decode("utf-8"))
        # Get Message_ids
        try:
            print("message")
            print(sample[0].lstrip().strip('"'))
            data = imap.select(sample[0].lstrip())
            search_resp, search_data = imap.search( None,  "ALL" )
            match = list_response_pattern.match(i.decode("utf-8"))
            flags, delimiter, mailbox_name = match.groups()
            print("1")
            print(mailbox_name)
            mailbox_name = mailbox_name.strip('"')
            print(mailbox_name)
        except Exception as e:
            print(e)
            continue
        # Get Current Status of Folder
        current_status = imap.status(
                '"{}"'.format(mailbox_name),
                '(MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN)',
        )
        print(current_status)
        # Get message using UID and Message_id
        msg_ids = search_data[ 0 ].split()
        print("total count: ",len(msg_ids))
        for i in msg_ids:
            print("$$$$$$$$$$$$$$$$$$$$")
            print("Message Ids: ", i)
            count = count + 1
            fetch_resp, fetch_UID = imap.fetch( i, 'UID' )
            print("Fetch UID: ", fetch_UID)
            day = bytes(str(fetch_UID[0].split()[2]).split("'")[1].split(')')[0],'utf-8')
            print("ID: ",day)
            fetch_resp, fetch_mdg = imap.uid('fetch', day, '(RFC822)')
            print(fetch_mdg)
            print("$$$$$$$$$$$$$$$$$$$$$")
            email_msg = fetch_mdg[0][1]
            if email_msg and isinstance(email_msg, str):
                try:
                    email_msg = email.message_from_string(email_msg)
                except :
                    email_msg = None

            elif email_msg and isinstance(email_msg, bytes):
                try:
                    email_msg = email.message_from_bytes(email_msg)
                except:
                    email_msg = None
            print("*********************************")
            print("Count: ",count)
            print("UID: ",day)
            print(mailbox_name)
            print(email_msg['To'])
            print(email_msg['From'])
            print(email_msg['subject'])
            print(email_msg)
            print("*********************************")
        # Store Folder details in File
        status_details = current_status[1][0].decode("utf-8")
        status_details = status_details.split('(')[1].split(')')[0].split(' ')
        print(status_details)
        if len(msg_ids) == 0:
                json1 = json.dumps({'total_count':int(status_details[1]),'UID':0,'UIDNext':int(status_details[5]),'UIDValidity':int(status_details[7]), 'Folder name':mailbox_name})
        else:
                json1 = json.dumps({'total_count':int(status_details[1]),'UID':int(day),'UIDNext':int(status_details[5]),'UIDValidity':int(status_details[7]), 'Folder name':mailbox_name})  
        file = open(file_path,'a')
        file.write(json1)
        file.write("\n")
        print('hi')

Ответ

$$$$$$$$$$$$$$$$$$$$
Message Ids:  b'3'
Fetch UID:  [b'3 (UID 11)']
ID:  b'11'
[(b'3 (RFC822 {757}', b'MIME-Version: 1.0\r\nContent-Type: text/plain; charset="us-ascii"\r\nFrom: Microsoft Exchange Server\r\nTo: "\r\nSubject: Retrieval using the IMAP4 protocol failed for the following message:\r\n 11\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nThe server couldn\'t retrieve the following message:\r\n\r\nSubject: "Test email Sync 3"\r\nFrom: "Imap Testing" ("/O=3DEXCHANGELABS/OU=3DEXCHANGE ADMINISTRATIVE GROUP=\r\n (FYDIBOHF23SPDLT)/CN=3DRECIPIENTS/CN=3DEBF2483D9A0145A59A48B829B12A45E4-MA=\r\nILBOX1")\r\nSent date: 5/6/2020 2:02:59 AM\r\n\r\nThe message hasn\'t been deleted. You might be able to view it using either =\r\nOutlook or Outlook Web App. You can also contact the sender to find out wha=\r\nt the message says.=\r\n'), b' UID 11 FLAGS (\\Seen))']
$$$$$$$$$$$$$$$$$$$$$

Ошибка сервера

Subject: Retrieval using the IMAP4 protocol failed for the following message:
 7
Content-Transfer-Encoding: quoted-printable

The server couldn't retrieve the following message:

Subject: "Testing"
Sent date: 5/6/2020 2:01:54 AM

The message hasn't been deleted. You might be able to view it using either =
Outlook or Outlook Web App. You can also contact the sender to find out wha=
t the message says.=

У меня есть около 20 папок, которые я перебираю одну за другой, получаю текущий статус папки и сохраняю ее в образце файла. Он успешно работает. Но я попытался распечатать сообщения электронной почты в некоторых папках (контакт, календарь, задача), он показывает этот ответ.

...