Как загрузить приложение Outlook в течение 24 часов с момента его получения? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь загрузить все вложения из INBOX.

После 10-20 загруженных файлов программа выдает ошибку.

, строка 62, в
get_attachments (сырье, email_id)
строка 31, в get_attachments
fileName = '{}' .format (email_id) + part.get_filename ()
TypeError: должно быть str, а не NoneType

Плюс, я пытаюсь изменить код, чтобы загрузить полученные файлы в течение 24 часов из INBOX и сохранить в моей папке загрузки.

import imaplib, email, os
user = "***"
password = "***"
imap_url = "smtp.outlook.com"
attachment_dir = "/GGG/"
# sets up the auth
def auth(user,password,imap_url):
    con = imaplib.IMAP4_SSL(imap_url)
    con.login(user,password)
    return con
# extracts the body from the email
def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None,True)
# allows you to download attachments
def get_attachments(msg,email_id):
    for part in msg.walk():
        if part.get_content_maintype()=='multipart':
            continue
        if part.get('Content-Disposition') is None:
            continue
        fileName = '{} '.format(email_id)+part.get_filename()

        if bool(fileName):
            filePath = os.path.join(attachment_dir, fileName)
            with open(filePath,'wb') as f:
                f.write(part.get_payload(decode=True))
#search for a particular email
def search(key,value,con):
    result, data  = con.search(None,key,'"{}"'.format(value))
    return data
#extracts emails from byte array
def get_emails(result_bytes):
    msgs = []
    for num in result_bytes[0].split():
        typ, data = con.fetch(num, '(RFC822)')
        msgs.append(data)
    return msgs

con = auth(user,password,imap_url)

#All I added is below here
#########################################################
#A method of obtaining inbox size
inbox_size = int(con.select('INBOX')[1][0])

#Here I used a for loop to go through all email ids
for email_id in range(1,inbox_size+1):
    result, data = con.fetch(str(email_id).encode(),'(RFC822)')
    raw = email.message_from_bytes(data[0][1])
    get_attachments(raw,email_id)

1 Ответ

0 голосов
/ 05 ноября 2018

Согласно вашему описанию, вы можете попробовать следующий код:

import win32com.client, datetime

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6).Folders('Paper & CD')
messages = inbox.Items
date_now = datetime.datetime.now().date()
date_before = (datetime.datetime.now() + datetime.timedelta(-1)).date()
messages.Find("[Start] >= """ & date_before & """ and [Start] <= """ & date_now & """")

for msg in messages:        
    for att in msg.Attachments:
        if att.FileName == 'list.csv': 
            att.SaveAsFile('C:\\My\\temp\\' + msg.subject + att.FileName)
        att.SaveAsFile('C:\\My\\temp\\' + att.FileName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...