2012-08-09 61 views
0

我有以下處理電子郵件並將其保存到csv文件的腳本。我將使用機械化庫處理提取的電子郵件數據以便在另一個Web界面上進一步處理。有時候它可能會失敗,現在我可以在沒有任何問題的情況下捕獲特定的電子郵件,但是如何將被困電子郵件轉發到另一個可以手動處理它的地址,或者查看它出了什麼問題?如何將使用poplib捕獲的電子郵件轉發到其他電子郵件地址?

這裏的腳本

import ConfigParser 
import poplib 
import email 
import BeautifulSoup 
import csv 
import time 

DEBUG = False 
CFG = 'email' # 'email' or 'test_email' 


#def get_config(): 
def get_config(fnames=['cron/orderP/get_orders.ini'], section=CFG): 
    """ 
    Read settings from one or more .ini files 
    """ 
    cfg = ConfigParser.SafeConfigParser() 
    cfg.read(*fnames) 
    return { 
     'host': cfg.get(section, 'host'), 
     'use_ssl': cfg.getboolean(section, 'use_ssl'), 
     'user': cfg.get(section, 'user'), 
     'pwd':  cfg.get(section, 'pwd') 
    } 

def get_emails(cfg, debuglevel=0): 
    """ 
    Returns a list of emails 
    """ 
    # pick the appropriate POP3 class (uses SSL or not) 
    #pop = [poplib.POP3, poplib.POP3_SSL][cfg['use_ssl']] 

    emails = [] 
    try: 
     # connect! 
     print('Connecting...') 
     host = cfg['host'] 
     mail = poplib.POP3(host) 
     mail.set_debuglevel(debuglevel) # 0 (none), 1 (summary), 2 (verbose) 
     mail.user(cfg['user']) 
     mail.pass_(cfg['pwd']) 

     # how many messages? 
     num_messages = mail.stat()[0] 
     print('{0} new messages'.format(num_messages)) 

     # get text of messages 
     if num_messages: 
      get = lambda i: mail.retr(i)[1]     # retrieve each line in the email 
      txt = lambda ss: '\n'.join(ss)     # join them into a single string 
      eml = lambda s: email.message_from_string(s) # parse the string as an email 
      print('Getting emails...') 
      emails = [eml(txt(get(i))) for i in xrange(1, num_messages+1)] 
     print('Done!') 
    except poplib.error_proto, e: 
     print('Email error: {0}'.format(e.message)) 

    mail.quit() # close connection 
    return emails 

def parse_order_page(html): 
    """ 
    Accept an HTML order form 
    Returns (sku, shipto, [items]) 
    """ 
    bs = BeautifulSoup.BeautifulSoup(html) # parse html 

    # sku is in first <p>, shipto is in second <p>... 
    ps = bs.findAll('p')     # find all paragraphs in data 
    sku = ps[0].contents[1].strip()   # sku as unicode string 
    shipto_lines = [line.strip() for line in ps[1].contents[2::2]] 
    shipto = '\n'.join(shipto_lines)  # shipping address as unicode string 

    # items are in three-column table 
    cells = bs.findAll('td')      # find all table cells 
    txt = [cell.contents[0] for cell in cells] # get cell contents 
    items = zip(txt[0::3], txt[1::3], txt[2::3]) # group by threes - code, description, and quantity for each item 

    return sku, shipto, items 

def get_orders(emails): 
    """ 
    Accepts a list of order emails 
    Returns order details as list of (sku, shipto, [items]) 
    """ 
    orders = [] 
    for i,eml in enumerate(emails, 1): 
     pl = eml.get_payload() 
     if isinstance(pl, list): 
      sku, shipto, items = parse_order_page(pl[1].get_payload()) 
      orders.append([sku, shipto, items]) 
     else: 
      print("Email #{0}: unrecognized format".format(i)) 
    return orders 

def write_to_csv(orders, fname): 
    """ 
    Accepts a list of orders 
    Write to csv file, one line per item ordered 
    """ 
    outf = open(fname, 'wb') 
    outcsv = csv.writer(outf) 
    for poNumber, shipto, items in orders: 
     outcsv.writerow([])  # leave blank row between orders 
     for code, description, qty in items: 
     outcsv.writerow([poNumber, shipto, code, description, qty]) 
     # The point where mechanize will come to play 

def main(): 
    cfg = get_config() 
    emails = get_emails(cfg) 
    orders = get_orders(emails) 
    write_to_csv(orders, 'cron/orderP/{0}.csv'.format(int(time.time()))) 

if __name__=="__main__": 
    main() 
+0

POP3不關於發送或轉發電子郵件。對於發送電子郵件,您可以使用SMTP和[smtplib](http://docs.python.org/library/smtplib.html#smtp-example)。但是您需要SMTP服務器。 – 2012-08-10 00:05:27

+0

是否可以使用smtplib發送捕獲的電子郵件?我是否需要在使用smtplib時修改郵件,或者我可以按照捕獲的方式發送郵件? – 2012-08-10 01:03:23

+1

一般來說,是的,你可以發送消息正文「原樣」。但是,某些SMTP服務器對處理的消息施加不同的限制。 – 2012-08-10 02:08:02

回答

0

正如我們都知道,POP3僅用於檢索(那些誰知道還是有辦法的電子郵件是如何工作的),所以使用POP3進行消息的緣故發送,沒有點爲什麼我提到如何將使用poplib捕獲的電子郵件轉發到其他電子郵件地址?作爲一個問題。

完整答案是 smtplib可用於轉發poplib捕獲的電子郵件,您只需捕獲郵件正文並使用smtplib將其發送到所需的電子郵件地址即可。此外,正如Aleksandr Dezhin所引用的,我會同意他的看法,因爲一些SMTP服務器對處理的消息施加不同的限制。

除此之外,如果你在Unix機器上,你可以使用sendmail來實現。

相關問題