网络-邮件协议STMP、POP3详解与实战(Python发送邮件)

简介: 网络-邮件协议STMP、POP3详解与实战(Python发送邮件)

简介

电话通信需要主叫方与被叫方同时在场,有时会打扰到人们的工作或休息,因此,有了电子邮件(e-mail)。电子邮件把邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱(mailbox)中,收件人可在自己方便时上网到自己使用的邮件服务器进行读取。这相当于互联网为用户设立了存放邮件的信箱,因此e-mail有时也称为“电子信箱”。

基于客户端软件

电子邮件系统框架

image.png

电子邮件系统的基本组成

   用户代理UA(User Agent)就是用户与电子邮件系统的接口,在大多数情况下它就是运行在用户电脑中的一个程序。因此用户代理又称为电子邮件客户端软件。用户代理向用户提供一个很友好的接口(目前主要是窗口界面)来发送和接收邮件。例如,微软公司的Outlook Express和我国张小龙制作的Foxmail。

   用户代理至少应当具有以下4个功能。

   (1)撰写。给用户提供编辑信件的环境。例如,应让用户能创建便于使用的通讯录(有常用的人名和地址)。回信时不仅能很方便地从来信中提取出对方地址,并自动地将此地址写入到邮件中合适的位置,而且还能方便地对来信提出的问题进行答复(系统自动将来信复制一份在用户撰写回信的窗口中,因而用户不需要再输入来信中的问题)。

(2)显示。能方便地在计算机屏幕上显示出来信(包括来信附上的声音和图像)。

   (3)处理。处理包括发送邮件和接收邮件。收件人应能根据情况按不同方式对来信进行处理。例如,阅读后删除、存盘、打印、转发等,以及自建目录对来信进行分类保存。有时还可在读取信件之前先查看一下邮件的发件人和长度等,对于不愿收的信件可直接在邮箱中删除。

   (4)通信。发信人在撰写完邮件后,要利用邮件发送协议发送到用户所使用的邮件服务器。收件人在接收邮件时,要使用邮件读取协议从本地邮件服务器接收邮件。


   邮件服务器:互联网上有许多邮件服务器可供用户选用。邮件服务器24小时不间断地工作,并且具有很大容量的邮件信箱。邮件服务器的功能是发送和接收邮件,同时还要向发件人报告邮件传送的结果(已交付、被拒绝、丢失等)。邮件服务器按照客户服务器方式工作。邮件服务器需要使用两种不同的协议。一种协议用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,如SMTP协议,而另一种协议用于用户代理从邮件服务器读取邮件,如邮局协议POP3。

   这里应当注意,邮件服务器必须能够同时充当客户和服务器。

电子邮件组成

电子邮件由信封(envelope)和内容(content)两部分组成。

信封

电子邮件地址(e-mail address),格式 username@domainname

内容

分为首部(header)和主体(body),在RFC 5322中规定了header(From、To、Subject、Date),一般我们填写收件人和主题即可,用户代理会帮助我们填写发件人和日期。主题部分由用户自定义,包括正文、附件等。

邮件发送/接收步骤

发送方编辑邮件

发送方点击发送邮件按钮,用户代理推送到发送方邮件服务器(STMP)

发送方邮件服务器将邮件放入缓存,等待发送

发送方邮件服务器与接收方邮件服务器建立TCP连接,发送数据(STMP)

接收方邮件服务器将邮件放入用户代理的收件人的收件箱中等待收件人读取

收件人点击邮件,用户代理从接收方邮件服务器拉取邮件(POP3、IMAP)

STMP与MIME

简介

SMTP(Simple Mail Transfer Protocol,简单邮件传送协议),采用客户/服务器方式,熟知端口号25,由于互联网的SMTP只能传送可打印的7位ASCII码邮件,因此在1993年又提出了MIME(Multipurpose Internet Mail Extensions,通用互联网邮件扩充)。MIME在其邮件首部中说明了邮件的数据类型(如文本、声音、图像、视像等),在MIME邮件中可同时传送多种类型的数据。

SMTP规定了14条命令和21种应答信息。每条命令用几个字母组成,而每一种应答信息一般只有一行信息,由一个3位数字的代码开始,后面附上(也可不附上)很简单的文字说明。下面通过发送方和接收方的邮件服务器之间的SMTP通信的三个阶段介绍几个最主要的命令和响应消息。

