用Python實現gmail郵箱服務,實現兩個郵箱之間的綁定(下)

1、個人需求
  我但願作成具備如下功能的軟件:
1. 間隔一段時間登陸個人郵箱查看是否有未讀郵件
  若是不斷的運行查看是否有新郵件確實沒多大必要。
  另外若是這個客戶端登陸個人郵箱,那麼我可能就不能用瀏覽器登陸個人gmail了。這一點,是否不能夠我沒有試過,忘記在哪看過了。
2. 若是有新郵件,可以較爲實時的提醒我
  在考慮這個需求的時候,我考慮瞭如下幾種方法:html

  • 利用Python在PC上編寫個有圖形界面的客戶端,若是有新郵件,彈出消息通知
  • 編寫個手機應用程序,可以提醒我。雖然gmail有手機客戶端,可是它不是實時的,大多數都須要我本身去刷新來查看是否有新郵件。

  第一種方法其實很好,可是我沒有太多時間從零開始學習用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郵箱服務,實現兩個郵箱之間的綁定(中)學習

相關文章
相關標籤/搜索