Python学习笔记18-发送邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplib
和email
两个模块,email
负责构造邮件,smtplib
负责发送邮件。
普通正文邮件:
- #/usr/bin/env python
- #coding=utf-8
- from email import encoders
- from email.header import Header
- from email.mime.text import MIMEText
- from email.utils import parseaddr, formataddr
- import smtplib
- def _format_addr(s):
- name, addr = parseaddr(s)
- return formataddr((Header(name, 'utf-8').encode(), addr))
- from_addr = 'zy5724@163.com'
- password = 'xxxxx'
- to_addr = 'scottcho@qq.com'
- smtp_server = 'smtp.163.com'
- msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
- msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
- msg['To'] = _format_addr('管理员 <%s>' % to_addr)
- msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
- try:
- server = smtplib.SMTP(smtp_server, 25)
- # server.set_debuglevel(1)
- server.login(from_addr, password)
- server.sendmail(from_addr, [to_addr], msg.as_string())
- server.quit()
- print 'send OK'
- except Exception, e:
- print str(e)
注意到构造MIMEText
对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'
表示纯文本,最终的MIME就是'text/plain'
,最后一定要用utf-8
编码保证多语言兼容性。
我们用set_debuglevel(1)
就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()
方法用来登录SMTP服务器,sendmail()
方法就是发邮件,由于可以一次发给多个人,所以传入一个list
,邮件正文是一个str
,as_string()
把MIMEText
对象变成str
。
收到的邮件:
带有附件的邮件:
- #/usr/bin/env python
- # coding: utf-8
- from email import encoders
- from email.header import Header
- from email.mime.text import MIMEText
- from email.MIMEBase import MIMEBase
- from email.utils import parseaddr, formataddr
- from email.mime.multipart import MIMEMultipart
- import smtplib
- def _format_addr(s):
- name, addr = parseaddr(s)
- return formataddr(( \
- Header(name, 'utf-8').encode(), \
- addr.encode('utf-8') if isinstance(addr, unicode) else addr))
- from_addr = 'zy5724@163.com'
- password = 'xxxx'
- to_addr = 'scottcho@qq.com'
- smtp_server = 'smtp.163.com'
- # 邮件对象:
- msg = MIMEMultipart()
- msg['From'] = _format_addr(u'张三 <%s>' % from_addr)
- msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
- msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()
- # 邮件正文是MIMEText:
- msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
- # 添加附件就是加上一个MIMEBase
- att1 = MIMEText(open('/python/new.txt', 'rb').read(), 'base64', 'utf-8')
- att1["Content-Type"] = 'application/octet-stream'
- att1["Content-Disposition"] = 'attachment; filename="new.txt"'
- msg.attach(att1)
- #再添加一个图片附件
- with open('/python/Koala.jpg', 'rb') as f:
- att2 = MIMEBase('image', 'jpg', filename='Koala.jpg')
- att2.add_header('Content-Disposition', 'attachment', filename='Koala.jpg')
- att2.add_header('Content-ID', '<0>')
- att2.set_payload(f.read())
- encoders.encode_base64(att2)
- msg.attach(att2)
- server = smtplib.SMTP(smtp_server, 25)
- server.set_debuglevel(1)
- server.login(from_addr, password)
- server.sendmail(from_addr, [to_addr], msg.as_string())
- server.quit()
我们编写了一个函数_format_addr()
来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>
,因为如果包含中文,需要通过Header
对象进行编码。
结果:
使用开源的yagmail发送邮件
yagmail底层依然使用smtplib和email模块,但是它提供了更加Pythonic的接口。
安装: pip install yagmail
查看邮件:
Python学习笔记18-发送邮件的更多相关文章
- python学习笔记18(UliPad 初体验)
在windows下安装配置Ulipad 由于UliPad 是由wxPython 开发的,所以,需要先安装wxPython . wxPython下载地址: http://www.wxpython.org ...
- Python学习笔记18:标准库之多进程(multiprocessing包)
我们能够使用subprocess包来创建子进程.但这个包有两个非常大的局限性: 1) 我们总是让subprocess执行外部的程序,而不是执行一个Python脚本内部编写的函数. 2) 进程间仅仅通过 ...
- Python 学习笔记18 异常处理
我们在编码的过程中,难免会遇到一些错误和异常, 这时候程序会异常退出,并且会抛出错误信息: 比如: print(1/0) ''' 输出: Traceback (most recent call las ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- Python学习笔记(十四)
Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...
- Python学习笔记(十)
Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...
- Python学习笔记(八)
Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...
- Python学习笔记之类与对象
这篇文章介绍有关 Python 类中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中类的使用技巧 1.与类和对象相关的内置方法 issubclass(class, classinfo) ...
- python 学习笔记 12 -- 写一个脚本获取城市天气信息
近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...
随机推荐
- 【Python】python3-list列表引用
print(names) #列出列表的内容 print(names[3]) #访问列表中第4个值 print(names[1:3]) #访问列表中从第2个到第3个的值 print(names[-1]) ...
- GRUB——系统的引导程序简单介绍
这几天对于操作系统是如何引导启动的特征的感兴趣,已经到了不能自拔的状态了,所以索性好好了解一下: 前面已经说过了,MBR对于系统启动的重要性,这是不多啰嗦: 现在介绍一个 grub ,启动管理器,它 ...
- [转]android ANR产生原因和解决办法
ANR (Application Not Responding) ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(AN ...
- e824. 获得和设置JSplitPane中的子组件
// Create a left-right split pane JSplitPane hpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, lef ...
- openssl创建自己的CA certificate
Create a Certificate Authority private key (this is your most important key): $ openssl req -new -ne ...
- c# winform 获取当前程序运行根目录,winform 打开程序运行的文件夹
// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...
- Xianfeng轻量级Java中间件平台:功能管理
功能管理:从功能类型来看,不属于用户使用的功能,而属于系统维护使用的功能,因为对于用户来说,是不可见的.功能管理的作用是定义一套规则,用来处理权限等业务,比如常见的菜单权限控制.按钮权限控制等情景 在 ...
- tophat-fusion 鉴定融合基因
tophat-fusion 是一款利用RNA_seq 数据鉴定融合基因的工具,官网链接如下: http://ccb.jhu.edu/software/tophat/fusion_index.shtml ...
- SpringMVC文件上传基础
maven依赖 <!--文件上传所需--> <dependency> <groupId>commons-fileupload</groupId> < ...
- php + ajax 避免重复提交