举例详解Python中smtplib模块处理电子邮件的使用


Posted in Javascript onJune 24, 2015

在基于互联网的应用中,程序经常需要自动地发送电子邮件。如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册;当用户忘记登陆密码的时候,通过邮件来取回密码。smtplib模块是python中smtp(简单邮件传输协议)的客户端实现。我们可以使用smtplib模块,轻松的发送电子邮件。下面的例子用了不到十行代码来发送电子邮件:
 

#coding=gbk 
 
import smtplib 
 
smtp = smtplib.SMTP() 
smtp.connect("smtp.yeah.net", "25") 
smtp.login('用户名', '密码') 
smtp.sendmail('from@yeah.net', 'to@21cn.com', 'From: from@yeah.net/r/nTo: to@21cn.com/r/nSubject: this is a email from python demo/r/n/r/nJust for test~_~') 
smtp.quit()

这个例子够简单吧^_^!下面详细介绍stmplib模块中的类和方法。
smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接我们可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。该类提供了许多方法,将在下面介绍。它的所有参数都是可选的,其中host参数表示smtp服务器主机名,上面例子中的smtp主机为”smtp.yeah.net”;port表示smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器。

smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。

smtplib.SMTP提供的方法:

SMTP.set_debuglevel(level)

设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。

SMTP.connect([host[, port]])

连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。

SMTP.docmd(cmd[, argstring])

向smtp服务器发送指令。可选参数argstring表示指令的参数。下面的例子完全通过调用docmd方法向服务器发送指令来实现邮件的发送(在smtp.yeah.net邮件服务器上试验通过。其他邮件服务器没有试过):
 

import smtplib, base64, time 
userName = base64.encodestring('from').strip() 
password = base64.encodestring('password').strip() 
smtp = smtplib.SMTP() 
smtp.connect("smtp.yeah.net:25") 
print smtp.docmd('helo', 'from') 
print smtp.docmd('auth login') 
print smtp.docmd(userName) 
print smtp.docmd(password) 
print smtp.docmd('mail from:', '<from@yeah.net>') 
print smtp.docmd('rcpt to:', '<from@yeah.net>') 
#data 指令表示邮件内容 
print smtp.docmd('data') 
print smtp.docmd(
'''''from: from@yeah.net 
to: from@yeah.net 
subject: subject 
email body 
. 
'''
) 
smtp.quit()

SMTP.helo([hostname])

使用”helo”指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。
SMTP.has_extn(name)

判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
SMTP.verify(address)

判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
SMTP.login(user, password)

登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。在上面的例子中,msg的值为:

 

'''''From: from@yeah.net 
To: to@21cn.com 
Subject: test 
 
just for test'''

这个字符串的的意思表示邮件发件人为”from@yeah.net”,收件人为” to@21cn.com”,邮件标题为”test”,邮件内容为”just for test”。细心的你可能会疑问:如果要发送的邮件内容很复杂,包含图片、视频、附件等内容,按照MIME的格式来拼接字符串,将是一件非常麻烦的事。不用担心,python已经考虑到了这点,它为我们提供了email模块,使用该模块可以轻松的发送带图片、视频、附件等复杂内容的邮件。在介绍完smtplib模块之后,我会简单介绍email模块的基本使用。
SMTP.quit()

断开与smtp服务器的连接,相当于发送”quit”指令。
email及其相关子模块

emial模块用来处理邮件消息,包括MIME和其他基于RFC 2822 的消息文档。使用这些模块来定义邮件的内容,是非常简单的。下面是一些常用的类:

  • class email.mime.multipart. MIMEMultipart: 多个MIME对象的集合。
  • class email.mime.audio. MIMEAudio: MIME音频对象。
  • class email.mime.image. MIMEImage: MIME二进制文件对象。
  • class email.mime.text. MIMEText: MIME文本对象。

看上面的解释可能会觉得云里雾里,其实我对smtp, MIME的理解也很肤浅。但在大多数时候,我们只要会用就可以了。下面是一个简单的例子来演示如何使用这些类来发送带附件的邮件:
 

#coding=gbk 
import smtplib, mimetypes 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
from email.mime.image import MIMEImage 
 
msg = MIMEMultipart() 
msg['From'] = "from@yeah.net" 
msg['To'] = 'to@21cn.com' 
msg['Subject'] = 'email for tesing' 
 
#添加邮件内容 
txt = MIMEText("这是邮件内容~~") 
msg.attach(txt) 
 
#添加二进制附件 
fileName = r'e:/PyQt4.rar' 
ctype, encoding = mimetypes.guess_type(fileName) 
if ctype is None or encoding is not None: 
 ctype = 'application/octet-stream' 
maintype, subtype = ctype.split('/', 1) 
att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(fileName, 'rb'))[0], _subtype = subtype) 
att1.add_header('Content-Disposition', 'attachment', filename = fileName) 
msg.attach(att1) 
 
#发送邮件 
smtp = smtplib.SMTP() 
smtp.connect('smtp.yeah.net:25') 
smtp.login('from', '密码') 
smtp.sendmail('from@yeah.net', 'to@21cn.com', msg.as_string()) 
smtp.quit() 
print '邮件发送成功'

是不是很简单。简单就是美,用最少的代码把问题解决,这就是Python。更多关于smtplib的信息,请参考Python手册 smtplib模块。

Javascript 相关文章推荐
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
Sep 25 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
javascript实现完美拖拽效果
May 06 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
easyui form validate总是返回false的原因及解决方法
Nov 07 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
解决vue路由name同名,路由重复的问题
Aug 05 Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
Jun 24 #Javascript
介绍一个简单的JavaScript类框架
Jun 24 #Javascript
jquery分割字符串的方法
Jun 24 #Javascript
jQuery根据元素值删除数组元素的方法
Jun 24 #Javascript
举例详解JavaScript中Promise的使用
Jun 24 #Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 #Javascript
jQuery中$.extend()用法实例
Jun 24 #Javascript
You might like
用PHP来写记数器(详细介绍)
2006/10/09 PHP
在IIS上安装PHP4.0正式版
2006/10/09 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
推荐11个实用Python库
2015/01/23 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python实现注册登录系统
2017/08/08 Python
详解Python time库的使用
2019/10/10 Python
python中的itertools的使用详解
2020/01/13 Python
python+opencv实现车道线检测
2021/02/19 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
政法大学毕业生自荐信范文
2014/01/01 职场文书
班主任工作年限证明
2014/01/12 职场文书
开展创先争优活动总结
2014/08/28 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
检举信的写法
2019/04/10 职场文书
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL