发送邮件

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。

发送简单邮件

下面是最简单的发邮件的例子:

# coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header # 连接邮件服务器
mail_host = 'smtp.163.com'
mail_port = '25'
mail_from = 'xxx@163.com'
smtp = smtplib.SMTP()
# smtp.set_debuglevel(1) # 打印出和SMTP服务器交互的所有信息
smtp.connect(mail_host, mail_port)
smtp.login(mail_from, 'xxx') # 构造邮件对象
msg = MIMEText('Python测试', 'plain', 'utf-8')
msg['From'] = mail_from
msg['To'] = 'xxx@qq.com'
msg['Subject'] = Header('测试邮件', 'utf-8') # 发送邮件
smtp.sendmail(mail_from, 'xxx@qq.com', msg.as_string())
smtp.quit()

注意默认msg['From']msg['To']都是邮箱格式。msg['From']可以和发件邮箱不一致,即使是不存在的邮箱,例如'yjc@test.com',会显示是代发的。

如果想要将msg['From']改为中文的,需要编码:

# coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr)) # 连接邮件服务器
mail_host = 'smtp.163.com'
mail_port = '25'
mail_from = 'xxx@163.com'
smtp = smtplib.SMTP()
smtp.connect(mail_host, mail_port)
smtp.login(mail_from, 'xxx') # 构造邮件对象
msg = MIMEText('Python测试', 'plain', 'utf-8')
msg['From'] = _format_addr('Python爱好者 <%s>' % mail_from)
msg['To'] = _format_addr('管理员 <%s>' % 'xxx@qq.com')
msg['Subject'] = Header('测试邮件', 'utf-8') # 发送邮件
smtp.sendmail(mail_from, 'xxx@qq.com', msg.as_string())
smtp.quit()

发送HTML格式的邮件

Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。

很简单,只需要把实例化邮件对象那句简单修改:

msg = MIMEText('<h1 style="color:red;">Python测试</h1>', 'html', 'utf-8')

再次发送就可以看到效果了。支持内联CSS。

发送附件

发送附件就需要把真个邮件当做复合型的内容:文本和各个附件本身。通过构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上附件部分:

