从古代的八百里加急,到现在的电子邮件,邮件的发展见证了上下五千年的发展史,这些当然是废话,只是要说说邮件的重要性。

可常规的通信手段相比,尤其是在现在,电话、QQ、微信等等各种社交软件的兴起,比传统的邮件和现在的电子邮件都快捷了很多;那为什么电子邮件还是显得那么重要呢~

电子邮件,目前来说在不同的行业中还是占据着非常重要的办公需求的地位的,常规情况下公司的任务分配、沟通、协作等等都是通过电子邮件进行处理的;同时,电子邮件本身的功能【邮件发送、群发、抄送、附件】让它更加社和较为正式的办公场合和日常较大数据的沟通;所以电子邮件的操作在各种编程语言中都有涉及和扩展;也是我们必须掌握的技能之一

本文分析:

电子邮件的传输过程【本文讲解】
发送邮件【本文讲解】
接收邮件【下一节讲解】

1. 电子邮件的传输过程

我们回顾一下传统的邮件的发送过程(说白了就是写信),写信的过程如下图所示:

写好信件 -> 投递到邮筒 -> 邮局揽收所有的邮件 -> XX地区邮局 -> 传送到XX地区邮局 -> 投递 -> 个人邮筒 -> 看到信件

电子邮件的传输过程和传统的模式有点类似,也是我们自己有写邮件的电子邮件软件,写好的邮件点击发送,发送到邮件服务器,某邮件服务器将邮件通过网络传送到另一个邮件服务器,邮件服务器将邮件投递到目标用户的投递服务区,目标用户从投递服务区收取邮件。

电子邮件发送流程及术语解释
邮件发送处理过程:用户A发送邮件给用户B/C/D

术语解释:

MUA:Mail User Agent,邮件用户代理,我们可以简单的理解成我们使用的发送邮件的软件,如Foxmail、outlook、gmail等等,这样的软件可以编辑邮件,发送/收取邮件

MTA:Mail Transfer Agent,邮件传输代理,我们通常情况下,注册的邮箱都是属于某一个运营商的,如xx@qq.com这是腾讯的邮箱、xx@163.com这是网易的邮箱等等,通常运营商会有自己的服务器专门用于邮件的网络传输的,这里的MTA指代的就是运营商服务器

MDA:Mail Delivery Agent,邮件投递代理,我们发送的邮件,会默认保存在目标服务器中的投递服务区,需要目标用户从投递服务区中提取邮件(收取邮件)。

完成流程如下
邮件 -> MUA -> MTA -> … n个MTA -> MDA <- MUA <- 邮件

那我们程序中,如果要实现发送邮件和接收邮件的功能,就需要自己开发程序完成从MUA-> MTA发送的过程来完成发邮件的功能;同样需要完成从MUA->MDA收取邮件的过程完成收邮件的功能

2. SMTP发送邮件

smtp是发送邮件的一种常见的协议,python已经内置了smtp协议的支持,可以发送常规的邮件内容(文本、附件、网页等)

2.1. 模块简介

在邮件发送模块中,主要使用如下两个模块进行处理

  • email模块:用于构建电子邮件对象的服务模块
  • smtplib模块:用于电子邮件发送的服务模块

接下来,我们先了解一个简单的邮件发送程序