流程

只有5个SMTP命令用于发送邮件:HELO,MAIL,RCPT,DATA和QUIT。

连接建立

发件人的邮件送到发送方邮件服务器的邮件缓存后,SMTP客户就每隔一定时间对邮件缓存扫描一次。如发现有邮件,就使用SMTP的熟知端口号码25与接收方邮件服务器的SMTP服务器建立TCP连接。在连接建立后,接收方SMTP服务器要发出“220 Service ready”(服务就绪)。然后SMTP客户向SMTP服务器发送HELO命令,附上发送方的主机名。SMTP服务器若有能力接收邮件,则回答:“250 OK”,表示已准备好接收。若SMTP服务器不可用,则回答“421 Service not available”(服务不可用)。

邮件发送

邮件的传送从MAIL命令开始。MAIL命令后面有发件人的地址。若SMTP服务器已准备好接收邮件,则回答“250OK”。否则,返回一个代码,指出原因。如:451(处理时出错),452(存储空间不够)等。

下面跟着一个或多个RCPT(recipient,收件人)命令,取决于把同一个邮件发送给一个或多个收件人。每发送一个RCPT命令,都应当有相应的信息从SMTP服务器返回,如:“250OK”,表示指明的邮箱在接收方的系统中,或“550No such user here”(无此用户),即不存在此邮箱。RCPT命令的作用就是:先弄清接收方系统是否已做好接收邮件的准备,然后才发送邮件。这样做是为了避免浪费通信资源,不至于发送了很长的邮件以后才知道地址错误。

再下面就是DATA命令,表示要开始传送邮件的内容了。SMTP服务器返回的信息是:“354 Start mail input;end with <CRLF>.<CRLF>”。这里<CRLF>是“回车换行”的意思。若不能接收邮件,则返回421(服务器不可用),500(命令无法识别)等。接着SMTP客户就发送邮件的内容。发送完毕后,再发送<CRLF>.<CRLF>(两个回车换行中间用一个点隔开)表示邮件内容结束。实际上在服务器端看到的可打印字符只是一个英文的句点。若邮件收到了,则SMTP服务器返回信息“2500K”,或返回差错代码。

连接释放

邮件发送完毕后,SMTP客户应发送QUIT命令。SMTP服务器返回的信息是“221(服务关闭)”,表示SMTP同意释放TCP连接。邮件传送的全部过程即结束。

SMTP的缺点

  1. SMTP不能传送可执行文件或者其他二进制对象。
  2. SMTP仅限于传送7位ASCl码,不能传送其他非英语国家的文字。
  3. SMTP服务器会拒绝超过一定长度的邮件。
  4. 传送的是明文,不利于保密。

MIME

由于SMTP存在一些缺点,MIME对传送的内容进行了一些扩充,进行了ASCII码和非ASCII码之间的转换。

2020062310470442.png

MIME与SMTP

MIME主要包括以下三部分内容:

5个新的邮件首部字段,它们可包含在原来的邮件首部中。这些字段提供了有关邮件主体的信息。

定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。

定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。

为适应于任意数据类型和表示,每个MIME报文包含告知收件人数据类型和使用编码的信息。MIME把增加的信息加入到原来的邮件首部中。

下面是MIME增加的5个新的邮件首部的名称及其意义(有的可以是选项)。


MIME-Version:标志MIME的版本。现在的版本号是1.0。若无此行,则为英文文本。

内容描述 Content-Description:这是可读字符串,说明此邮件主体是否是图像、音频或视频。

内容ID Content-Id:邮件的唯一标识符。

内容编码 Content-Transfer-Encoding:在传送时邮件的主体是如何编码的。

内容类型 Content-Type:说明邮件主体的数据类型和子类型。

                                         常见内容类型

image.png

POP3与IMAP

简介

目前常用的邮件读取协议有两种,一种是POP3,即POP(PostOffice Protocol,邮局协议)的版本3,熟知端口110。之前是下载并删除的方式,之后经过扩展,可以下载并保留一段时间。

另一种是IMAP(Internet Message Access Protocol,网际报文存取协议),当用户计算机上的IMAP客户程序打开IMAP服务器的邮箱时,用户就可看到邮件的首部。若用户需要打开某个邮件,则该邮件才传到用户的计算机上。用户可以根据需要为自己的邮箱创建便于分类管理的层次式的邮箱文件夹,并且能够将存放的邮件从某一个文件夹中移动到另一个文件夹中。用户也可按某种条件对邮件进行查找。在用户未发出删除邮件的命令之前,IMAP服务器邮箱中的邮件一直保存着。。

