zoukankan      html  css  js  c++  java
  • 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(下)

    一、我的需求
      我希望做成具有以下功能的软件:
    1. 间隔一段时间登录我的邮箱查看是否有未读邮件
      如果不断的运行查看是否有新邮件确实没多大必要。
      另外如果这个客户端登录我的邮箱,那么我可能就不能用浏览器登录我的gmail了。这一点,是否不可以我没有试过,忘记在哪看过了。
    2. 如果有新邮件,能够较为实时的提醒我
      在考虑这个需求的时候,我考虑了以下几种方法:

    • 利用Python在PC上编写个有图形界面的客户端,如果有新邮件,弹出消息通知
    • 编写个手机应用程序,能够提醒我。虽然gmail有手机客户端,但是它不是实时的,大多数都需要我自己去刷新来查看是否有新邮件。

      第一种方法其实很好,但是我没有太多时间从零开始学习用Python编写图形界面。等有时间的时候可以编写各功能更加强大的PC邮箱客户端。
      第二种方法很快就被我pass掉了,因为Android应用需要用Java编写的,Python貌似不可以。


      我又想到了微信的新邮件推送功能,虽然它推送的是qq邮箱的新邮件,但是我可以利用qq邮箱当作中转站。具体方法是:当检测到gmail邮箱有新邮件时,把这封邮件原封不动的发送给我的qq邮箱。只修改新邮件的Subject,可以添加'Hub Gmail'的标识信息来表明这是通过gmail中转的。
      这种方法虽然较为麻烦,但是还是很方便,而且可行,技术上没有新的需要,只需要学习过得SMTP及IMAP协议即可。

    二、程序流程
      为了让博客显得更加高端点,还特意画了个程序流程图,有点丑,不规范,仅供学习参考,勿喷。。。。。                                       


    三、上源码

    #-*- 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)

    四、其他一些话
    1. 这样的程序实现了gmail邮箱和qq邮箱的绑定。这么说看起来有点高端的赶脚了。
    2. 本程序首先功能不是很完善,并且很多异常情况都没有考虑。并且只试验了gmail,其他邮箱服务器没有测试。

    3. 为了方便,本程序的注释里有解析邮件的代码,如果想更加详细的了解SMTP及IMAP,可以看我的上一篇博客:用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(中)

  • 相关阅读:
    Spring boot mybatis : Error creating bean with name 'com.github.pagehelper.autoconfigure.MapperAutoConfiguration': Invocation of init method failed;
    方法调用
    初识MQ
    Shell 变量
    Eclipse 导入本地 Git 项目
    IDEA 常用快捷键
    Xshell 配色方案
    冒泡排序
    递归
    安卓服务Service详解
  • 原文地址:https://www.cnblogs.com/zixuan-zhang/p/3403418.html
Copyright © 2011-2022 走看看