import email,smtplib
from email.mime.text import MIMEText
# 发送邮件服务器
smtp_server = "smtp.qq.com"
# 邮箱账号+密码
email_user = "xxxxxxxxx@qq.com"
email_pass = "qq用户请填写授权码"# 发件人收件人信息
sender = email_user
receiver = "xxxxxx@xxxx.com"# 发送的消息设置,plain表示文本,utf-8表示数据编码格式
msg = MIMEText("这是一份自动发送的测试邮件", "plain", "utf-8")# 连接邮件服务器,用户登录, 发送邮件
server = smtplib.SMTP_SSL(smtp_server, 465)
server.set_debuglevel(1)
server.login(email_user, email_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit();
print("邮件发送结束")

上述代码是通过qq邮箱发送邮件的案例
使用QQ邮箱发送邮件时需要注意,如果正常情况下,需要开启smtp等服务,然后使用正确的登录账号和登录密码,如果一旦设置了QQ安全中心之类的,就需要通过设置授权码进行登录

打开网页版QQ邮箱,进入[设置]选项->进入[账户]选项,操作如下内容:

设置完上述内容之后,运行程序,我们在目标邮箱中就收到了对应的邮件


2.2. 发送完整邮件

上面的邮件我们已经看出来了,在收件箱中看到的邮件,只是包含了发件人邮箱和邮件的文本内容;邮件的标题、发件人名称、收件人名称、邮件的格式等等都没有进行处理。
在python的email模块中,可以通过设置Subject设置邮箱标题,设置From设置发件人信息,设置To设置收件人信息

通常情况下,我们会将标题中的中文,使用email.header模块中的Header()方法进行编码以保证数据传输的正确性;
在常规邮箱处理过程中,收件人和发件人这两个信息的展示格式是类似于姓名 <xxxx@mail.com>这样的格式,这种格式在python中通过email.utils模块中的parseaddr()方法和formataddr()方法进行处理的

# 导入需要的模块
import email, smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr# 定义连接邮箱服务器的信息
smtp_server = "smtp.qq.com"
smtp_user = "xxxxxxxx@qq.com"
smtp_pass = "qq用户如果设置了安全策略的话这里要写授权码"# 设置发件人、收件人
sender = smtp_user
receiver = "xxxxxx@xxxx.com"# 定义用于编码发件人和收件人格式的方法
def _format_addr(user):name, addr = parseaddr(user)return formataddr((Header(name, "utf-8").encode(), addr))# 开始发送邮件
# 连接服务器
server = smtplib.SMTP_SSL(smtp_server, 465)
# 登录服务器
server.login(smtp_user, smtp_pass)
# 设置内容,标题,发件人,收件人
msg = MIMEText("这是一个自动发送的邮件", "plain", "utf-8")
msg["subject"] = Header("来自大牧莫邪的问候")
msg["from"] = _format_addr("大牧莫邪 <%s>" % sender)
msg["to"] = _format_addr("牟文斌 <%s>" % receiver)
# 发送邮件
server.sendmail(sender, receiver, msg.as_string())
print("邮件发送成功")

可以看到,上面的代码中,我们对标题进行了编码设置,对发件人和收件人的格式进行了处理;[注意:现在的邮箱服务器,某些情况下不通过Header编码也可以正常识别中文,但是我们还是在代码中进行规范,防止出现中文乱码的BUG]
正确接收邮件:


2.3. 发送HTML格式的文件

在上面的内容中,我们已经看到了,发送邮件的内容,是通过MIMEText()函数进行规范的,如果设置了plain选项表示发送文本邮件,如果我们设置html就是发送的HTML格式的邮件,HTML标签需要被解析出来,请上干货:

import email, smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr# 定义连接邮箱服务器的信息
smtp_server = "smtp.qq.com"
smtp_user = "1007821300@qq.com"
smtp_pass = "kyecgawxkkupbegh"# 设置发件人、收件人
sender = smtp_user
receiver = "muwenbin@qikux.com"# 设置对发件人、收件人格式化处理的方法
def _format_addr(user):name, addr = parseaddr(user)return formataddr((Header(name, "utf-8").encode(), addr))# 设置连接邮箱服务器
server = smtplib.SMTP_SSL(smtp_server)
# 登录账号
server.login(smtp_user, smtp_pass)
# 设置邮箱标题、发件人、收件人、内容信息
msg = MIMEText("<h1>Hello 你好</h1>这是一封自动发送的测试邮件", "html", "utf-8")
msg["subject"] = Header("来自大牧莫邪的问候")
msg["from"] = _format_addr("大牧莫邪 <%s>" % sender)
msg["to"] = _format_addr("木木 <%s>" % receiver)
# 发送邮件
server.sendmail(sender, receiver, msg.as_string())
print("邮件发送完成")

邮件发送完成,收件箱中查看邮件

这里有人可能会有问题,谁TM没事干,写一个邮件写那么多的HTML标签进去呀,它疯了啊!

这里需要给大家普及一个前端的知识点,我们通常在网页中输入内容时,会添加富文本编辑器,如百度的UEditor,富文本编辑器中会带各种各样的格式,这些格式底层其实就是HTML标签,我们将用户在富文本编辑器中写的内容进行发送的时候,发送的就是HTML格式的文本数据


2.4. 邮件中添加附件

上面介绍了常规的邮件发送的处理手段,这里我们接着介绍一种非常常用的邮件内容的处理方式:添加附件

添加了附件的邮件,我们就需要对邮件进行拆分和组合的处理了。说简单一点就是将邮件内容和附件分别用对象表示,然后将不同的对象组合在一起作为一个完整的邮件即可

在python中,用MIMEText()服务类表示普通的邮件内容,用MIMEBase()服务类来表示我们的附件对象,然后将邮件内容和附件包装在MIMEMultipart()中形成一个完整的邮件进行发送

废话少说,上干货

# 导入需要的模块
import email, smtplib
from email                  import encoders
from email.utils            import parseaddr, formataddr
from email.header           import Header
from email.mime.base        import MIMEBase
from email.mime.text        import MIMEText
from email.mime.multipart   import MIMEMultipart# 定义连接邮箱服务器的信息
smtp_server = "smtp.qq.com"
smtp_user = "xxxxxxxxx@qq.com"
smtp_pass = "qq用户如果设置了安全验证,这里请填写您的授权码"# 设置发件人、收件人
sender = smtp_user
receiver = "xxxxxx@xxxx.com"# 设置收件人,发件人格式的方法
def _format_addr(user):name, addr = parseaddr(user)return formataddr((Header(name, "utf-8").encode(), addr))# 连接服务器
server = smtplib.SMTP_SSL(smtp_server)
# 登录服务器
server.login(smtp_user, smtp_pass)# 设置邮件内容[可以包装邮件内容和附件的MIMEMultipart对象]
msg = MIMEMultipart()
msg["subject"] = Header("来自大牧的问候", "utf-8")
msg["from"] = _format_addr("大牧来了 <%s>" % sender)
msg["to"] = _format_addr("牟文斌 <%s>" % receiver)# 1.设置邮件正文内容
content = MIMEText("这是邮件正文内容部分", "plain", "utf-8")
# 将正文内容添加到包装对象中
msg.attach(content)# 2.设置附件内容<使用本地的图片作为附件>
with open("d:/my.jpg", "rb") as f:# 设置MIMEBase对象包装附件attachment = MIMEBase("image", "jpg", filename="header.jpg")# 设置附件信息attachment.add_header("Content-Disposition", "attachment", filename="header.jpg")attachment.add_header("Content-ID", "<0>")attachment.add_header("X-Attachment-Id", "0")# 读取附件内容attachment.set_payload(f.read())# 编码文件encoders.encode_base64(attachment)# 添加附件到包装对象中msg.attach(attachment)# 发送邮件
server.sendmail(sender, receiver, msg.as_string())
print("邮件发送成功")

运行上述程序之后,收件箱中,收到对应的邮件内容如下:

这里需要注意几个问题

  • MIMEMultipart()对象也是一种邮件对象,可以包含多个组成部分
  • MIMEText()对象主要用于进行邮件正文内容的设置,可以是纯文本,可以是HTML格式
  • MIMEBase()对象主要用于进行附件的添加,常规情况下以独立文件对象的形式作为邮件内容的一部分而存在

完成的邮件格式是包含邮件正文内容和附件的MIMEMultipart()对象


2.5. 邮件中显示的图片

如果我们要在邮件中添加显示的图片应该怎么做呢~

按照我们常规的理解,可以通过将邮件内容修改为HTML,这样的话,图片就可以通过

标签插入进入了,难道不是吗?

邮件服务商们发现了一个问题,如果在邮件中可以任意添加链接的话,很容易让邮件作为一个犯罪的桥梁,把指向恶意网站或者服务的超链接带入我们的PC,所以常规情况下,邮件中会自动屏蔽带外链接图片的。

那应该怎么做呢?

其实邮件中的图片在python中处理的比较简单,邮件中需要的图片,通过附件的形式上传到邮件服务器,然后根据附件的顺序使用cid:num添加就可以了,语法类似![](cid:0)这是在正文中使用附件中的第一个图片

上干货:

# 导入需要的模块
import email, smtplib
from email                  import encoders
from email.utils            import parseaddr, formataddr
from email.header           import Header
from email.mime.base        import MIMEBase
from email.mime.text        import MIMEText
from email.mime.multipart   import MIMEMultipart# 定义连接邮箱服务器的信息
smtp_server = "smtp.qq.com"
smtp_user = "xxxxxxxxx@qq.com"
smtp_pass = "qq用户如果设置了安全验证,这里请填写您的授权码"# 设置发件人、收件人
sender = smtp_user
receiver = "xxxxxx@xxxx.com"# 设置收件人,发件人格式的方法
def _format_addr(user):name, addr = parseaddr(user)return formataddr((Header(name, "utf-8").encode(), addr))# 连接服务器
server = smtplib.SMTP_SSL(smtp_server)
# 登录服务器
server.login(smtp_user, smtp_pass)# 设置邮件内容[可以包装邮件内容和附件的MIMEMultipart对象]
msg = MIMEMultipart()
msg["subject"] = Header("来自大牧的问候", "utf-8")
msg["from"] = _format_addr("大牧来了 <%s>" % sender)
msg["to"] = _format_addr("牟文斌 <%s>" % receiver)# 1.设置邮件正文内容
content = MIMEText("<h2>这是邮件正文内容部分</h2>![](cid:0)", "html", "utf-8")
# 将正文内容添加到包装对象中
msg.attach(content)# 2.设置附件内容<使用本地的图片作为附件>
with open("d:/my.jpg", "rb") as f:# 设置MIMEBase对象包装附件attachment = MIMEBase("image", "jpg", filename="header.jpg")# 设置附件信息attachment.add_header("Content-Disposition", "attachment", filename="header.jpg")attachment.add_header("Content-ID", "<0>")attachment.add_header("X-Attachment-Id", "0")# 读取附件内容attachment.set_payload(f.read())# 编码文件encoders.encode_base64(attachment)# 添加附件到包装对象中msg.attach(attachment)# 发送邮件
server.sendmail(sender, receiver, msg.as_string())
print("邮件发送成功")

上述代码执行完成后,在我们的收件箱中,赤果果个的就出现了下面的结果


温情提示:以上代码都是我使用QQ邮箱进行测试过程中总结的资料,如果大家在使用其他邮箱进行验证的过程中出现了问题,欢迎留言一起讨论哦!


附录:常见发送邮件服务器

| 邮箱|smtp服务器 |端口|
常用的邮箱服务器(SMTP、POP3)地址、端口
sina.com:
POP3服务器地址:pop3.sina.com.cn(端口:110)
SMTP服务器地址:smtp.sina.com.cn(端口:25)

sinaVIP:
POP3服务器:pop3.vip.sina.com (端口:110)
SMTP服务器:smtp.vip.sina.com (端口:25)

sohu.com:
POP3服务器地址:pop3.sohu.com(端口:110)
SMTP服务器地址:smtp.sohu.com(端口:25)

126邮箱:
POP3服务器地址:pop.126.com(端口:110)
SMTP服务器地址:smtp.126.com(端口:25)

139邮箱:
POP3服务器地址:POP.139.com(端口:110)
SMTP服务器地址:SMTP.139.com(端口:25)

163.com:
POP3服务器地址:pop.163.com(端口:110)
SMTP服务器地址:smtp.163.com(端口:25)

QQ邮箱
POP3服务器地址:pop.qq.com(端口:110)
SMTP服务器地址:smtp.qq.com (端口:25)

QQ企业邮箱
POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995)
SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)

