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 04 Python
简单的python后台管理程序
Apr 13 Python
详解Python 正则表达式模块
Nov 05 Python
ipython和python区别详解
Jun 26 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Django项目创建及管理实现流程详解
Oct 13 Python
python logging模块的使用详解
Oct 23 Python
python hmac模块验证客户端的合法性
Nov 07 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 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过程中的一些注意点的总结
2013/10/25 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
PHP实现简单登录界面
2019/10/23 PHP
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
json数据的列循环示例
2013/09/06 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python中property和setter装饰器用法
2019/12/19 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
《云雀的心愿》教学反思
2014/02/25 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
运动与健康自我评价
2015/03/09 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL