11#!/usr/bin/env python 
22
3- import  imaplib 
3+ import  csv 
44import  email 
55from  email  import  policy 
6- import  csv 
7- import  ssl 
6+ import  imaplib 
7+ import  logging 
88import  os 
9+ import  ssl 
10+ 
911from  bs4  import  BeautifulSoup 
1012
11- credential_path  =  os .getcwd () +  "/credentials.txt" 
12- csv_path  =  os .getcwd () +  "/mails.csv" 
13+ 
14+ credential_path  =  "credentials.txt" 
15+ csv_path  =  "mails.csv" 
16+ 
17+ logger  =  logging .getLogger ('imap_poller' )
1318
1419host  =  "imap.gmail.com" 
1520port  =  993 
@@ -36,7 +41,7 @@ def get_text(email_body):
3641 return  soup .get_text (separator = "\n " , strip = True )
3742
3843
39- def  write_to_csv (mail , writer ):
44+ def  write_to_csv (mail , writer ,  N ,  total_no_of_mails ):
4045
4146 for  i  in  range (total_no_of_mails , total_no_of_mails  -  N , - 1 ):
4247 res , data  =  mail .fetch (str (i ), "(RFC822)" )
@@ -60,12 +65,11 @@ def write_to_csv(mail, writer):
6065 content_disposition  =  str (part .get ("Content-Disposition" ))
6166 try :
6267 # get the email email_body 
63-  email_body  =  part .get_payload (decode = True ).decode (
64-  "utf-8" 
65-  )
66-  email_text  =  get_text (email_body )
67-  except  Exception :
68-  pass 
68+  email_body  =  part .get_payload (decode = True )
69+  if  email_body :
70+  email_text  =  get_text (email_body .decode ('utf-8' ))
71+  except  Exception  as  exc :
72+  logger .warning ('Caught exception: %r' , exc )
6973 if  (
7074 content_type  ==  "text/plain" 
7175 and  "attachment"  not  in content_disposition 
@@ -80,18 +84,22 @@ def write_to_csv(mail, writer):
8084 # extract content type of email 
8185 content_type  =  msg .get_content_type ()
8286 # get the email email_body 
83-  email_body  =  msg .get_payload (decode = True ).decode ("utf-8" )
84-  email_text  =  get_text (email_body )
85- 
86-  # Write data in the csv file 
87-  row  =  [email_date , email_from , email_subject , email_text ]
88-  writer .writerow (row )
89- 
90- 
91- if  __name__  ==  "__main__" :
87+  email_body  =  msg .get_payload (decode = True )
88+  if  email_body :
89+  email_text  =  get_text (email_body .decode ('utf-8' ))
90+ 
91+  if  email_text  is  not None :
92+  # Write data in the csv file 
93+  row  =  [email_date , email_from , email_subject , email_text ]
94+  writer .writerow (row )
95+  else :
96+  logger .warning ('%s:%i: No message extracted' , "INBOX" , i )
9297
98+ def  main ():
9399 mail , messages  =  connect_to_mailbox ()
94100
101+  logging .basicConfig (level = logging .WARNING )
102+ 
95103 total_no_of_mails  =  int (messages [0 ])
96104 # no. of latest mails to fetch 
97105 # set it equal to total_no_of_emails to fetch all mail in the inbox 
@@ -101,6 +109,10 @@ def write_to_csv(mail, writer):
101109 writer  =  csv .writer (fw )
102110 writer .writerow (["Date" , "From" , "Subject" , "Text mail" ])
103111 try :
104-  write_to_csv (mail , writer )
105-  except  Exception  as  e :
106-  print (e )
112+  write_to_csv (mail , writer , N , total_no_of_mails )
113+  except  Exception  as  exc :
114+  logger .warning ('Caught exception: %r' , exc )
115+ 
116+ 
117+ if  __name__  ==  "__main__" :
118+  main ()
0 commit comments