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

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

实例:

1.使用Python发送纯文本格式和html格式的邮件.

 #!/usr/bin/env python
#coding:utf-8 import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr def email(message):
#构造MIMEText对象,第一个参数就是邮件正文,第二个参数是MIME的subtype
# 传入'plain',最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。
msg = MIMEText(message, 'plain', 'utf-8') #message为传入的参数,为发送的消息.
"""msg = MIMEText('<html><body><h1>Hello</h1>' +
'<p>send by <a href="http://www.python.org">Python</a>...</p>' +
'</body></html>', 'html', 'utf-8') """
#标准邮件需要三个头部信息: From, To, 和 Subject。
msg['From'] = formataddr(["管理员",'ylemail2012@sina.cn']) #显示发件人信息
msg['To'] = formataddr(["Saneri",'349622541@qq.com']) #显示收件人信息
msg['Subject'] = "Zabbix报警系统!" #定义邮件主题
try:
#创建SMTP对象
server = smtplib.SMTP("smtp.sina.com", 25)
#set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
#server.set_debuglevel(1)
#login()方法用来登录SMTP服务器
server.login("ylemail2012@sina.cn","password")
#sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str
server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string())
print u"邮件发送成功!" server.quit()
except smtplib.SMTPException:
print u"Error: 无法发送邮件"
if __name__ == '__main__':
cpu = 100
disk = 500
mem = 50
for i in range(1):
if cpu > 90:
alert = u"CPU出问题!"
email(alert)
if disk > 90:
alert = u"硬盘出问题!"
email(alert)
if mem > 80:
alert = u"内存出问题!"
email(alert)
#Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html
     msg = MIMEText('<html><body><h1>Hello</h1>' +
'<p>send by <a href="http://www.python.org">Python</a>...</p>' +
'</body></html>', 'html', 'utf-8')

2.Python 发送带附件的邮件.

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

 #!/usr/bin/env python
#coding:utf-8 import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart def email(message): msg = MIMEMultipart()
msg['From'] = formataddr(["管理员",'ylemail2012@sina.cn'])
msg['To'] = formataddr(["Saneri",'349622541@qq.com'])
msg['Subject'] = "Zabbix报警系统!"
msg.attach(MIMEText(message, 'plain', 'utf-8')) #---这是附件部分---
# 构造附件1,文本类型附件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
msg.attach(att1) # 构造附件2,jpg类型附件
from email.mime.application import MIMEApplication
att2 = MIMEApplication(open('001.jpg','rb').read())
att2.add_header('Content-Disposition', 'attachment', filename="001.jpg")
msg.attach(att2)
#构造附件3,pdf类型附件
att3 = MIMEApplication(open('test.pdf','rb').read())
att3.add_header('Content-Disposition', 'attachment', filename="test.pdf")
msg.attach(att3)
#构造附件4,xlsx类型附件
att4 = MIMEApplication(open('test.xlsx','rb').read())
att4.add_header('Content-Disposition', 'attachment', filename="test.xlsx")
msg.attach(att4)
#构造附件5,mp3类型附件
att5 = MIMEApplication(open('test.mp3','rb').read())
att5.add_header('Content-Disposition', 'attachment', filename="test.mp3")
msg.attach(att5) try:
server = smtplib.SMTP("smtp.sina.com", 25)
#set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
#server.set_debuglevel(1)
#login()方法用来登录SMTP服务器
server.login("ylemail2012@sina.cn","password")
#sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str
server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string())
print u"邮件发送成功!"
server.quit()
except smtplib.SMTPException:
print u"Error: 无法发送邮件"
if __name__ == '__main__':
cpu = 100
disk = 500
mem = 50
for i in range(1):
if cpu > 90:
alert = u"CPU出问题!"
email(alert)
if disk > 90:
alert = u"硬盘出问题!"
email(alert)
if mem > 80:
alert = u"内存出问题!"
email(alert)

3.在 HTML 文本中添加图片

邮件的 HTML 文本中一般邮件服务商添加外链是无效的,正确添加突破的实例如下所示:

 #!/usr/bin/env python
