问题
I got an error when retrieve items using exchangelib. Is there any method to detect whether the item is an email, and if not, just ignore it? The following code raises AttributeError: 'MeetingRequest' object has no attribute 'flag')
since meeting requests don't have a flag
field. Or is there any method to view the type of the item?
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)
回答1:
Just check the class of the returned item: if type(item) == Message
and ignore the ones that don't match.
If you want to avoid the cause of the error, you need to also register the flag
property on the MeetingRequest
class (and MeetingResponse
and MeetingCancellation
if you have those in your folder).
来源:https://stackoverflow.com/questions/49013158/python-exchangelib-check-if-item-is-a-message-or-not