• 使用AWS亚马逊云搭建Gmail转发服务(二)


    title: 使用AWS亚马逊云搭建Gmail转发服务(二)
    author:青南
    date: 2014-12-31 14:44:27
    categories: [Python]
    tags: [Python,Gmail,AWS,Flask]

    在上一篇文章使用AWS亚马逊云搭建Gmail转发服务(一)中,我们介绍了如何在亚马逊AWS的免费主机EC2中使用Gmai API从而接收邮件的操作。在这篇文章中,将要讲解如何制作一个邮件转发服务。

    我之前有写一篇文章,使用微信控制你的电脑其中有讲解如何使用Python的smtplib库实现发送邮件。于是Gmail邮件转发的思路就出来了:

    程序定期检查Gmail邮箱,如果发现有新的邮件,就将新邮件的标题,发送人,还有邮件正文提取出来,并使用 MIMEText构造一个邮件的object 然后再用国内邮箱发送给自己的主邮箱。

    这里涉及到三个邮箱:Gmail,国内邮箱一(发送),国内邮箱二(接收)。其中国内邮箱二是我的常用邮箱,我将它和微信绑定,因此一旦有新邮件,就会收到提醒。国内邮箱一是一个备胎邮箱,他的作用就是一个转发而已。

    可能有人会问为什么不用Gmail直接转发?因为我觉得很有可能不久以后,Gmail发送的邮件,国内邮箱收不到。

    那么我们将使用微信控制你的电脑这篇文章中涉及到的auto.py进行修改,编写一个ghelper_sender.py:

    #-*-coding:utf-8 -*-
    
    import smtplib
    import sys
    from email.mime.text import MIMEText
    
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    username = "123@sina.com"# 接收邮箱
    password = "123abc"# 接收邮箱密码
    mailbox = "greensouth@foxmail.com" #国内邮箱二
    
    def send_mail(subject,body='Success'):
            msg = MIMEText(body,'plain','utf-8')#中文需参数‘utf-8’,单字节字符不需要
            msg['Subject'] = subject
            msg['from'] = username
            handle = smtplib.SMTP('smtp.sina.com', 25)
            handle.login(username,password)
    		handle.sendmail(username,mailbox, msg.as_string())
            handle.close()
    

    这里需要注意,msg['from'] 的值必须是国内邮箱一,而不是发邮件到Gmail邮箱的那个地址,否则会报错。

    现在打开上一篇文章中的ghelper_api.py,在最开头添加:

    from ghelper_sender import send_mail
    

    导入send_mail函数。

    由于ghelper_api.py 中,上一篇文章中通过

    a = ListMessagesWithLabels(gmail_service,'me')[0]['id']
    b = GetMessage(gmail_service,'me',a)
    

    获得你邮件的正文和发件人,现在再获取邮件的标题:

    subject = b['payload']['headers'][12]['value']
    

    这里我把发件人和邮件正文添加到一起,于是得到以下代码:

    a = ListMessagesWithLabels(gmail_service,'me')[0]['id']
    b = GetMessage(gmail_service,'me',a)
    content =  b['snippet']
    sender =  b['payload']['headers'][3]['value']
    subject = b['payload']['headers'][12]['value']
    body = sender + '
    ' + content
    send_mail(subject,body)
    print subject
    print body
    print '============================'
    

    这样就能发送一次邮件了。接收到的效果如图:


    但是这显然不是我们需要的效果。我们希望这个程序能够自动运行,自动查看邮箱。于是,编写一个函数isnew()来检测是否有新的邮件发送过来,如果有就获取新邮件并发送。

    设定一个全局变量last_email用于保存已读的最后一封邮件,令他的初始化为当前邮箱里面最新的一封邮件的id.接下来每过一段时间,程序就检查邮箱里面邮件的id,如果和last_email相同,就什么都不做;如果不相同,则程序就读取邮件,直到读取到某一封邮件的id和last_email相同为止。再令last_email的值为当前最新的id.代码如下:

    def init():
      global last_email
      last_email = ListMessagesWithLabels(gmail_service,'me')[0]['id']
    
    def isnew():
      global last_email
      themail = ListMessagesWithLabels(gmail_service,'me')
      for each in themail:
        if each['id'] != last_email:
          tosend(each['id'])
        else:
          break
      last_email = themail[0]['id']
    
    def tosend(id):
      b = GetMessage(gmail_service,'me',id)
      content =  b['snippet']
      sender =  b['payload']['headers'][3]['value']
      subject = b['payload']['headers'][12]['value']
      body = sender + '
    ' + content
      send_mail(subject,body)
      print subject
      print body
      print '============================'
    

    设定一个主函数,并把上面的代码放在主函数里面,并循环执行:

    if __name__=='__main__':
        init()
        while 1:
            time.sleep(3600) #每一小时检查一次邮箱
            isnew()
    

    完整的代码我放在了Github上面,请戳->https://github.com/kingname/MCC/tree/master/ghelper

    在下一篇文章中,将介绍Python的logging库,并将每次的发送记录通过日志记录下来。同时用Flask搭建一个网站,从而方便直观的检查这个程序的运行情况。


    独立技术博客请戳->https://www.kingname.info

    两个博客内容相同。转载请注明出处。

  • 相关阅读:
    我有好多东西要学
    不科学计数法
    遍历生成dataframe
    搭建个人博客,Docsify+Github webhook+JGit解决方案
    从1开始实现一个中间件
    python通过youget下载B站系列视频
    JS 中深拷贝的几种实现方法
    addEventListener() 方法,事件监听
    css背景透明文字不透明
    如何理解dispatch( 'tagsView/delAllViews',null,{root:true} )里面的root:true
  • 原文地址:https://www.cnblogs.com/xieqiankun/p/gmailexchange2.html
Copyright © 2020-2023  润新知