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

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

实例:

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

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

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

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

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import smtplib
  5. from email.mime.text import MIMEText
  6. from email.utils import formataddr
  7. from email.mime.multipart import MIMEMultipart
  8.  
  9. def email(message):
  10.  
  11. msg = MIMEMultipart()
  12. msg['From'] = formataddr(["管理员",'ylemail2012@sina.cn'])
  13. msg['To'] = formataddr(["Saneri",'349622541@qq.com'])
  14. msg['Subject'] = "Zabbix报警系统!"
  15. msg.attach(MIMEText(message, 'plain', 'utf-8'))
  16.  
  17. #---这是附件部分---
  18. # 构造附件1,文本类型附件
  19. att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
  20. att1["Content-Type"] = 'application/octet-stream'
  21. # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
  22. att1["Content-Disposition"] = 'attachment; filename="test.txt"'
  23. msg.attach(att1)
  24.  
  25. # 构造附件2,jpg类型附件
  26. from email.mime.application import MIMEApplication
  27. att2 = MIMEApplication(open('001.jpg','rb').read())
  28. att2.add_header('Content-Disposition', 'attachment', filename="001.jpg")
  29. msg.attach(att2)
  30. #构造附件3,pdf类型附件
  31. att3 = MIMEApplication(open('test.pdf','rb').read())
  32. att3.add_header('Content-Disposition', 'attachment', filename="test.pdf")
  33. msg.attach(att3)
  34. #构造附件4,xlsx类型附件
  35. att4 = MIMEApplication(open('test.xlsx','rb').read())
  36. att4.add_header('Content-Disposition', 'attachment', filename="test.xlsx")
  37. msg.attach(att4)
  38. #构造附件5,mp3类型附件
  39. att5 = MIMEApplication(open('test.mp3','rb').read())
  40. att5.add_header('Content-Disposition', 'attachment', filename="test.mp3")
  41. msg.attach(att5)
  42.  
  43. try:
  44. server = smtplib.SMTP("smtp.sina.com", 25)
  45. #set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
  46. #server.set_debuglevel(1)
  47. #login()方法用来登录SMTP服务器
  48. server.login("ylemail2012@sina.cn","password")
  49. #sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str
  50. server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string())
  51. print u"邮件发送成功!"
  52. server.quit()
  53. except smtplib.SMTPException:
  54. print u"Error: 无法发送邮件"
  55. if __name__ == '__main__':
  56. cpu = 100
  57. disk = 500
  58. mem = 50
  59. for i in range(1):
  60. if cpu > 90:
  61. alert = u"CPU出问题!"
  62. email(alert)
  63. if disk > 90:
  64. alert = u"硬盘出问题!"
  65. email(alert)
  66. if mem > 80:
  67. alert = u"内存出问题!"
  68. email(alert)

3.在 HTML 文本中添加图片

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

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import smtplib
  5. from email.mime.multipart import MIMEMultipart
  6. from email.mime.text import MIMEText
  7. from email.mime.image import MIMEImage
  8. from email.utils import formataddr
  9.  
  10. def email():
  11. msg = MIMEMultipart()
  12. msg['From'] = formataddr(["管理员",'ylemail2012@sina.cn'])
  13. msg['To'] = formataddr(["Saneri",'349622541@qq.com'])
  14. msg['Subject'] = "Zabbix报警系统!"
  15. msg.attach(MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>good!','html','utf-8'))
  16.  
  17. fp = open('001.jpg', 'rb')
  18. msgImage = MIMEImage(fp.read())
  19. fp.close()
  20. msgImage.add_header('Content-ID', '<image1>')
  21. msg.attach(msgImage)
  22. try:
  23. server = smtplib.SMTP("smtp.sina.com", 25)
  24. server.login("ylemail2012@sina.cn","password")
  25. server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string())
  26. print u"邮件发送成功!"
  27. server.quit()
  28. except smtplib.SMTPException:
  29. print u"Error: 无法发送邮件"
  30.  
  31. if __name__ == '__main__':
  32. email()

4.同时支持HTML和Plain格式

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

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

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

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

更多参阅:

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

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

  1.  

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. 【java开发】面向对象初步认识与基础概念讲解

    简单的把前面的java基础知识讲了,接下来就开始面向对象的旅程了. 对象(Object):简而言之,世界是由对象组成的,一切可见的事物吧 类(class):说白了就是把具有相同的一些特征或是属性归为一 ...

  2. Ubuntu的个个版本代号

    首先版本号跟发布日期有关,.04 为 4月份发布,.10 则在10月份发布.另外每个版本都会选一个动物作为代号,下面是 Ubuntu 从 4.10 开始的版本代号和对应动物: Ubuntu Warty ...

  3. 【小白的CFD之旅】11 敲门实例【续】

    主要内容: 接上文[小白的CFD之旅]10 敲门实例 2.4 Materials设置2.5 Cell Zone Conditions2.6 Boundary Conditons2.7 Dynamic ...

  4. Web报表工具FineReport中JavaScript的使用

    报表软件FineReport采用的是jQuery v1.9.2框架,jQuery是一个快速的,简洁的JavaScript库,能让用户更方便地处理HTML documents.events,实现动画效果 ...

  5. 《javascript》高级程序设计——类型转换错误

    容易发生类型转换错误的另一个地方,就是流控制语句.像if之类的语句在确定下一步操作之前,会自动把任何值转换成布尔值.尤其是if语句,如果使用不当,最容易出错.来看下面的例子. function con ...

  6. SSTABLE简介

    SSTABLE数据组织:http://blog.csdn.net/tankles/article/details/7663905

  7. 2016.10.29 NOIP模拟赛 PM 考试整理

    300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...

  8. kettle启动“Error: could not create the Java Virtual Machine”

    因为我的操作系统是32bit,而Ketttle的Spoon脚本中,默认是PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx2048m&qu ...

  9. CDN缓存机制

    CDN也叫内容分发网络,是一个经策略性部署的整体系统,包括分布式储存.负载均衡.网络请求的重定向和内容管理4个要件.而其中内容管理和全局的网络流量管理是CDN的核心所在.通过用户就进行和服务器负载的判 ...

  10. Apache 配置虚拟主机三种方式

    一.基于IP 1. 假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP: [root@localhost root]# ifconfig et ...