Question

Read emails with FME Desktop


Badge +8

Hi FME's World!

 

I'm trying to read emails from Outlook or GMail with my FME Desktop. I found out that it would be possible in Python, would you sugegest to use the PythonCaller or PythonCreator?

I found some Python code but FME runs indefinitly at "Emptying factory pipeline".

 

 import email, getpass, imaplib, os detach_dir = '.' # directory where to save attachments (default: current) user = raw_input("email") pwd = getpass.getpass("pwd") # connecting to the gmail imap server m = imaplib.IMAP4_SSL("imap.gmail.com") m.login(user,pwd) m.select("[Gmail]/All Mail") # 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://www.example-code.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 headach     for part in mail.walk():         # 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()

 

 

 

Thanks a lot.

 


4 replies

Userlevel 2
Badge +17
Hi Philippe,

 

 

Probably the reason for indefinitely running is that you are using the "raw_input" function and "getpass.getpass" method. Both of them wait for input from the standard input (usually the command prompt), but there is no way that the user enters the values when the script is being executed with the PythonCreator/Caller.

 

Instead, you can assign literal or attribute value or parameter value to "usr" and "pwd".

 

 

Takashi
Userlevel 4
Hi,

 

 

maybe I'm missing something, but in the code above I see no references or calls to the FME Python API (defined in the fmeobjects module). If you want to use this code in a PythonCaller/PythonCreator, there are some patterns you will have to follow to enable FME to interact with your code.

 

 

Look at the help file for more info, e.g.

 

http://docs.safe.com/fme/html/FME_Transformers/FME_Transformers.htm#Transformers/pythoncreator.htm

 

 

David
Badge

Hello @philippeb,

have you had any luck in accomplishing this ?

Badge +8

Hello @philippeb,

have you had any luck in accomplishing this ?

Nope, we bought FME Server since then :D

Reply