python中使用smtplib和email模块发送邮件实例


Posted in Python onApril 22, 2014

SMTP模块

这么多已定义的类中,我们最常用的的还是smtplib.SMTP类,就具体看看该类的用法:
smtp实例封装一个smtp连接,它支持所有的SMTP和ESMTP操作指令,如果host和port参数被定义,则smtp会在初始化期间自动调用connect()方法,如果connect()方法失败,则会触发SMTPConnectError异常,timeout参数设置了超时时间。在一般的调用过程中,应该遵connetc()、sendmail()、quit()步骤。

SMTP模块主要方法

下面我们来看看该类的方法:

SMTP.set_debuglevel(level)
设置输出debug调试信息,默认不输出调试信息。
SMTP.docmd(cmd[, argstring])
发送一个command到smtp服务器,
SMTP.connect([host[, port]])
连接到指定的smtp服务器,默认是本机的25端口。也可以写成hostname:port的形式。
SMTP.helo([hostname])
使用helo指令向smtp服务器确认你的身份。
SMTP.ehlo([hostname])
使用ehlo指令向esmtp服务器确认你的身份。
SMTP.ehlo_or_helo_if_needed()
如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法调用ehlo()或者helo()。
SMTP.has_extn(name)
判断指定的名称是否在smtp服务器上。
SMTP.verify(address)
判断邮件地址是否在smtp服务器上存在。
SMTP.login(user, password)
登陆需要验证的smtp服务器,如果之前没有提供ehlo或者helo指令,则会先尝试ESMTP的ehlo指令。
SMTP.starttls([keyfile[, certfile]])
使smtp连接运行在TLS模式,所有的smtp指令都会被加密。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
发送邮件,该方法需要一些邮件地址和消息。
SMTP.quit()
终止smtp会话并且关闭连接。

经过搜索学习发现网上大多都是用smtp类的sendmail这个方法来发邮件,那就先看看这个例子:

使用sendmail发送邮件

import smtplib
import time
from email.message import Message
from time import sleep
import email.utils
import base64smtpserver = 'smtp.gmail.com'
username = 'username@gmail.com'
password = 'password '
from_addr = 'from@gmail.com'
to_addr = 'tooooooo@qq.com'
cc_addr = 'ccccccccc@qq.com'
time = email.utils.formatdate(time.time(),True)
message = Message()
message['Subject'] = 'Mail Subject'
message['From'] = from_addr
message['To'] = to_addr
message['Cc'] = cc_addr
message.set_payload('mail content '+time)
msg = message.as_string()
sm = smtplib.SMTP(smtpserver,port=587,timeout=20)
sm.set_debuglevel(1)
sm.ehlo()
sm.starttls()
sm.ehlo()
sm.login(username, password)
sm.sendmail(from_addr, to_addr, msg)
sleep(5)
sm.quit()

Email模块

如果想在邮件中携带附件、使用html书写邮件,附带图片等等,就需要使用email模块及其子模块。下面来看看email包,email包是用来管理email信息的,它包括MIME和其他基于RFC 2822的消息格式。email包的主要特征是在它内部解析和生成email信息是分开的模块来实现的。

MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体。邮件头与邮件体之间以空行进行分隔。

邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的。

邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。最常见的类型有text/plain(纯文本)和text/html(超文本)。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。
在email的包里面包含了很多模块:

email.message
email.parser
email.generator
email.mime 创建email和MIME对象
email.header
email.charset
email.encoders
email.ereors
email.utils
email.iterators

主要来看看email.mime,在邮件中携带附件、图片、音频时,主要使用的是该模块。一般情况下,你通过解析一个文件或者一段text来生成一个消息对象结构,你也可以从头开始建立一个消息结构,实际上,你可以给一个已经存在的消息结构追加一个新的消息对象。你可以通过创建message实例来创建一个对象结构,然后给该结构追加附件和头部信息。email包提供了一些子类使得该操作变得很容易。
模拟在邮件内容中携带图片,如下:

邮件内容中携带图片

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplibfrom_mail = 'froooooooom@gmail.com'
to_mail = 'toooooooooo@qq.com'
msg = MIMEMultipart()
msg['From'] = from_mail
msg['To'] = to_mail
msg['Subject'] = 'python mail test'
body = 'test img send'
con = MIMEText('<b>%s</b>
<img alt="" src="cid:D:\\10535-102.jpg" />
' % body,'html')
msg.attach(con)
img = MIMEImage(file('D:\\10535-102.jpg','rb').read())
img.add_header('Content-ID','D:\\10535-102.jpg')
msg.attach(img)
server = smtplib.SMTP('smtp.gmail.com')
server.docmd('ehol','tooooooo@gmail.com')
server.starttls()
server.login('username@gmail.com','password')
server.sendmail(from_mail,to_mail,msg.as_string())
server.quit()

邮件中携带附件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送
模拟在 邮件中携带附件 ,如下:

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib#创建一个带附件的实例
msg = MIMEMultipart()
txt = MIMEText("这是中文的邮件内容哦",'plain','gb2312')    
msg.attach(txt)
#构造附件1
att1 = MIMEText(open('d:\\drcom.rar', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="drcom.rar"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)
#构造附件2
att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="123.txt"'
msg.attach(att2)
#加邮件头
msg['to'] = 'tooooooo@qq.com'
msg['from'] = 'frommmmmmm@gmail.com'
msg['subject'] = 'hello world'
 
 
#发送邮件
try:
    server = smtplib.SMTP()
    server.connect('smtp.gmail.com')
    server.starttls()
    server.login('xxxxx@gmail.com','xxxxxxxxx')#XXX为用户名,XXXXX为密码
    server.sendmail(msg['from'], msg['to'],msg.as_string())
    server.quit()
    print '发送成功'
except Exception, e: 
    print str(e)
Python 相关文章推荐
Python过滤函数filter()使用自定义函数过滤序列实例
Aug 26 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
详解Django中的权限和组以及消息
Jul 23 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
python扫描线填充算法详解
Feb 19 Python
python相对企业语言优势在哪
Jun 12 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
python用字典统计单词或汉字词个数示例
Apr 22 #Python
python实现rest请求api示例
Apr 22 #Python
python 七种邮件内容发送方法实例
Apr 22 #Python
sqlalchemy对象转dict的示例
Apr 22 #Python
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 #Python
python实现linux服务器批量修改密码并生成execl
Apr 22 #Python
python中精确输出JSON浮点数的方法
Apr 18 #Python
You might like
德劲1102收音机的打理维修案例
2021/03/02 无线电
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
JS继承用法实例分析
2015/02/05 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
python爬取m3u8连接的视频
2018/02/28 Python
python实现感知器算法(批处理)
2019/01/18 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
反邪教宣传工作方案
2014/05/07 职场文书
影子教师研修方案
2014/06/14 职场文书
超市店庆活动方案
2014/08/31 职场文书
受伤赔偿协议书
2014/09/24 职场文书
2014小学年度工作总结
2014/12/20 职场文书
展览会邀请函
2015/02/02 职场文书
初中思想品德教学反思
2016/02/24 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL