一、我的需求
  我希望做成具有以下功能的软件:
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邮箱服务,实现两个邮箱之间的绑定(中)

用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(下)的更多相关文章

  1. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  2. linux配置邮箱服务

    配置邮箱服务Linux常见的邮箱客户端是mail或mutt:服务端有sendmail服务(centos 5).postfix服务(centos 6).这里我们不使用本地的邮件服务,而是使用本地的邮件客 ...

  3. 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(上)

    一.本程序的起源 当我决定去中科院实习的时候,我给刘奎恩老师发了封邮件.我对此事是非常看重的,因此经常使用浏览器,打开gmail去查看刘老师有没有给我回复.因为gmail的新邮件推送的功能仅限于打开浏 ...

  4. 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(中)

    这篇博客,主要讲解用Python实现邮箱服务的几个需要学习的模块:E-mail Compotion and Decoding(邮件生成和解析).SMTP.POP.IMAP 如上篇博客所讲,我学习过程参 ...

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

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

  6. 使用AWS亚马逊云搭建Gmail转发服务(一)

    title: 使用AWS亚马逊云搭建Gmail转发服务(一) author:青南 date: 2014-12-30 15:41:35 categories: Python tags: [Gmail,A ...

  7. 使用AWS亚马逊云搭建Gmail转发服务(三)

    title: 使用AWS亚马逊云搭建Gmail转发服务(三) author:青南 date: 2015-01-02 15:42:22 categories: [Python] tags: [log,G ...

  8. Linux下设置python脚本文件为服务

    (最简单的方式nohup python xxx.py) ------------------------------------------------------------------------ ...

  9. python 原生态调用server服务————SimpleHTTPServer

    python 原生态调用server服务,接收http传递的参数并且处理返回结果 很多blog中都是抄了官网的,没有说明参数如何接收 1.代码中提供了post与get两种方式来发起请求,但是传递参数时 ...

随机推荐

  1. 自定义View视图

    自定义View视图文件查找逻辑 之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写 ...

  2. C# 使用 Code Snippet 简化 Coding

    在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...

  3. spring中<tx:advice></tx:advice>是什么意思

    <tx:advice id="tv" transaction-manager="transactionManager"> <tx:attrib ...

  4. CSS3火焰文字特效制作教程

    原文:CSS3火焰文字特效制作教程 用一句很俗气的话概括这两天的情况就是:“最近很忙”,虽然手头上有不少很酷的HTML5和CSS3资源,但确实没时间将它们的实现过程写成教程分享给大家.今天刚完成了一个 ...

  5. ftk学习记录(button一片)

    [ 声明:版权所有所有.欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面,我们说到了label,这里能够看一下label执行的效果是怎么样的. waterma ...

  6. 解决Uploadify上传控件加载导致的GET 404 Not Found问题

    今天在项目发用到Uploadify上传, 发现在打开页面时会有一多余的请求,由于路由没有设置这个,导致404错误,能搜索查到以下解决的方法 <Uploadify v3 bug. Unecessa ...

  7. tcp接收队列

    对于接收数据包,内核维护如下几个队列:1>全局 backlog 队列,驱动程序调用 netif_rx 将接收到的数据包缓存于该队列中.2>sock 结构中 back_log 队列,网络层在 ...

  8. XShell删除键之类的不正常

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 一图解决 异常处理汇总:http://www.cnblogs.com/dunit ...

  9. CentOs Linux 文件位置标记

    vsFTP默认位置: 匿名:/var/ftp/ 用户:/home/用户名 配置文件:/etc/vsftpd/ (一般安装软件后都会在/etc/下生成一个软件相关的配置文件夹) 防火墙位置: /etc/ ...

  10. NM常用网络命令

    Ipconfig命令 Ipconfig命令可以被用来显示机器当前TCP/IP配置信息. 当使用Ipconfig时不带不论什么參数选项,那么它为每一个已经配置好的接口显示IP地址.子网掩码和默认网关值. ...