yahoo.com:
POP3服务器地址:pop.mail.yahoo.com
SMTP服务器地址:smtp.mail.yahoo.com

yahoo.com.cn:
POP3服务器地址:pop.mail.yahoo.com.cn(端口:995)
SMTP服务器地址:smtp.mail.yahoo.com.cn(端口:587

HotMail
POP3服务器地址:pop3.live.com (端口:995)
SMTP服务器地址:smtp.live.com (端口:587)

gmail(google.com)
POP3服务器地址:pop.gmail.com(SSL启用 端口:995)
SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587)

263.net:
POP3服务器地址:pop3.263.net(端口:110)
SMTP服务器地址:smtp.263.net(端口:25)

263.net.cn:
POP3服务器地址:pop.263.net.cn(端口:110)
SMTP服务器地址:smtp.263.net.cn(端口:25)

x263.net:
POP3服务器地址:pop.x263.net(端口:110)
SMTP服务器地址:smtp.x263.net(端口:25)

21cn.com:
POP3服务器地址:pop.21cn.com(端口:110)
SMTP服务器地址:smtp.21cn.com(端口:25)

Foxmail:
POP3服务器地址:POP.foxmail.com(端口:110)
SMTP服务器地址:SMTP.foxmail.com(端口:25)

china.com:
POP3服务器地址:pop.china.com(端口:110)
SMTP服务器地址:smtp.china.com(端口:25)

