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中的闭包详细介绍和实例
Nov 21 Python
python实现自动发送报警监控邮件
Jun 21 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
信号生成及DFT的python实现方式
Feb 25 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Python接口测试文件上传实例解析
May 22 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
如何用Python 加密文件
Sep 10 Python
Python偏函数实现原理及应用
Nov 20 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 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
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
Javascript - HTML的request类
2006/07/15 Javascript
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
python连接mysql实例分享
2016/10/09 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
python批量爬取下载抖音视频
2019/06/17 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
python打包生成so文件的实现
2020/10/30 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
学生生病请假条范文
2014/02/16 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
个人租房协议书样本
2014/10/01 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