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之??碌某?? target=
Sep 12 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Apache如何部署django项目
May 21 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Python常见的pandas用法demo示例
Mar 16 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python socket聊天脚本代码实例
Jan 02 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
python处理json数据文件
Apr 11 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
PHP学习之数组的定义和填充
2011/04/17 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
python机器人行走步数问题的解决
2018/01/29 Python
python实现爬山算法的思路详解
2019/04/09 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
数据保密承诺书
2014/06/03 职场文书
机关职员工作检讨书
2014/10/23 职场文书
超市督导岗位职责
2015/04/10 职场文书