tom.com:
POP3服务器地址:pop.tom.com(端口:110)
SMTP服务器地址:smtp.tom.com(端口:25)

etang.com:
POP3服务器地址:pop.etang.com
SMTP服务器地址:smtp.etang.com


以上就是小编所分享的内容,喜欢的话可以加个关注,希望能够帮助到大家,仅供参考

最后针对Android程序员,除了以上内容,我自己整理了一套最新的python系统资料可以免费送给大家,从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。需要这些资料的朋友,可以进python学习交流群:851211580免费领取 。

希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!后续还会更新技术干货,谢谢您的支持!

python强势来袭-35-邮件那点事儿~发送邮件相关推荐

  1. python强势来袭-8-组合数据类型

    继基本数据类型之后,本章进行组合数据类型的讲解 组合数据类型 python中为了方便一部分相似数据的处理,提供了各种组合类型,常见的如列表.元组 python中的列表是可变序列,元组是不可变序列 (1 ...

  2. python强势来袭-18-列表循环高级操作

    前言 针对循环和函数在项目使用过程中的一些更加有使用价值的操作进行分析和讲解: 循环部分 列表构建器 列表动态构建器 循环操作序列对象 循环迭代遍历数据 函数部分 函数递归 参数使用函数 函数中返回函 ...

  3. python强势来袭-11-选择和循环-总是伴随左右

    正常情况下,我们完成一件事情的过程中,可能会存在多种条件限制 如:用户去ATM机取钱->输入取款密码->输入正确,取钱成功 | 输入错误,退卡. 这样的情况下,需要根据不同的条件,执行不同 ...

  4. python强势来袭-9-变量运算符

    上一章讲解过了组合数据类型,本章进行变量以及各种编程需要的运算符的操作讲解 3.3 变量部分 3.4 运算符部分:主要讲解:赋值运算符.算数运算符.关系运算符.逻辑运算符.成员运算符.标识运算符 3. ...

  5. python调用foxmail 发邮件_调用foxmail发送邮件

    因为foxmail没有api调用接口,工作中又需要使用foxmail发送邮件(主要是附件).在网上没有发现这方面的程序.特写一下自己写的一个示例 示例如下: 需要添加 using System.Run ...

  6. python官方-Python官方中文文档强势来袭

    原标题:Python官方中文文档强势来袭 Python 官方支持的文档一直没有中文.小伙伴们已经习惯了原汁原味的英文文档,但如果有官方中文文档,对于初学者来说,门槛会大大的降低.现在中文文档强势来袭 ...

  7. python官网中文官网-Python官方中文文档强势来袭

    原标题:Python官方中文文档强势来袭 Python 官方支持的文档一直没有中文.小伙伴们已经习惯了原汁原味的英文文档,但如果有官方中文文档,对于初学者来说,门槛会大大的降低.现在中文文档强势来袭 ...

  8. vivo手机助手强势来袭!

    vivo手机助手强势来袭! vivo手机助手是一个android智能手机资料管理软件和资源获取平台.这里提供海量的游戏.软件.主题等资源:可以通过它管理.备份.恢复手机资料和日程:更有vivo云提供云 ...

  9. 社交软件强势来袭,谁来革新中国企业管理模式?

    摘要:业内人士称,Linkwedo其实就是一种新型的企业管理平台,它超越OA.CRM.项目管理.即时通讯IM.电子邮件email,又涵盖了这些软件的功能,结合智能手机.移动端,全面管理企业的人.事.时 ...

最新文章

  1. R语言将多个dataframe导出到excel的多个表单(sheet)实战
  2. php推荐引擎算法,推荐系统,第 2 部分: 开源引擎简介
  3. 第四章(变量、作用域、内存问题)
  4. 华科08年计算机考研复试机试
  5. mysql load data 乱码的问题
  6. Pytorch:初始化
  7. python网页编辑器-Python Jupyter 网站编辑器
  8. Windows XP优化指南
  9. Ubuntu系统安装搜狗(sougou for linux)输入法详细教程
  10. 猪齿鱼 SaaS 版效能平台发布
  11. 前端如何实现文件下载(七种方法)
  12. 计算机专业老师教案,技能大赛-2015年全国中等职业学校计算机应用基础及计算机类专业课程“创新杯”教师信息化教学设计和说课比赛总结...
  13. 数字图像处理之matlab实验(一):基本操作
  14. 创意人像海报故障艺术海报教程故障艺术海报怎么做
  15. 链脉吴雪:链脉智能名片如何帮企业度过“市场寒冬”
  16. 256qam是什么意思_一文读懂5G的信号调制方式!5G比4G的快的主要原因就是256QAM
  17. TSINGSEE青犀视频使用Vue.js搭建前端启动后共享屏幕无法获取音视频流问题解决
  18. 整理各类IT编程视频教程下载地址
  19. 第七届XCTF国际联赛分站赛L3HCTF圆满落幕,Nepnep战队夺冠
  20. Java设计模式——观察者模式

热门文章

  1. 借助OA系统实现企业人事管理的精细化落地
  2. Opencvsharp:视频video转换成图像Mat,并对图像进行Canny操作
  3. element饿了么ui表格选中后高亮颜色修改
  4. 计算机组成原理实验输出大小写字母,计算机组成原理实验指导书-201511修订.doc...
  5. 迅为IMX6ULL开发板NFS服务器的搭建
  6. 向日葵链接失败的解决办法
  7. 为何政企偏爱阿里云混合云?这三张王牌是关键
  8. 排序指标CG,DCG,NDCG
  9. 慧荣量产工具4连发(SM3255AA,SM3255AB,SM3252,SM3211)--来自忆捷售后
  10. 高等数学一:函数与极限:考点总结