1、個人需求
我但願作成具備如下功能的軟件:
1. 間隔一段時間登陸個人郵箱查看是否有未讀郵件
若是不斷的運行查看是否有新郵件確實沒多大必要。
另外若是這個客戶端登陸個人郵箱,那麼我可能就不能用瀏覽器登陸個人gmail了。這一點,是否不能夠我沒有試過,忘記在哪看過了。
2. 若是有新郵件,可以較爲實時的提醒我
在考慮這個需求的時候,我考慮瞭如下幾種方法:html
第一種方法其實很好,可是我沒有太多時間從零開始學習用Python編寫圖形界面。等有時間的時候能夠編寫各功能更增強大的PC郵箱客戶端。
第二種方法很快就被我pass掉了,由於Android應用須要用Java編寫的,Python貌似不能夠。瀏覽器
我又想到了微信的新郵件推送功能,雖然它推送的是qq郵箱的新郵件,可是我能夠利用qq郵箱看成中轉站。具體方法是:當檢測到gmail郵箱有新郵件時,把這封郵件原封不動的發送給個人qq郵箱。只修改新郵件的Subject,能夠添加'Hub Gmail'的標識信息來代表這是經過gmail中轉的。
這種方法雖然較爲麻煩,可是仍是很方便,並且可行,技術上沒有新的須要,只須要學習過得SMTP及IMAP協議便可。服務器
2、程序流程
爲了讓博客顯得更加高端點,還特地畫了個程序流程圖,有點醜,不規範,僅供學習參考,勿噴。。。。。 微信
3、上源碼ide
#-*- encoding: utf-8 -*- #-*- encoding: gbk -*- # 這一版本的功能算是使myGmailAccount@gmail.com 與 myQQAcount@qq.com 兩個郵箱進行同步。 #發送到gmail的郵件,不管是時間、發送人、收件人 都沒有更改,惟一更改的是Subject,添加了來自gmail中轉站的標識。 import getpass, email, os, time from imapclient import IMAPClient import sys import email.utils from email.message import Message import smtplib def sendMail(message): toaddr = 'myQQAccount@qq.com' message['Subject'] = '+ Hub ' + username try: # print('smtp connecting...') server = smtplib.SMTP_SSL('smtp.gmail.com') except: print('smtp server connecting failed') sys.exit(1) try: # print('smpt login...') #print('username: ', username) #print('passwd: ', passwd) server.login(username, passwd) except smtp.SMTPAuthenticationError: print('smtp login failed') else: # print('login succeed') server.send_message(message, username, toaddr) finally: # print('smtp server quit') server.quit() # 因爲只須要再發送一遍郵件,因此不須要把內容都解析出來,但爲了能讓你們看的明白,保留痕跡 def parseMessage(message_id, message): e = email.message_from_string(message['BODY[]']) """
這裏是註釋 subject = email.header.make_header(email.header.decode_header(e['SUBJECT'])) mail_from = email.header.make_header(email.header.decode_header(e['From'])) maintype = e.get_content_maintype() if maintype == 'multipart': or part in e.get_payload(): if part.get_content_maintype() == 'text': mail_content = part.get_payload(decode=True).strip() elif maintype == 'text': mail_content = e.get_payload(decode=True).strip() mail_content = mail_content.decode('gbk')
註釋結束 """ sendMail(e) def getMessage(client): client.select_folder('INBOX') # inside inbox folder result = client.search('UNSEEN') #get message with 'UNSEEN' flag msgdict = client.fetch(result, ['BODY.PEEK[]'] ) if len(msgdict) > 0: # os.system('clear') # print('!'*20, 'Sir, you received {0} messages '.format(len(msgdict)), '!'*20) for message_id, message in msgdict.items(): parseMessage(message_id, message) # else: # print('There is no message unread') hostname = 'imap.gmail.com' username = '***@gmail.com' passwd = '***' while(True): # print('connecting...') c = IMAPClient(hostname, ssl= True) try: # print('loging...') c.login(username, passwd) except c.Error: print('Could not log in') sys.exit(1) else: getMessage(c) finally: c.logout() time.sleep(1200)
4、其餘一些話
1. 這樣的程序實現了gmail郵箱和qq郵箱的綁定。這麼說看起來有點高端的趕腳了。
2. 本程序首先功能不是很完善,而且不少異常狀況都沒有考慮。而且只試驗了gmail,其餘郵箱服務器沒有測試。post
3. 爲了方便,本程序的註釋裏有解析郵件的代碼,若是想更加詳細的瞭解SMTP及IMAP,能夠看個人上一篇博客:用Python實現gmail郵箱服務,實現兩個郵箱之間的綁定(中)學習