import email , getpass , imaplib , os , re , csv , zipfile , glob , threading
detach_dir = 'C:\d irectory' # directory where to save attachments (default: current)
user = ( "username" )
pwd = ( "pass" )
# connecting to the gmail imap server
m = imaplib .IMAP4_SSL ( "imap.gmail.com" )
m.login ( user , pwd )
m.select ( "INBOX" ) # here you a can choose a mail box like INBOX instead
# use m.list() to get all the mailboxes
resp, items = m.search ( None , "ALL" ) # you could filter using the IMAP rules here (check http://w...content-available-to-author-only...e.com/csharp/imap-search-critera.asp)
items = items[ 0 ] .split ( ) # getting the mails id
for emailid in items:
resp, data = m.fetch ( emailid, "(RFC822)" ) # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you can ask for headers only, etc
email_body = data[ 0 ] [ 1 ] # getting the mail content
mail = email .message_from_string ( email_body) # parsing the mail content to get a mail object
#Check if any attachments at all
if mail.get_content_maintype ( ) != 'multipart' :
continue
#print "["+mail["From"]+"] :" + mail["Subject"]
# we use walk to create a generator so we can iterate on the parts and forget about the recursive headache
for part in mail.walk ( ) :
# each part is a either non-multipart, or another multipart message
# that contains further parts... Message is organized like a tree
if part.get_content_type ( ) == 'text/plain' :
content = part.get_payload ( )
message = re .compile ( r'\% (.+?)\% ' , re .DOTALL ) .findall ( content)
message = re .sub ( r'=\\ r\\ ' , '' , str ( message) )
message = re .sub ( r'\[ \' ' , '' , str ( message) )
message = re .sub ( r'\' \] ' , '' , str ( message) )
token = re .compile ( r'\$ (.+?)\$ ' , re .DOTALL ) .findall ( content)
token = re .sub ( r'\[ \' ' , '' , str ( token ) )
token = re .sub ( r'\' \] ' , '' , str ( token ) )
tag = re .compile ( r'\^ (.+?)\^ ' , re .DOTALL ) .findall ( content)
tag = re .sub ( r'\[ \' ' , '' , str ( tag) )
tag = re .sub ( r'\' \] ' , '' , str ( tag) )
print message
print token
print tag
#print part.get_payload() # prints the raw text
# multipart are just containers, so we skip them
if part.get_content_maintype ( ) == 'multipart' :
continue
# is this part an attachment ?
if part.get ( 'Content-Disposition' ) is None :
continue
filename = part.get_filename ( )
counter = 1
# if there is no filename, we create one with a counter to avoid duplicates
if not filename:
filename = 'part-%03d%s' % ( counter, 'bin' )
counter += 1
att_path = os .path .join ( detach_dir, filename)
#Check if its already there
if not os .path .isfile ( att_path) :
# finally write the stuff
fp = open ( att_path, 'wb' )
fp.write ( part.get_payload ( decode= True ) )
fp.close ( )
path = detach_dir
os .chdir ( path)
image1 = str ( glob .glob ( 'upload-photo1*' ) )
image2 = str ( glob .glob ( 'upload-photo2*' ) )
image3 = str ( glob .glob ( 'upload-photo3*' ) )
image1 = re .sub ( r'\[ \' ' , '' , image1)
image1 = re .sub ( r'\' \] ' , '' , image1)
image2 = re .sub ( r'\[ \' ' , '' , image2)
image2 = re .sub ( r'\' \] ' , '' , image2)
image3 = re .sub ( r'\[ \' ' , '' , image3)
image3 = re .sub ( r'\' \] ' , '' , image3)
htmlFile = str ( token ) +'.html'
htmlCode = ( '''<html>foo bar</html>''' )
htmlData = open ( os .path .join ( 'C:\d irectory' , htmlFile) , 'w+' )
htmlData.write ( htmlCode)
print htmlFile+' Complete'
htmlData.close ( )
allFiles = [ f for f in os .listdir ( '.' ) ]
for file in allFiles:
archive = zipfile .ZipFile ( token +'.zip' , mode= 'a' )
archive.write ( file )
archive.close ( )
os .unlink ( file )
aW1wb3J0IGVtYWlsLCBnZXRwYXNzLCBpbWFwbGliLCBvcywgcmUsIGNzdiwgemlwZmlsZSwgZ2xvYiwgdGhyZWFkaW5nCgpkZXRhY2hfZGlyID0gJ0M6XGRpcmVjdG9yeScgIyBkaXJlY3Rvcnkgd2hlcmUgdG8gc2F2ZSBhdHRhY2htZW50cyAoZGVmYXVsdDogY3VycmVudCkKdXNlciA9ICgidXNlcm5hbWUiKQpwd2QgPSAoInBhc3MiKQoKIyBjb25uZWN0aW5nIHRvIHRoZSBnbWFpbCBpbWFwIHNlcnZlcgptID0gaW1hcGxpYi5JTUFQNF9TU0woImltYXAuZ21haWwuY29tIikKbS5sb2dpbih1c2VyLHB3ZCkKbS5zZWxlY3QoIklOQk9YIikgIyBoZXJlIHlvdSBhIGNhbiBjaG9vc2UgYSBtYWlsIGJveCBsaWtlIElOQk9YIGluc3RlYWQKIyB1c2UgbS5saXN0KCkgdG8gZ2V0IGFsbCB0aGUgbWFpbGJveGVzCgpyZXNwLCBpdGVtcyA9IG0uc2VhcmNoKE5vbmUsICJBTEwiKSAjIHlvdSBjb3VsZCBmaWx0ZXIgdXNpbmcgdGhlIElNQVAgcnVsZXMgaGVyZSAoY2hlY2sgaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2NzaGFycC9pbWFwLXNlYXJjaC1jcml0ZXJhLmFzcCkKaXRlbXMgPSBpdGVtc1swXS5zcGxpdCgpICMgZ2V0dGluZyB0aGUgbWFpbHMgaWQKCmZvciBlbWFpbGlkIGluIGl0ZW1zOgogICAgcmVzcCwgZGF0YSA9IG0uZmV0Y2goZW1haWxpZCwgIihSRkM4MjIpIikgIyBmZXRjaGluZyB0aGUgbWFpbCwgImAoUkZDODIyKWAiIG1lYW5zICJnZXQgdGhlIHdob2xlIHN0dWZmIiwgYnV0IHlvdSBjYW4gYXNrIGZvciBoZWFkZXJzIG9ubHksIGV0YwogICAgZW1haWxfYm9keSA9IGRhdGFbMF1bMV0gIyBnZXR0aW5nIHRoZSBtYWlsIGNvbnRlbnQKICAgIG1haWwgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKGVtYWlsX2JvZHkpICMgcGFyc2luZyB0aGUgbWFpbCBjb250ZW50IHRvIGdldCBhIG1haWwgb2JqZWN0CgoKICAgICNDaGVjayBpZiBhbnkgYXR0YWNobWVudHMgYXQgYWxsCiAgICBpZiBtYWlsLmdldF9jb250ZW50X21haW50eXBlKCkgIT0gJ211bHRpcGFydCc6CiAgICAgICAgY29udGludWUKCiAgICAjcHJpbnQgIlsiK21haWxbIkZyb20iXSsiXSA6IiArIG1haWxbIlN1YmplY3QiXQoKICAgICMgd2UgdXNlIHdhbGsgdG8gY3JlYXRlIGEgZ2VuZXJhdG9yIHNvIHdlIGNhbiBpdGVyYXRlIG9uIHRoZSBwYXJ0cyBhbmQgZm9yZ2V0IGFib3V0IHRoZSByZWN1cnNpdmUgaGVhZGFjaGUKICAgIGZvciBwYXJ0IGluIG1haWwud2FsaygpOgogICAgICAgICMgZWFjaCBwYXJ0IGlzIGEgZWl0aGVyIG5vbi1tdWx0aXBhcnQsIG9yIGFub3RoZXIgbXVsdGlwYXJ0IG1lc3NhZ2UKICAgICAgICAjIHRoYXQgY29udGFpbnMgZnVydGhlciBwYXJ0cy4uLiBNZXNzYWdlIGlzIG9yZ2FuaXplZCBsaWtlIGEgdHJlZQogICAgICAgIGlmIHBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpID09ICd0ZXh0L3BsYWluJzoKICAgICAgICAgICAgY29udGVudCA9IHBhcnQuZ2V0X3BheWxvYWQoKQogICAgICAgICAgICBtZXNzYWdlID0gcmUuY29tcGlsZShyJ1wlKC4rPylcJScsIHJlLkRPVEFMTCkuZmluZGFsbChjb250ZW50KQogICAgICAgICAgICBtZXNzYWdlID0gcmUuc3ViKHInPVxcclxcJywgJycsIHN0cihtZXNzYWdlKSkKICAgICAgICAgICAgbWVzc2FnZSA9IHJlLnN1YihyJ1xbXCcnLCAnJywgc3RyKG1lc3NhZ2UpKQogICAgICAgICAgICBtZXNzYWdlID0gcmUuc3ViKHInXCdcXScsICcnLCBzdHIobWVzc2FnZSkpCiAgICAgICAgICAgIHRva2VuID0gcmUuY29tcGlsZShyJ1wkKC4rPylcJCcsIHJlLkRPVEFMTCkuZmluZGFsbChjb250ZW50KQogICAgICAgICAgICB0b2tlbiA9IHJlLnN1YihyJ1xbXCcnLCAnJywgc3RyKHRva2VuKSkKICAgICAgICAgICAgdG9rZW4gPSByZS5zdWIocidcJ1xdJywgJycsIHN0cih0b2tlbikpCiAgICAgICAgICAgIHRhZyA9IHJlLmNvbXBpbGUocidcXiguKz8pXF4nLCByZS5ET1RBTEwpLmZpbmRhbGwoY29udGVudCkKICAgICAgICAgICAgdGFnID0gcmUuc3ViKHInXFtcJycsICcnLCBzdHIodGFnKSkKICAgICAgICAgICAgdGFnID0gcmUuc3ViKHInXCdcXScsICcnLCBzdHIodGFnKSkKICAgICAgICAgICAgcHJpbnQgbWVzc2FnZQogICAgICAgICAgICBwcmludCB0b2tlbgogICAgICAgICAgICBwcmludCB0YWcKICAgICAgICAgICAgI3ByaW50IHBhcnQuZ2V0X3BheWxvYWQoKSAjIHByaW50cyB0aGUgcmF3IHRleHQKICAgICAgICAjIG11bHRpcGFydCBhcmUganVzdCBjb250YWluZXJzLCBzbyB3ZSBza2lwIHRoZW0KICAgICAgICBpZiBwYXJ0LmdldF9jb250ZW50X21haW50eXBlKCkgPT0gJ211bHRpcGFydCc6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgaXMgdGhpcyBwYXJ0IGFuIGF0dGFjaG1lbnQgPwogICAgICAgIGlmIHBhcnQuZ2V0KCdDb250ZW50LURpc3Bvc2l0aW9uJykgaXMgTm9uZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZmlsZW5hbWUgPSBwYXJ0LmdldF9maWxlbmFtZSgpCiAgICAgICAgY291bnRlciA9IDEKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyBmaWxlbmFtZSwgd2UgY3JlYXRlIG9uZSB3aXRoIGEgY291bnRlciB0byBhdm9pZCBkdXBsaWNhdGVzCiAgICAgICAgaWYgbm90IGZpbGVuYW1lOgogICAgICAgICAgICBmaWxlbmFtZSA9ICdwYXJ0LSUwM2QlcycgJSAoY291bnRlciwgJ2JpbicpCiAgICAgICAgICAgIGNvdW50ZXIgKz0gMQoKICAgICAgICBhdHRfcGF0aCA9IG9zLnBhdGguam9pbihkZXRhY2hfZGlyLCBmaWxlbmFtZSkKCiAgICAgICAgI0NoZWNrIGlmIGl0cyBhbHJlYWR5IHRoZXJlCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGF0dF9wYXRoKSA6CiAgICAgICAgICAgICMgZmluYWxseSB3cml0ZSB0aGUgc3R1ZmYKICAgICAgICAgICAgZnAgPSBvcGVuKGF0dF9wYXRoLCAnd2InKQogICAgICAgICAgICBmcC53cml0ZShwYXJ0LmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSkKICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICAgICAKICAgICAgICBwYXRoID0gZGV0YWNoX2RpcgogICAgICAgIG9zLmNoZGlyKHBhdGgpCiAgICAgICAgaW1hZ2UxID0gc3RyKGdsb2IuZ2xvYigndXBsb2FkLXBob3RvMSonKSkKICAgICAgICBpbWFnZTIgPSBzdHIoZ2xvYi5nbG9iKCd1cGxvYWQtcGhvdG8yKicpKQogICAgICAgIGltYWdlMyA9IHN0cihnbG9iLmdsb2IoJ3VwbG9hZC1waG90bzMqJykpCiAgICAgICAgaW1hZ2UxID0gcmUuc3ViKHInXFtcJycsICcnLCBpbWFnZTEpCiAgICAgICAgaW1hZ2UxID0gcmUuc3ViKHInXCdcXScsICcnLCBpbWFnZTEpCiAgICAgICAgaW1hZ2UyID0gcmUuc3ViKHInXFtcJycsICcnLCBpbWFnZTIpCiAgICAgICAgaW1hZ2UyID0gcmUuc3ViKHInXCdcXScsICcnLCBpbWFnZTIpCiAgICAgICAgaW1hZ2UzID0gcmUuc3ViKHInXFtcJycsICcnLCBpbWFnZTMpCiAgICAgICAgaW1hZ2UzID0gcmUuc3ViKHInXCdcXScsICcnLCBpbWFnZTMpCiAgICAgICAgaHRtbEZpbGUgPSBzdHIodG9rZW4pKycuaHRtbCcKICAgICAgICBodG1sQ29kZSA9ICgnJyc8aHRtbD5mb28gYmFyPC9odG1sPicnJykKICAgICAgICBodG1sRGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKCdDOlxkaXJlY3RvcnknLCBodG1sRmlsZSksICd3KycpCiAgICAgICAgaHRtbERhdGEud3JpdGUoaHRtbENvZGUpCiAgICAgICAgcHJpbnQgaHRtbEZpbGUrJyBDb21wbGV0ZScKICAgICAgICBodG1sRGF0YS5jbG9zZSgpCiAgICAgICAgYWxsRmlsZXMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKCcuJyldCiAgICAgICAgZm9yIGZpbGUgaW4gYWxsRmlsZXM6CiAgICAgICAgICAgIGFyY2hpdmUgPSB6aXBmaWxlLlppcEZpbGUodG9rZW4rJy56aXAnLCBtb2RlPSdhJykKICAgICAgICAgICAgYXJjaGl2ZS53cml0ZShmaWxlKQogICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKGZpbGUp