2019独角兽企业重金招聘Python工程师标准>>>

0. 前言

发送电子邮件是个很常见的开发需求。比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了,就可以发个邮件到邮箱来提醒自己。

使用 Python 脚本发送邮件并不复杂。不过由于各家邮件的发送机制和安全策略不同,常常会因为一些配置问题造成发送失败。今天我们来举例讲讲如何使用 Python 发送邮件。

本文主要内容包括,了解发邮件的思路,发送邮件需要的一些设置,发送一封简单的邮件,发送一封包含附件的邮件,在写代码过程中我们需要注意哪些问题等等。(完整参考代码地址见文末)

1. 思路

使用脚本发送邮件的思路其实和客户端发送邮件一样,过程都是:

登录 —> 写邮件 —> 发送

只不过通过脚本发送时我们需要考虑到整个过程的方方面面。以下为思路导图:

2. Python-email 模块

与发送邮件相关的 Python 模块:

smtplib

是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。

email

简单来说,即服务器之间通信的信息,包括信息头、信息主体等等。

举个简单的例子,当你登录邮箱,写好邮件后点击发送,这部分是由 SMTP 接管;而写邮件、添加附件是由 email 模块控制。

3. 开通电子邮箱的SMTP功能

在使用脚本发邮件之前,我们需要打开自己邮箱的 SMTP 功能,各家邮箱的设置方法就不一一讲述了,具体使用时可以百度一下,下面以 163 邮箱设置为例做一个简单的演示:

4. 简单代码

实践出真知,我们结合一个简单的代码来理解这一过程:登录 163 邮箱,向 qq 邮箱发送邮件。

脚本分为三个步骤:

  1. 设置好服务器端信息
  2. 邮件主体信息
  3. 登录发送

另外在处理文本时,我们需要使用 MIMEText 类。

import smtplib
from email.mime.text import MIMEText
#设置服务器所需信息
#163邮箱服务器地址
mail_host = 'smtp.163.com'
#163用户名
mail_user = '159*****02'
#密码(部分邮箱为授权码)
mail_pass = '7******x'
#邮件发送方邮箱地址
sender = '159*****02@163.com'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['59*****02@qq.com']  #设置email信息
#邮件内容设置
message = MIMEText('content','plain','utf-8')
#邮件主题
message['Subject'] = 'title'
#发送方信息
message['From'] = sender
#接受方信息
message['To'] = receivers[0]  #登录并发送邮件
try:smtpObj = smtplib.SMTP() #连接到服务器smtpObj.connect(mail_host,25)#登录到服务器smtpObj.login(mail_user,mail_pass) #发送smtpObj.sendmail(sender,receivers,message.as_string()) #退出smtpObj.quit() print('success')
except smtplib.SMTPException as e:print('error',e) #打印错误

结果:

注意事项:

一些邮箱登录比如 QQ 邮箱需要 SSL 认证,所以 SMTP 已经不能满足要求,而需要SMTP_SSL,解决办法为:

#启动
smtpObj = smtplib.SMTP()
#连接到服务器
smtpObj.connect(mail_host,25)
#######替换为########
smtpObj = smtplib.SMTP_SSL(mail_host)

5. 带有附件的email

上面我们介绍了发送字符串的邮件,但这明显不满足现代邮件的需求,下面我们介绍如何发送内容以 HTML 格式,并且带有图片和文本文件的邮件。

处理多种形态的邮件主体我们需要 MIMEMultipart 类,而处理图片需要 MIMEImage 类。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage#设置登录及服务器信息
mail_host = 'smtp.163.com'
mail_user = '159*****02'
mail_pass = '7******x'
sender = '159*****02@163.com'
receivers = ['7******0@qq.com']#设置eamil信息
#添加一个MIMEmultipart类,处理正文及附件
message = MIMEMultipart()
message['From'] = sender
message['To'] = receivers[0]
message['Subject'] = 'title'
#推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等
with open('abc.html','r') as f:content = f.read()
#设置html格式参数
part1 = MIMEText(content,'html','utf-8')
#添加一个txt文本附件
with open('abc.txt','r')as h:content2 = h.read()
#设置txt参数
part2 = MIMEText(content2,'plain','utf-8')
#附件设置内容类型,方便起见,设置为二进制流
part2['Content-Type'] = 'application/octet-stream'
#设置附件头,添加文件名
part2['Content-Disposition'] = 'attachment;filename="abc.txt"'
#添加照片附件
with open('1.png','rb')as fp:picture = MIMEImage(fp.read())#与txt文件设置相似picture['Content-Type'] = 'application/octet-stream'picture['Content-Disposition'] = 'attachment;filename="1.png"'
#将内容附加到邮件主体中
message.attach(part1)
message.attach(part2)
message.attach(picture)#登录并发送
try:smtpObj = smtplib.SMTP()smtpObj.connect(mail_host,25)smtpObj.login(mail_user,mail_pass)smtpObj.sendmail(sender,receivers,message.as_string())print('success')smtpObj.quit()
except smtplib.SMTPException as e:print('error',e)

6.小结

通过上面的代码,想必大家已经对发邮件有了基本的认识。

从整体上我们要把握整个过程的思路:

  1. 登录
  2. 写邮件
  3. 发送

微观上我们需要了解:

  • smtplib/email 模块的代码规则;
  • 什么时候使用 SMTP,什么时候使用 SMTP_SSL?
  • 针对不同的邮件内容需要使用到不同的类,MIMEmultipart、MIMEText、MIMEIamge 等等;
  • 怎么去设置附件信息

