2

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)
Erik Cederstrand
  • 9,643
  • 8
  • 39
  • 63
Ben Law
  • 23
  • 3

1 Answers1

2

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).

Erik Cederstrand
  • 9,643
  • 8
  • 39
  • 63
  • thanks reply and i tried to add below, `if isinstance(item, Message): print ("This is message") print (item) ` but still return >>> `This is a message MeetingRequest(mime_content=b'Received: from HKG` the meeting request still identify as Message – Ben Law Feb 28 '18 at 17:06
  • Sorry about that. MeetingRequest is actually a subclass of Message, so `isinstance()` will match both. Use `type()` instead. I updated the answer. – Erik Cederstrand Feb 28 '18 at 17:49