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程序的方法
Apr 21 Python
Python命名空间详解
Aug 18 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
python PyTorch预训练示例
Feb 11 Python
python实现log日志的示例代码
Apr 28 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
解决python中无法自动补全代码的问题
Dec 04 Python
python 执行终端/控制台命令的例子
Jul 12 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
python函数调用,循环,列表复制实例
May 03 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 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函数代码
2010/04/22 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
php实现复制移动文件的方法
2015/07/29 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
Laravel find in set排序实例
2019/10/09 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
javascript实现实时输出当前的时间
2015/04/27 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
Python随机生成带特殊字符的密码
2016/03/02 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
Python的log日志功能及设置方法
2019/07/11 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
行政经理岗位职责
2013/11/09 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
元旦晚会感言
2014/03/12 职场文书
卖车协议书
2014/04/21 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
车贷收入证明范本
2014/09/14 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书