# coding: utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header # 连接邮件服务器
mail_host = 'smtp.163.com'
mail_port = '25'
mail_from = 'xxx@163.com'
smtp = smtplib.SMTP()
smtp.connect(mail_host, mail_port)
smtp.login(mail_from, 'xxx') # 构造邮件对象
msg = MIMEMultipart()
msg['From'] = mail_from
msg['To'] = 'xxx@qq.com'
msg['Subject'] = Header('测试邮件', 'utf-8')
msg.attach(MIMEText('Python测试', 'plain', 'utf-8')) #邮件正文 ## 附件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream' # 二进制流,不知道下载文件类型
att1["Content-Disposition"] = 'attachment; filename="test.txt"' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1) att2 = MIMEText(open('test.jpg', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'image/jpeg'
att2["Content-Disposition"] = 'attachment; filename="test.jpg"'
msg.attach(att2) smtp.sendmail(mail_from, 'xxx@qq.com', msg.as_string())
smtp.quit()

这里将二进制文件读入并转成base64编码,添加到邮件中。需要注意的是,Content-Type指文件的Mime-Type,例如纯文本是text/plain,jpg是image/jpeg,如果不知道类型,则统称为application/octet-stream

最后需要注意的是,发送邮件部分最好使用try...except...语句:

try:
smtp = smtplib.SMTP('localhost')
smtp.sendmail(sender, receivers, msg.as_string())
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"

参考:

1、SMTP发送邮件 - 廖雪峰的官方网站

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000

2、Python SMTP发送邮件 | 菜鸟教程

http://www.runoob.com/python/python-email.html

3、HTTP Content-type 对照表

http://tool.oschina.net/commons

Python学习--21 电子邮件的更多相关文章

  1. Python学习--21天Python基础学习之旅(Day08-Day21)

    Day08: Chapter 11 异常 1.1如果try代码块中代码运行没有问题,则运行时跳过except代码块.(有异常时执行except中的代码,没有异常则跳过except中的代码) try-e ...

  2. Python学习--21天Python基础学习之旅(Day01、Day02)

    21天的python基础学习,使用<Python从入门到实践>,并且需要手敲书中的code,以下为整个学习过程的记录. Day01: 安装python时要选择复选框 Add Python ...

  3. python学习(21) smtp发送邮件

    原文链接: https://www.jianshu.com/p/369ec15bfe22 本文介绍python发送邮件模块smtplib以及相关MIME模块.smtplib用于生成邮件发送的代理,发送 ...

  4. Python学习(21):Python函数(5):变量作用域与闭包

    转自 http://www.cnblogs.com/BeginMan/p/3179040.html 一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除, ...

  5. Python学习-21.Python的代码注释

    在Python中有两种注释,一种是普通注释,另一种是文档注释. 普通注释是使用#开头 print('output something') # here is comment 而Python中多行注释也 ...

  6. python学习21之高级特性

    '''''''''1.切片(1)谁可以进行切片操作?——列表,元组,字符串(2)切片有以下几种操作'''#[a:b]:取从下标为a的元素开始,到下标为b-1的元素结束L=['aa','bb','cc' ...

  7. Python学习--21天Python基础学习之旅(Day05、Day06、Day07)

    Day05: Chapter 8 函数 1.1函数定义与调用 1.1.1向函数传递参数 1.2传递实参 1.2.1位置实参:基于实参顺序 1.2.2关键字实参:调用时指出各个实参对应的形参 1.2.3 ...

  8. Python学习--21天Python基础学习之旅(Day03、Day04)

    关于缩进问题,缩进几个空格都不影响程序解释(不会报错什么的),但一般缩进四个空格是为了可读性和规范. Day03: Chapter 5 1.if语句 1.1条件测试:值为True或False的表达式成 ...

  9. python学习-21 集合 2

    集合的其他方法 1.交差补集 math = {'xm','xh','xg','xx'} english ={'xm','xh','dm','john'} print(math.symmetric_di ...

随机推荐

  1. 安装php扩展后,执行时找不到扩展 class xxx no found

    当编译安装一个新的php扩展,例如安装redis, 安装后 执行 new Redis(), 如果发现找不到class Redis,可以先检查redis.so文件是否在php的扩展目录下, 如果发现是, ...

  2. Android源码编译jar包BUILD_JAVA_LIBRARY 与BUILD_STATIC_JAVA_LIBRARY的区别(一)

    一般情况下,在Android源码下编译一个jar包的典型makefile(Android.mk)如下: 在文件中加入以下内容: LOCAL_PATH:= $(call my-dir)#make jar ...

  3. STM32-USB详细使用说明(转)

    源:STM32-USB详细使用说明 附件HID的双向通信 亮点STM32开发板充实了USBHID数据发送和接收例程(STM32固件库3.5 USB库3.4)

  4. 利用jackson转成json字符串(ssh中)

    public String getJsonString(Object o){ ObjectMapper om = new ObjectMapper(); StringWriter sw = new S ...

  5. Delphi 常用函数(数学函数)round、trunc、ceil和floor

    源:Delphi 常用函数(数学函数)round.trunc.ceil和floor Delphi 常用函数(数学) Delphi中怎么将实数取整? floor 和 ceil 是 math unit 里 ...

  6. 菊花加载第三方--MBprogressHUD 分类: ios技术 2015-02-05 19:21 120人阅读 评论(0) 收藏

    上次说到了网络请求AFN,那么我们在网络请求的时候,等待期间,为了让用户不认为是卡死或程序出错,一般都会放一个菊花加载,系统有一个菊花加载类叫UIProgressHUD.但是我今天要说的是一个替代它的 ...

  7. Tsinsen-1487:分配游戏【树状数组】

    首先一定要看到x + y + z = N这个条件,没看到就世界再见了. 赢的人得分需要大于等于2,那么无非就是 (x, y), (x, z), (y, z), (x, y, z) 大于其他的点.但是考 ...

  8. [osg]osg显示中文信息

    转自:http://www.cnblogs.com/feixiang-peng/articles/3152754.html 写好了在osg中实时显示中文信息的效果.中间遇到两个问题,一个是中文显示,一 ...

  9. 使用nodejs爬取和讯网高管增减持数据

    为了抓取和讯网高管增减持的数据,首先得分析一下数据的来源: 网址: http://stockdata.stock.hexun.com/ggzjc/history.shtml 使用chrome开发者工具 ...

  10. UVA - 140 Bandwidth(带宽)(全排列)

    题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...