Python使用smtp和pop简单收发邮件完整实例


Posted in Python onJanuary 09, 2018

SMTP

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

pop

收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。

Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。

注意到POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。

要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象。

所以,收取邮件分两步:

第一步:用poplib把邮件的原始文本下载到本地;

第二部:用email解析原始文本,还原为邮件对象。

email系统组件:

MTA消息传输代理,负责邮件的路由,队列和发送

SMTP简单邮件传输协议

1连接到服务器

2登陆

3发出服务请求

4退出

POP:邮局协议

RFC918"邮局协议的目的是让用户的工作站可以访问到邮箱服务器里的邮件。

邮件要能从工作站通过简单邮件传输协议SMTP发送到邮件服务器"

POP的使用:

1连接到服务器

2登陆

3发出服务请求

4退出

#coding:utf8 
#python2.7 mailtest.py 
''''' 
使用smtp和pop3 协议收发qq邮箱实验 
用户名和密码需要自己填写 
''' 
 
from smtplib import SMTP 
from smtplib import SMTPRecipientsRefused 
from poplib import POP3 
from time import sleep 
import sys 
 
smtpserver = 'smtp.qq.com' 
pop3server = 'pop.qq.com' 
emailaddr = '847915049@qq.com' 
username = 'XXX' 
password = 'XXX' 
 
#组合邮件格式 
origHeaders = ['From: 847915049@qq.com', 
 'To: 847915049@qq.com', 
 'Subject: test msg'] 
origBody = ['nihao ','yaan','sichuan'] 
origMsg = '\r\n\r\n'.join(['\r\n'.join(origHeaders),'\r\n'.join(origBody)]) 
 
#发送邮件部分 
sendSer = SMTP(smtpserver) 
sendSer.set_debuglevel(1) 
print sendSer.ehlo()[0] #服务器属性等 
sendSer.login(username,password) #qq邮箱需要验证 
try: 
 errs = sendSer.sendmail(emailaddr,emailaddr,origMsg) 
except SMTPRecipientsRefused: 
 print 'server refused....' 
 sys.exit(1) 
sendSer.quit() 
assert len(errs) == 0,errs 
 
 
print '\n\n\nsend a mail ....OK!' 
sleep(10) #等待10秒 
print 'Now get the mail .....\n\n\n' 
 
 
 
#开始接收邮件 
revcSer = POP3(pop3server) 
revcSer.user(username) 
revcSer.pass_(password) 
 
rsp,msg,siz = revcSer.retr(revcSer.stat()[0]) 
sep = msg.index('') 
if msg: 
 for i in msg: 
  print i 
revcBody = msg[sep+1:] 
assert origBody == revcBody 
print 'successful get ....'

结果:

send: 'ehlo [169.254.114.107]\r\n' 
reply: '250-smtp.qq.com\r\n' 
reply: '250-PIPELINING\r\n' 
reply: '250-SIZE 52428800\r\n' 
reply: '250-AUTH LOGIN PLAIN\r\n' 
reply: '250-AUTH=LOGIN\r\n' 
reply: '250-MAILCOMPRESS\r\n' 
reply: '250 8BITMIME\r\n' 
reply: retcode (250); Msg: smtp.qq.com 
PIPELINING 
SIZE 52428800 
AUTH LOGIN PLAIN 
AUTH=LOGIN 
MAILCOMPRESS 
8BITMIME 
250 
send: 'AUTH PLAIN ADg0NzkxNTA0OQA0OTMzODQ4MTIzNA==\r\n' 
reply: '235 Authentication successful\r\n' 
reply: retcode (235); Msg: Authentication successful 
send: 'mail FROM:<847915049@qq.com> size=88\r\n' 
reply: '250 Ok\r\n' 
reply: retcode (250); Msg: Ok 
send: 'rcpt TO:<847915049@qq.com>\r\n' 
reply: '250 Ok\r\n' 
reply: retcode (250); Msg: Ok 
send: 'data\r\n' 
reply: '354 End data with <CR><LF>.<CR><LF>\r\n' 
reply: retcode (354); Msg: End data with <CR><LF>.<CR><LF> 
data: (354, 'End data with <CR><LF>.<CR><LF>') 
send: 'From: 847915049@qq.com\r\nTo: 847915049@qq.com\r\nSubject: test msg\r\n\r\nnihao \r\nyaan\r\nsichuan\r\n.\r\n' 
reply: '250 Ok: queued as \r\n' 
reply: retcode (250); Msg: Ok: queued as 
data: (250, 'Ok: queued as') 
send: 'quit\r\n' 
reply: '221 Bye\r\n' 
reply: retcode (221); Msg: Bye 
 
 
 
send a mail ....OK! 
Now get the mail ..... 
 
 
 
Date: Mon, 22 Apr 2013 16:22:01 +0800 
X-QQ-mid: esmtp26t1366618921t440t12695 
Received: from [169.254.114.107] (unknown [120.210.224.173]) 
 by esmtp4.qq.com (ESMTP) with SMTP id 0 
 for <847915049@qq.com>; Mon, 22 Apr 2013 16:22:01 +0800 (CST) 
X-QQ-SSF: B101000000000050321003000000000 
From: 847915049@qq.com 
To: 847915049@qq.com 
Subject: test msg 
 
nihao 
yaan 
sichuan 
successful get ....

总结

以上就是本文关于Python使用smtp和pop简单收发邮件完整实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
对python 中class与变量的使用方法详解
Jun 26 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
python多进程下的生产者和消费者模型
May 07 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 Python
Python生成九宫格图片的示例代码
Apr 14 Python
matlab xlabel位置的设置方式
May 21 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 #Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 #Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 #Python
运动检测ViBe算法python实现代码
Jan 09 #Python
python+opencv实现动态物体识别
Jan 09 #Python
Python设计模式之门面模式简单示例
Jan 09 #Python
Python和Java进行DES加密和解密的实例
Jan 09 #Python
You might like
[转帖]PHP世纪万年历
2006/12/06 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python求质数列表的例子
2019/11/24 Python
使用python去除图片白色像素的实例
2019/12/12 Python
python爬虫请求头设置代码
2020/07/28 Python
Python和Bash结合在一起的方法
2020/11/13 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
公务员职业生涯规划书范文  
2014/01/19 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
《赶海》教学反思
2014/04/20 职场文书
产品委托授权书范本
2014/09/16 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
运动会开幕式致辞
2015/07/29 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python