使用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 + '\n' + 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 + '\n' + 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搭建一个网站,从而方便直观的检查这个程序的运行情况。
使用AWS亚马逊云搭建Gmail转发服务(二)的更多相关文章
- 使用AWS亚马逊云搭建Gmail转发服务(三)
title: 使用AWS亚马逊云搭建Gmail转发服务(三) author:青南 date: 2015-01-02 15:42:22 categories: [Python] tags: [log,G ...
- 使用AWS亚马逊云搭建Gmail转发服务(一)
title: 使用AWS亚马逊云搭建Gmail转发服务(一) author:青南 date: 2014-12-30 15:41:35 categories: Python tags: [Gmail,A ...
- [转]Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法
今天部落将再次为大家介绍如何成功申请到来自亚马逊的Amazon AWS免费一年的VPS主机服务.亚马逊公司这个就不用介绍了,是美国最大的一家网络电子商务公司,亚马逊弹性计算云Amazon EC2更是鼎 ...
- 当 EDA 遇到 Serverless,亚马逊云科技出招了
近二三十年来,软件开发领域毫无疑问是发展最为迅速的行业之一. 在上个世纪九十年代,世界上市值最高的公司大多是资源类或者重工业类的公司,例如埃克森美孚或者通用汽车,而现在市值最高的公司中,纯粹的软件公司 ...
- AWS系列之一 亚马逊云服务概述
云计算经过这几年的发展,已经不再是是一个高大上的名词,而是已经应用到寻常百姓家的技术.每天如果你和互联网打交道,那么或多或少都会和云扯上关系.gmail.github.各种网盘.GAE.heroku等 ...
- 亚马逊云服务器AWS安装CentOS
亚马逊云服务器默认创建的实例,在停止之后再启动的情况下,IP会发生改变.所以我们最好先创建一个弹性IP,即EIP,不过我也不清楚这个费用. 1.按如图操作创建一个弹性IP,弹性IP创建之后可以随便绑定 ...
- 【AWS】亚马逊云常用服务解释
新公司使用的是亚马逊服务,刚开始的时候,对很多名词不太明白,总结了一下如下 1,EC2 这个是亚马逊的一种服务器服务,可以理解为跟vmware差不多,EC2为虚拟机提供载体,EC2上跑虚拟机服务器. ...
- 使用亚马逊云服务器EC2做深度学习(三)配置TensorFlow
这是<使用亚马逊云服务器EC2做深度学习>系列的第三篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- 亚马逊云架设WordPress博客
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这篇文章介绍如何在亚马逊云架设WordPress博客.最强的云,加上最流行的建站工 ...
随机推荐
- 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧
记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...
- ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本
此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...
- 谱聚类(spectral clustering)原理总结
谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...
- [.NET] 利用 async & await 进行异步 IO 操作
利用 async & await 进行异步 IO 操作 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6082673.html 序 上次,博主 ...
- js参数arguments的理解
原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...
- Autofac - MVC/WebApi中的应用
Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...
- 浅谈JSP中include指令与include动作标识的区别
JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...
- iOS之延时执行(睡眠)的几种方法
1. 最直接的方法: [self performSelector:@selector(deleyMethod) withObject:nil afterDelay:1.0]; 此方式要求必须在主线程中 ...
- NSURLSession详解
导语 现在NSURLConnection在开发中会使用的越来越少,iOS9已经将NSURLConnection废弃,现在最低版本一般适配iOS7,所以也可以使用. NSURLConnection相对于 ...