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

用户代理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),一般我们填写收件人和主题即可,用户代理会帮助我们填写发件人和日期。主题部分由用户自定义,包括正文、附件等。

邮件发送/接收步骤

  1. 发送方编辑邮件
  2. 发送方点击发送邮件按钮,用户代理推送到发送方邮件服务器(SMTP)
  3. 发送方邮件服务器将邮件放入缓存,等待发送
  4. 发送方邮件服务器与接收方邮件服务器建立TCP连接,发送数据(SMTP)
  5. 接收方邮件服务器将邮件放入用户代理的收件人的收件箱中等待收件人读取
  6. 收件人点击邮件,用户代理从接收方邮件服务器拉取邮件(POP3、IMAP)

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

连接释放

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

SMTP的缺点

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

MIME

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

MIME与SMTP

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

  • 5个新的邮件首部字段,它们可包含在原来的邮件首部中。这些字段提供了有关邮件主体的信息。
  • 定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。
  • 定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。

为适应于任意数据类型和表示,每个MIME报文包含告知收件人数据类型和使用编码的信息。MIME把增加的信息加入到原来的邮件首部中。
下面是MIME增加的5个新的邮件首部的名称及其意义(有的可以是选项)。

  • MIME-Version:标志MIME的版本。现在的版本号是1.0。若无此行,则为英文文本。
  • 内容描述 Content-Description:这是可读字符串,说明此邮件主体是否是图像、音频或视频。
  • 内容ID Content-Id:邮件的唯一标识符。
  • 内容编码 Content-Transfer-Encoding:在传送时邮件的主体是如何编码的。
  • 内容类型 Content-Type:说明邮件主体的数据类型和子类型。

常见内容类型

类型子类型举例
text(文本)plain,html,xml,css
image(图像)gif,jpeg,tif
audio(音频)basic,mpeg,mp3
video(视频)mpeg,mp4,quicktime
model(模型)vrml
application(应用)octet-stream,pdf,javascript,zip
message(报文)http,rfc822
multipart(多部分)mixed,alternative,parallel,digest

POP3与IMAP

简介

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

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

基于万维网

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

电子邮件系统框架

电子邮件系统框架

用户代理、邮件服务器等重复内容不再赘述。需要注意的是使用网站(用户代理)时我们推送邮件到服务器是使用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')

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

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值