当然,看再多教程,不如亲自动手写一段代码。大家不妨都自己发一封邮件试一试。

在公众号(crossincode)中回复『email』,可以获取实例代码。

其他文章及回答:

Python 与 Excel 不得不说的事 - Crossin的编程教室 - 知乎专栏

Python-Excel 模块哪家强?- Crossin的编程教室 - 知乎专栏

爆款游戏《贪吃蛇大作战》的 Python 实现 - Crossin的编程教室 - 知乎专栏

NBA 举办编程马拉松 - 数据分析时代的到来 - Crossin的文章 - 知乎专栏

想用 Python 做数据分析?先玩玩这个再说 - Crossin的文章 - 知乎专栏

用 Python 实现你的量化交易策略 - Crossin的文章 - 知乎专栏

学习编程的过程中可能会走哪些弯路,有哪些经验可以参考? - Crossin 的回答

你是如何自学 Python 的? - Crossin 的回答

Python 抓取网页乱码原因分析 - Crossin的编程教室 - 知乎专栏

Crossin的编程教室

微信ID:crossincode

论坛:Crossin的编程教室

转载于:https://my.oschina.net/crossin/blog/1820865

简单三步,用 Python 发邮件相关推荐

  1. python minimize_简单三步实现Python脚本超参数调优(附代码)

    作者:Jakub Czakon, Neptune.ai 翻译:陈之炎 校对:和中华 本文约1500字,建议阅读5分钟. Python机器学习模型建立起来之后,如何对它的性能进行优化?按照本指南中的三个 ...

  2. 独家 | 简单三步实现Python脚本超参数调优(附代码)

    作者:Jakub Czakon, Neptune.ai 翻译:陈之炎 校对:和中华 本文约1500字,建议阅读5分钟. Python机器学习模型建立起来之后,如何对它的性能进行优化?按照本指南中的三个 ...

  3. 简单三步实现Python脚本超参数调优(附代码)

    在编写完成一个Python脚本之后,便可以用它训练和评估机器学习模型了,现在,问题来了,是否能对它自动调整超参数以提高其性能呢? 自有办法! 在本文中,将展示如何将脚本转换为可以用任何超参数优化库优化 ...

  4. python发邮件有什么意思_python发邮件要装什么

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  5. python发邮件详解,smtplib和email模块详解

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  6. python发邮件详解 -- smtplib和email模块

    文章目录 python发邮件详解,-->smtplib和email模块 1.python发邮件所需要的基础包 2.smtplib的用法 3.email模块的详细理解和使用 A.MIMEText对 ...

  7. python 发邮件正文表格 html

    在 Python 中将表格作为电子邮件正文(不是附件)发送 参考 (详细 !清晰!)python发邮件总结及实例说明,中文乱码已解决(在最后一个模块) table-email-template Pyt ...

  8. mysql插入数据返回主键值_Mysql千万级别数据批量插入只需简单三步!

    第一步:配置my.ini文件 文件中配置 bulk_insert_buffer_size=120M 或者更大 将insert语句的长度设为最大. Max_allowed_packet=1M Net_b ...

  9. python 发邮件 timeout_python发送邮件

    一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 1.smtplib模块 smtplib.SMTP([host[, port[, loca ...

  10. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信

    Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...

最新文章

  1. 【业界】开源大势降低技术门槛,人工智能企业更依赖大数据
  2. php中的preg_replace函数,PHP函数preg_replace()
  3. 生成式模型(generative) vs 判别式模型(discriminative)
  4. 公众号获取用户手机号_微信公众号如何选取种子用户
  5. 关于vue、js连接打印机
  6. EPLAN教程——工具栏详解(2)默认工具栏
  7. iPhone 13不会自动锁屏该怎么解决?
  8. 你缺的不是一个“大牛” 而是一个透视宝
  9. 使用Unity连接Bmob后端云
  10. 还在担心零基础绘画?这篇文章让你少走弯路!
  11. 展锐Camera open failure log解析程序
  12. git合并分支Pulling is not possible because you have unmerged files.
  13. CUDA_NVCC_FLAGS set
  14. 栈——栈的基本概念和基本操作
  15. 【选题推荐】软件工程毕设选题可以选什么
  16. 干货!MySQL常见的面试题+索引原理分析!
  17. paddlepaddle框架小白入门级指南
  18. 高斯型随机粗糙面MATLAB仿真
  19. 五种常见的电子商务模式:B2B、B2C、C2B、C2C、O2O
  20. 提权系列(一)----Windows Service 服务器提权初识与exp提权,mysql提权

热门文章

  1. 计算机基础算术加法,2011年自考计算机基础知识精选部分及答案(一)-2
  2. r语言平均值显著性检验_8小时整理!t检验原理!R语言实现!一文彻底搞定t检验(上)...
  3. php 使用sendgrid api 发送邮件_linux - 使用命令发送邮件
  4. python判断语句_python条件判断语句if elif else使用
  5. fileinputstream java_Java FileInputStream close()方法
  6. oracle改字体大小_oracle数据库字体大小
  7. anconda安装及opencv配置
  8. 【信息抽取】如何使用BERT进行关系抽取
  9. 中国网络出版产业盈利模式与投资前景形势研究报告2022版
  10. sha1withRSA md5withRSA分析