Question

I can print each email. What I want to do though is search each email for a string and return true of false if it has the string. How can I parase msg to do this?

conn.select(readonly=1) # Select inbox or default namespace
(retcode, messages) = conn.search(None, '(UNSEEN)')
if retcode == 'OK':
    for num in messages[0].split(' '):
        print 'Processing :', messages
        typ, data = conn.fetch(num,'(RFC822)')
        msg = email.message_from_string(data[0][1])
        typ, data = conn.store(num,'-FLAGS','\\Seen')
        if retcode == 'OK':
            print data,'\n',30*'-'
            for line in msg:
                if "Subject: Thanks for your Walmart.com Order" in line:
                    print line

conn.close()
Was it helpful?

Solution

As you've got an email object msg, then you can do:

message_lines = msg.get_payload().splitlines()

Then loop over each line:

for line in message_lines:
    if 'Walmart' in line:
        pass # do whatever

But again, be careful of what the payload is...

The other option, is to have the IMAP server do the work:

(retcode, messages) = conn.search(None, '(UNSEEN) (TEXT walmart)')

This will subset the number of messages that need to be fetched and then you can apply more complex matching if required...

What's also possible is to search by subject (if that's ultimately what you want to do):

(retcode, messages) = conn.search(None, '(UNSEEN) (SUBJECT Thanks for your Walmart.com Order)')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top