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循环语句之break与continue的用法
Oct 14 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
简单实现python聊天程序
Apr 01 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
Python函数的默认参数设计示例详解
Dec 01 Python
基于python实现语音录入识别代码实例
Jan 17 Python
浅析matlab中imadjust函数
Feb 27 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
Django REST Framework 分页(Pagination)详解
Nov 30 Python
python基于opencv实现人脸识别
Jan 04 Python
用Python监控你的朋友都在浏览哪些网站?
May 27 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实现斐波那契数列的简单写法
2014/07/19 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
python基于multiprocessing的多进程创建方法
2015/06/04 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
python 产生token及token验证的方法
2018/12/26 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
机修工工作职责
2014/02/21 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
MySQL时区造成时差问题
2022/04/13 MySQL