基于万维网

为了更加方便,人们不再愿意安装客户端,而是更多的使用网站,比如谷歌GMail、新浪邮箱网易163邮箱等。

电子邮件系统框架

2020062310470442.png

电子邮件系统框架

用户代理、邮件服务器等重复内容不再赘述。需要注意的是使用网站(用户代理)时我们推送邮件到服务器是使用HTTP(S)协议,拉取时也是。

Python发送邮件

全部代码

"""
--coding:utf-8--
@File: send_email.py
@Author:frank yu
@DateTime: 2020.12.15 14:36
@Contact: frankyu112058@gmail.com
@Description:
"""
import os
import smtplib
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
send_user = '你需要替换'  # 发件人
password = '你需要申请'  # 授权码/密码
server_address = '你需要替换'  # 服务器地址
def send_email(recv, subject, text='', file=None):
    # 构造一个邮件体:正文 附件
    msg = MIMEMultipart()
    msg['Subject'] = subject  # 主题
    msg['From'] = send_user  # 发件人
    msg['To'] = recv  # 收件人
    # 构建正文
    part_text = MIMEText(text)
    msg.attach(part_text)  # 把正文加到邮件体里面去
    if file is not None:
        # 构建邮件附件
        part_attach1 = MIMEApplication(open(file, 'rb').read())  # 打开附件
        part_attach1.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file))  # 为附件命名
        msg.attach(part_attach1)  # 添加附件
    try:
        # 发送邮件 SMTP
        smtp = smtplib.SMTP(server_address, 25)
        smtp.login(send_user, password)
        smtp.sendmail(send_user, recv, msg.as_string())
        print('发送成功!')
    except Exception as e:
        print('网络存在问题,发送失败:', e)
if __name__ == '__main__':
    # send_email('你需要替换', '文本邮件发送测试', '今天天气真不错')
    send_email('你需要替换', '附件邮件发送测试', '请查看附件', '你需要替换,例如:E:\北邮信息\成绩单.docx')

其中,授权码一般通过设置->更多设置来找到选项申请,新浪的如下:

2020062310470442.png

新浪授权码申请位置

发件人就是你申请授权码的这个邮箱,服务器就是SMTP服务器(发送的话)。博主是用新浪给自己的北邮邮箱发的邮件,你也可以用新浪发给新浪。

结果截图

2020062310470442.png

查看内容

之前写了个脚本,用opencv录取视频,保存到本地,使用邮件发送后删除,打包成了exe给了朋友,偷录了一些视频(当然,事后告诉了朋友并删除了视频),发了博客后(含代码及视频截图)过段时间给封了,大家可以换个别的想法玩一玩。

参考

计算机网络(第7版)谢希仁》6.5

《TCP/IP详解I》第28章

RFC 5321 STMP

RFC 20452046 MIME

RFC 5322  邮件格式

RFC 1939 POP3

RFC 2449 POP3扩展

RFC 3501 IMAP4





相关文章
|
5天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
22 1
|
1天前
|
机器学习/深度学习 存储 监控
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
|
1天前
|
缓存 网络协议 网络架构
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)
|
3天前
|
监控 Python
Python监控主机是否存活,并发报警邮件
Python监控主机是否存活,并发报警邮件
|
3天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
7 0
|
5天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
12 1
Flask框架在Python面试中的应用与实战
|
6天前
|
数据安全/隐私保护 Python
Python Flask-Mail实现邮件发送
Python Flask-Mail实现邮件发送
|
7天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
27 6
|
9天前
|
数据采集 机器学习/深度学习 数据挖掘
网络数据处理中的NumPy应用实战
【4月更文挑战第17天】本文介绍了NumPy在网络数据处理中的应用,包括数据预处理、流量分析和模式识别。通过使用NumPy进行数据清洗、格式化和聚合,以及处理时间序列数据和计算统计指标,可以有效进行流量分析和异常检测。此外,NumPy还支持相关性分析、周期性检测和聚类分析,助力模式识别。作为强大的科学计算库,NumPy在处理日益增长的网络数据中发挥着不可或缺的作用。
|
9天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。