11
votes

I'm trying to fetch all emails whose subject starts with "New Order" but I can't seem to figure it out. Currently I can search for an exact match with a setup like so...

result, data = M.uid('search', None, '(HEADER Subject "Subject Here")')

However this won't retrieve any messages that aren't an exact match. How would I go about doing a partial match?

If it matters I am talking to gmail's imap server(s).

Thanks

4
What api/library are you using, also what is M? - John
You also might find stackoverflow.com/a/642988/322909 useful. - John
I am using the imaplib library and M is an IMAP4 object. I had hoped to only pull down the messages that had the desired subjects and not every single message which I believe is what they are doing in your link although I may be wrong. - Kazurik

4 Answers

20
votes

According to the IMAP RFC SEARCH should do all of its matching as substring matches:

In all search keys that use strings, a message matches the key if the string is a substring of the field. The matching is case-insensitive.

Therefore, a search

M.uid('search', None, 'HEADER Subject "New Order"')

should match all messages where New Order occurs anywhere in the subject. If it is not, you should notify Google that their server does not implement IMAP properly. In the meantime you might try using the SUBJECT key as in

M.uid('search', None, 'SUBJECT "New Order"')

Also, according to Google's IMAP extension documentation you might be able to use the X-GM-RAW key and a gmail search string as in

M.uid('search', None, r'X-GM-RAW "subject:\"New Order\""')
4
votes

This worked for me:

mail.uid('search', None, r'(X-GM-RAW "subject:\"New Order\"")')
0
votes

This worked for me:

M.uid('search',None, '(SUBJECT "New Order")')

Format for search is (EmailAttribute "your searchstring")

Hope it works for you.

0
votes

This worked for me:

result, data = m.search(None, 'X-GM-RAW', 'subject: New Order')