2014-07-21 84 views
1

我一直在爲Web應用程序編寫自動化測試,它涉及發送電子郵件,不僅僅是爲了創建帳戶和密碼,而是作爲實際產品的前提,向虛擬機發送電子郵件文檔。使用專用帳戶從電子郵件獲取鏈接

作爲我的測試的一部分,我顯然需要檢查這些電子郵件包含某些元素,例如。鏈接到文檔等

我已經寫了一些python代碼(用於gmail原子提要),只會找到並打印每封電子郵件的標題,如果他們是一個鏈接打印,但也不能找到鏈接。

import urllib2 
import untangle 

FEED_URL = 'https://mail.google.com/mail/feed/atom' 

def get_unread_msgs(user, passwd): 
    auth_handler = urllib2.HTTPBasicAuthHandler() 
    auth_handler.add_password(
     realm='New mail feed', 
     uri='https://mail.google.com', 
     user='{user}@gmail.com'.format(user=user), 
     passwd=passwd 
    ) 

    opener = urllib2.build_opener(auth_handler) 
    urllib2.install_opener(opener) 
    feed = urllib2.urlopen(FEED_URL) 
    return feed.read() 

if __name__ == "__main__": 
    import getpass 

    user = raw_input('Username: ') 
    passwd = getpass.getpass('Password: ') 
    xml = get_unread_msgs(user, passwd) 
    o = untangle.parse(xml) 

    try: 
     for item in o.feed.entry: 
      title = item.title.cdata 
      print title 
      link = item.link.cdata 
      if link: 
       print "Link" 
       print ' ', link 

    except IndexError: 
     pass # no new mail 

編輯:我剛剛意識到Atom提要實際上並沒有給出消息數據..

任何人都可以請建議實現我的目標的替代方法?

回答

1

你可以通過imaplib,而不是訪問消息:

import imaplib 

def get_unread_msgs(user, passwd): 
    M = imaplib.IMAP4_SSL('imap.gmail.com') 
    M.login(user, passwd) 
    try: 
     M.select() 
     try: 
      type, data = M.search(None, '(UNSEEN)') 
      for num in data[0].split(): 
       yield M.fetch(num, '(RFC822)') 
     finally: 
      M.close() 
    finally: 
     M.logout() 

您將需要啓用IMAP在Gmail設置中,如果您尚未:

+0

問題是我需要等到電子郵件到達時,這是自動化測試套件的一小部分。我真的不想做一些可怕的事情,比如做一個inf循環,然後重複代碼直到最終出現一封電子郵件。 關於如何將其應用到我的解決方案的任何想法? – Stormie

+0

你會注意到,這正是每個電子郵件客戶端所做的...... :) –

+0

我不確定我要使用哪個答案,但都很好。我會選擇明確地選擇imap答案,因爲它不是特定的,未來的用戶會發現它是最有幫助的(我希望他們會這樣評論) – Stormie

1

如果您正在尋找一個(特定於Gmail)解決方案而無需輪詢服務器的更新,您可以查看Gmail Notifications API。

相關問題