#coding:utf-8 import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.utils import formataddr def email():
msg = MIMEMultipart()
msg['From'] = formataddr(["管理员",'ylemail2012@sina.cn'])
msg['To'] = formataddr(["Saneri",'349622541@qq.com'])
msg['Subject'] = "Zabbix报警系统!"
msg.attach(MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>good!','html','utf-8')) fp = open('001.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
try:
server = smtplib.SMTP("smtp.sina.com", 25)
server.login("ylemail2012@sina.cn","password")
server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string())
print u"邮件发送成功!"
server.quit()
except smtplib.SMTPException:
print u"Error: 无法发送邮件" if __name__ == '__main__':
email()

4.同时支持HTML和Plain格式

如果我们发送HTML邮件,收件人通过浏览器或者Outlook之类的软件是可以正常浏览邮件内容的,但是,如果收件人使用的设备太古老,查看不了HTML邮件怎么办?

办法是在发送HTML的同时再附加一个纯文本,如果收件人无法查看HTML格式的邮件,就可以自动降级查看纯文本邮件。

利用MIMEMultipart就可以组合一个HTML和Plain,要注意指定subtype是alternative

 msg = MIMEMultipart('alternative')
msg['From'] = ...
msg['To'] = ...
msg['Subject'] = ... msg.attach(MIMEText('hello', 'plain', 'utf-8'))
msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html', 'utf-8'))
# 正常发送msg对象...

更多参阅:

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

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000

												

Python SMTP邮件模块的更多相关文章

  1. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  2. python smtp邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...

  3. Python SMTP邮件发送

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块: email负责构造邮件 ...

  4. selenium+python smtp邮件

    #code:utf-8 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIM ...

  5. python大法好——Python SMTP发送邮件

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  6. python之UnittTest模块

    一. UnitTest单元测试框架 1.1概述 unittest原名为PyUnit,是由java的JUnit衍生而来.单元测试是对程序中最小的可测试模块(函数)来进行测试:对于单元测试,需要设置预先条 ...

  7. Python——SMTP发送邮件

    一.定义 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.python的smtplib ...

  8. python QQ邮件发送邮件

    # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import ...

  9. python学习之模块导入,操作邮件,redis

    python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...

随机推荐

  1. Spark调度管理(读书笔记)

    Spark调度管理(读书笔记) 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark调度管理 本文主要介绍在单个任务内Spark的调度管理,Spark调度相关概念如 ...

  2. 使用JNI封装底层input系统提供的event事件

    首先说下思路,本文采用jni技术封装底层触摸事件,封装成MotionEvent类一样,不过没有android系统MotionEvent强大.源码MotionEvent位置:java-->fram ...

  3. Windows共享作为公司文件服务器的案例

    1.目录结构 → 主管 部门 → 员工 → Public 2.实现效果 每个部门一个目录 部门主管可以访问自己和部门员工的目录 部门员工只可访问自己的目录 公共目录Public部门所有人都可访问 3. ...

  4. ubuntu下安装加装DNS

    感觉在ubuntu下网速特别的慢,所以网上找了下解决方案,本地缓存域名解析相关信息. 首先,安装dns服务 命令: sudo apt-get install dnsmasq 编辑dnsmasq的配置文 ...

  5. ZBrush中的动态网格该怎么进行运用

    DynaMesh是ZBrush最新的基础模型创建工具,该命令用于基本模型的起稿到中模的制作.使用DynaMesh完全不启用考虑模型的拓扑,可以从一个图形拉扯出整个模型的分支,本文将以一个实例简单介绍Z ...

  6. OpenStack 企业私有云的若干需求(6):大规模扩展性支持

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  7. [转载]python:open/文件操作

    open/文件操作f=open('/tmp/hello','w') #open(路径+文件名,读写模式) #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式 如:' ...

  8. 【ASC 23】G. ACdream 1429 Rectangular Polygon --DP

    题意:有很多棍子,从棍子中选出两个棍子集合,使他们的和相等,求能取得的最多棍子数. 解法:容易看出有一个多阶段决策的过程,对于每个棍子,我们有 可以不选,或是选在第一个集合,或是选在第二个集合 这三种 ...

  9. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  10. 嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序

    NAND FLASH是一个存储芯片. 在芯片上的DATA0-DATA7上既能传输数据也能传输地址. 当ALE为高电平时传输的是地址. 当CLE为高电平时传输的是命令. 当ALE和CLE都为低电平时传输 ...