2

使用 exchangelib 检索项目时出现错误。是否有任何方法可以检测该项目是否为电子邮件,如果不是,则忽略它?AttributeError: 'MeetingRequest' object has no attribute 'flag')由于会议请求没有flag字段,因此会引发以下代码。或者有什么方法可以查看物品的类型?

import re
import sys
from exchangelib import DELEGATE, IMPERSONATION, Account, Credentials, ServiceAccount, \
    EWSDateTime, EWSTimeZone, Configuration, NTLM, CalendarItem, Message, \
    Mailbox, Attendee, Q, ExtendedProperty, FileAttachment, ItemAttachment, \
    HTMLBody, Build, Version

from datetime import datetime, timedelta
import pytz

tz = EWSTimeZone.timezone('Asia/Hong_Kong')

creds = Credentials(
    username='domain\userID', 
    password='password')
)
account = Account(
    primary_smtp_address='myemail@domain',
    credentials=creds, 
    autodiscover=True, 
    access_type=DELEGATE)

class Flag(ExtendedProperty):
    property_tag = 0x1090
    property_type = 'Integer'

Message.register('flag', Flag)  


if(len(sys.argv) == 1):
    yesterday = tz.localize(EWSDateTime.now() - timedelta(days=3))
    today = tz.localize(EWSDateTime.now())
    fYear= yesterday.year
    fMonth= yesterday.month
    fDay= yesterday.day
    tYear = today.year
    tMonth = today.month
    tDay = today.day
elif(len(sys.argv) == 3):
    fromDate = sys.argv[1]
    toDate = sys.argv[2]
    fYear = fromDate[:4]
    fMonth = fromDate[4:6]
    fDay = fromDate[-2:]
    tYear = toDate[:4]
    tMonth = toDate[4:6]
    tDay = toDate[-2:]

for item in account.inbox.filter(datetime_received__range=(
    #tz.localize(EWSDateTime.now() - timedelta(days=1)),
    #tz.localize(EWSDateTime.now())
    tz.localize(EWSDateTime(int(fYear), int(fMonth), int(fDay))),
    tz.localize(EWSDateTime(int(tYear), int(tMonth), int(tDay)))
    )):
    subA=item.subject
    snd=item.sender.email_address
    fg=str(item.flag)
str(item.datetime_received.astimezone(pytz.timezone('Asia/Hong_Kong')).strftime("%a %b %d %H:%M:%S %Y"))
        rT = str(item.datetime_received.astimezone(pytz.timezone('Asia/Hong_Kong')).strftime("%Y-%m-%d %H:%M:%S"))
        cat=str(item.categories)
        if not subA:
            subA=""
            a="\"Inbox\",\""+snd+"\",\""+subA+"\",\""+rT+"\",\""+cat+"\",\""+fg+"\""
            print(a)
        else:
            subA = re.sub('\"\,\"', '\\"\,\\"', subA.rstrip())
            a="\"Inbox\",\""+snd+"\",\""+subA+"\",\""+rT+"\",\""+cat+"\",\""+fg+"\""
            decoded = a.encode('utf-8').decode('utf-8')
            print(decoded)
4

1 回答 1

2

只需检查返回项目的类别:if type(item) == Message并忽略不匹配的项目。

如果您想避免错误的原因,您还需要flag在类上注册属性MeetingRequestMeetingResponse并且MeetingCancellation如果您的文件夹中有这些属性)。

于 2018-02-28T07:21:29.773 回答