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. WPF/SL: lazy loading TreeView

    Posted on January 25, 2012 by Matthieu MEZIL 01/26/2012: Code update Imagine the following scenario: ...

  2. What Great .NET Developers Ought To Know (More .NET Interview Questions)

    A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with ab ...

  3. adb server is out of date ADB server didn't ACK * failed to start daemon *一种解决方式

           记录个小问题,这两天用到了android中的远程调试一个开发板,经常碰到一个问题,android中ADB server didn't ACK * failed to start daem ...

  4. Axiom3D:Ogre中Mesh文件格式分析(一)

    在Axiom3D,或者说是Ogre的mesh的文件格式我们可能通过代码反推出相关格式,相关过程本来我是直接写的,后面发现相关流程写完后,我自己都看晕了,然后我就把一些过程用Execl整理出来,发现过程 ...

  5. kali 安装KVM教程---》给自己的笔记

    ⦁ 查看系统环境支持 egrep 'svm|vmx' /proc/cpuinfo 如果不支持则是 没有任何输出如果支持有类似下面的输出: ⦁ 安装软件 sudo apt-get install kvm ...

  6. (笔记)Mysql命令insert into:向表中插入数据(记录)

    insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...

  7. Unity导入3D模型的过程与方法

    一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会 ...

  8. JDBC是什么?

    JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API,换句话说:JDBC是用于在Java语 ...

  9. unity5x --------Music Mixer参数详解

      我们一直在致力开发出业界最顶尖水准音频处理功能,而经过很长一段时间的努力,在Unity5.0中,音频处理功能将成为非常重点的一个功能. 要达成这个目标,我们首先重写了很多Unity中音频相关得处理 ...

  10. Objective-C MacOS以管理员权限执行程序

    在MacOS下非常多操作是须要管理员权限的, 比方我们执行chmod.在命令行下能够使用sudo chmod来申请以管理员权限执行.可是使用XCode写的程序是不能使用sudo的. 须要自己写代码来申 ...