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

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

普通正文邮件:

  1. #/usr/bin/env python
  2. #coding=utf-8
  3. from email import encoders
  4. from email.header import Header
  5. from email.mime.text import MIMEText
  6. from email.utils import parseaddr, formataddr
  7.  
  8. import smtplib
  9.  
  10. def _format_addr(s):
  11. name, addr = parseaddr(s)
  12. return formataddr((Header(name, 'utf-8').encode(), addr))
  13.  
  14. from_addr = 'zy5724@163.com'
  15. password = 'xxxxx'
  16. to_addr = 'scottcho@qq.com'
  17. smtp_server = 'smtp.163.com'
  18.  
  19. msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
  20. msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
  21. msg['To'] = _format_addr('管理员 <%s>' % to_addr)
  22. msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
  23.  
  24. try:
  25. server = smtplib.SMTP(smtp_server, 25)
  26. # server.set_debuglevel(1)
  27. server.login(from_addr, password)
  28. server.sendmail(from_addr, [to_addr], msg.as_string())
  29. server.quit()
  30. print 'send OK'
  31. except Exception, e:
  32. print str(e)

注意到构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。

我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个stras_string()MIMEText对象变成str

收到的邮件:

带有附件的邮件:

  1. #/usr/bin/env python
  2. # coding: utf-8
  3. from email import encoders
  4. from email.header import Header
  5. from email.mime.text import MIMEText
  6. from email.MIMEBase import MIMEBase
  7. from email.utils import parseaddr, formataddr
  8. from email.mime.multipart import MIMEMultipart
  9. import smtplib
  10.  
  11. def _format_addr(s):
  12. name, addr = parseaddr(s)
  13. return formataddr(( \
  14. Header(name, 'utf-8').encode(), \
  15. addr.encode('utf-8') if isinstance(addr, unicode) else addr))
  16.  
  17. from_addr = 'zy5724@163.com'
  18. password = 'xxxx'
  19. to_addr = 'scottcho@qq.com'
  20. smtp_server = 'smtp.163.com'
  21. # 邮件对象:
  22. msg = MIMEMultipart()
  23. msg['From'] = _format_addr(u'张三 <%s>' % from_addr)
  24. msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
  25. msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()
  26.  
  27. # 邮件正文是MIMEText:
  28. msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
  29.  
  30. # 添加附件就是加上一个MIMEBase
  31. att1 = MIMEText(open('/python/new.txt', 'rb').read(), 'base64', 'utf-8')
  32. att1["Content-Type"] = 'application/octet-stream'
  33. att1["Content-Disposition"] = 'attachment; filename="new.txt"'
  34. msg.attach(att1)
  35.  
  36. #再添加一个图片附件
  37. with open('/python/Koala.jpg', 'rb') as f:
  38. att2 = MIMEBase('image', 'jpg', filename='Koala.jpg')
  39. att2.add_header('Content-Disposition', 'attachment', filename='Koala.jpg')
  40. att2.add_header('Content-ID', '<0>')
  41. att2.set_payload(f.read())
  42. encoders.encode_base64(att2)
  43. msg.attach(att2)
  44.  
  45. server = smtplib.SMTP(smtp_server, 25)
  46. server.set_debuglevel(1)
  47. server.login(from_addr, password)
  48. server.sendmail(from_addr, [to_addr], msg.as_string())
  49. server.quit()

我们编写了一个函数_format_addr()来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>,因为如果包含中文,需要通过Header对象进行编码。

结果:

使用开源的yagmail发送邮件

yagmail底层依然使用smtplib和email模块,但是它提供了更加Pythonic的接口。

安装: pip install yagmail

查看邮件:

Python学习笔记18-发送邮件的更多相关文章

  1. python学习笔记18(UliPad 初体验)

    在windows下安装配置Ulipad 由于UliPad 是由wxPython 开发的,所以,需要先安装wxPython . wxPython下载地址: http://www.wxpython.org ...

  2. Python学习笔记18:标准库之多进程(multiprocessing包)

    我们能够使用subprocess包来创建子进程.但这个包有两个非常大的局限性: 1) 我们总是让subprocess执行外部的程序,而不是执行一个Python脚本内部编写的函数. 2) 进程间仅仅通过 ...

  3. Python 学习笔记18 异常处理

    我们在编码的过程中,难免会遇到一些错误和异常, 这时候程序会异常退出,并且会抛出错误信息: 比如: print(1/0) ''' 输出: Traceback (most recent call las ...

  4. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  5. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  6. Python学习笔记(十)

    Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...

  7. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  8. Python学习笔记(二):条件控制语句与循环语句及常用函数的用法

    总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...

  9. Python学习笔记之类与对象

    这篇文章介绍有关 Python 类中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中类的使用技巧 1.与类和对象相关的内置方法 issubclass(class, classinfo) ...

  10. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

随机推荐

  1. 【Python】python3-list列表引用

    print(names) #列出列表的内容 print(names[3]) #访问列表中第4个值 print(names[1:3]) #访问列表中从第2个到第3个的值 print(names[-1]) ...

  2. GRUB——系统的引导程序简单介绍

    这几天对于操作系统是如何引导启动的特征的感兴趣,已经到了不能自拔的状态了,所以索性好好了解一下: 前面已经说过了,MBR对于系统启动的重要性,这是不多啰嗦:  现在介绍一个 grub ,启动管理器,它 ...

  3. [转]android ANR产生原因和解决办法

    ANR (Application Not Responding) ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(AN ...

  4. e824. 获得和设置JSplitPane中的子组件

    // Create a left-right split pane JSplitPane hpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, lef ...

  5. openssl创建自己的CA certificate

    Create a Certificate Authority private key (this is your most important key): $ openssl req -new -ne ...

  6. c# winform 获取当前程序运行根目录,winform 打开程序运行的文件夹

    // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...

  7. Xianfeng轻量级Java中间件平台:功能管理

    功能管理:从功能类型来看,不属于用户使用的功能,而属于系统维护使用的功能,因为对于用户来说,是不可见的.功能管理的作用是定义一套规则,用来处理权限等业务,比如常见的菜单权限控制.按钮权限控制等情景 在 ...

  8. tophat-fusion 鉴定融合基因

    tophat-fusion 是一款利用RNA_seq 数据鉴定融合基因的工具,官网链接如下: http://ccb.jhu.edu/software/tophat/fusion_index.shtml ...

  9. SpringMVC文件上传基础

    maven依赖 <!--文件上传所需--> <dependency> <groupId>commons-fileupload</groupId> < ...

  10. php + ajax 避免重复提交