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通过shutil实现快速文件复制的方法
Mar 14 Python
python读写json文件的简单实现
Apr 11 Python
python生成词云的实现方法(推荐)
Jun 13 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
Python flask框架端口失效解决方案
Jun 04 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
Python 键盘事件详解
Nov 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 Socket配置以及实例的详细介绍
2013/06/13 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
详解PHP PDO简单教程
2019/05/28 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python 显示数组全部元素的方法
2018/04/19 Python
用Python实现读写锁的示例代码
2018/11/05 Python
在python里面运用多继承方法详解
2019/07/01 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
英国网上超市:Ocado
2020/03/05 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
生产内勤岗位职责
2013/12/07 职场文书
护士自我鉴定怎么写
2014/02/07 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
优秀教师单行材料
2014/12/16 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
全新239军机修复记
2022/04/05 无线电
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS