流程
只有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的缺点
- SMTP不能传送可执行文件或者其他二进制对象。
- SMTP仅限于传送7位ASCl码,不能传送其他非英语国家的文字。
- SMTP服务器会拒绝超过一定长度的邮件。
- 传送的是明文,不利于保密。
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')
其中,授权码一般通过设置->更多设置来找到选项申请,新浪的如下:
新浪授权码申请位置
发件人就是你申请授权码的这个邮箱,服务器就是SMTP服务器(发送的话)。博主是用新浪给自己的北邮邮箱发的邮件,你也可以用新浪发给新浪。
结果截图
邮件
查看内容
之前写了个脚本,用opencv录取视频,保存到本地,使用邮件发送后删除,打包成了exe给了朋友,偷录了一些视频(当然,事后告诉了朋友并删除了视频),发了博客后(含代码及视频截图)过段时间给封了,大家可以换个别的想法玩一玩。
参考
《计算机网络(第7版)谢希仁》6.5
《TCP/IP详解I》第28章
RFC 5321 SMTP
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网络安全面试题
绿盟护网行动
还有大家最喜欢的黑客技术
网络安全源码合集+工具包
所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!