IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 计网大作业--SMTP邮件代理服务器 -> 正文阅读

[系统运维]计网大作业--SMTP邮件代理服务器

  1. 软件设计

2.1 数据结构

变量名:

S:本机上的socket链接数据结构

s?= socket()

host、port :本机IP地址和163邮箱端口号

host?= "127.0.0.1"

port?= 25

new_socket :server端接受信息的socket链接数据结构

new_socket, address?= s.accept()

post_msg :用来记录和打印传输时双方发送的字符串

post_msg?= ('220 beta.gov Simple Mail Transfer Service ready\r\n')

mailfrom :接受到的具体信息

mailfrom?= new_socket.recv(1024)

mailfrom?= str(mailfrom)

name_mailfrom 、username:邮箱源地址(后续用于用户名打印)

name_mailfrom?= mailfrom.replace("b'MAIL FROM: <", "")

name_mailfrom?= name_mailfrom.replace('>\\r\\n\'', '')

rcpt_to :用于存放邮箱地址的字符串数组

rcpt_to?= []

count :用于记录包的数量(也表示第几个)的记数变量

count?= 0

savetext.append(str(data)) ? ? ?

count?+= 1

Subject :邮件主题记录字符串

Subject?= ''.join(list_subject)

content:base64下邮件信息

content?= ''.join(list_content)

msg:发送的邮件信息

msg?= "\r\n"?+ str(content)

print("msg== ", msg)

password:密码

password?= input("请输入邮箱密码: ")

log_text:存储发送日志内容

log_text?= time.asctime(time.localtime(time.time())) + "\n\n这是一个邮件发送记录日志\n\n"

now_time:用来存储当前时间

?now_time?= datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')

filename:日志文件名

filename?= filename?= "Log_Down_"?+ now_time

2.2 socket编程内部函数解释

?TCP/UDP Socket是一种基于Client-Server的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行数据传输。那么对TCP/UDP Socket编程的介绍也分为客户端和服务端:

以下通过查阅资料对于python内部的socket函数进行分析:

1 Socket函数:创建套接字 如下:

s?= socket()

2 Bind函数:将套接字表示为地址 如下:

host?= "127.0.0.1"

# port = 465

port?= 25

s.bind((host, port))

以上语句将端口、地址与套接字绑定

3 Listen函数:进行监听 如下:

s.listen(5)

4 Accpet函数:进行与客户机的连接 如下:

new_socket, address?= s.accept()

此处s.accept返回的是接受的客户机的地址,故address=返回值

5 Connect函数:连接远处服务器请求 如下:

? ? ? ? client_socket.connect((mail_server, port)) ?# 连接服务器

指定了远方客户机

个人理解:区别accpet和connect→accept指与发件邮箱连接,connect指与收件邮箱连接。

Recv函数:接受远端的数据 如下:接收了client的大小为1024的数据。

? ? ? ? recv1?= client_socket.recv(1024) ?# 接受邮件服务器的回复

Send函数:发送给远方主机 如下:

? ? new_socket.send(post_msg.encode('utf-8'))

即将调用内容发送给new_socket

Close函数:关闭套接字

2.3 模块结构

为方便阅读,以下代码以截图显示。

  1. 程序启动阶段:

此处代码用于建立server的socket,也就是程序的建立。

  1. 与发送端建立连接:

  1. 检查发送端邮箱

  1. 若有多个收件邮箱时,分别检查格式并利用布尔变量进行顺序查询

2.打印发送信息,此处利用count进行计数第几个字符。初始flag为1,若信息小于1024时则判定结束,flag改为0,否则count++,flag为1,即对下一个字符进行判定。

到此为止发送阶段结束。

  1. 对发送内容进行解码,以得到完整的发送信息

  1. 打印信息

  1. 身份确认,密码检验

  1. 建立过程,与上段代码类似,不再赘述
  2. 密码检测系统
  3. 邮件接收端和服务响应
  4. 转换发送内容

  1. 发送信息并结束进程

2.4流程图

  1. 实验结果演示

3.1输出检测

3.2 差错处理

提供差错报告:将实际邮件服务器的差错报告状态码及短语解 释(如“550 Invalid recipient”等)转发给邮件发送者

  1. 实验总结与心得体会
    1. 本次实验独立完成,实际上机调试时间大概在十个小时左右。
    2. 编程环境问题:在配置环境之后pycharm仍旧无法运行程序,最后选择vscode完成实验
    3. 编程语言python并未经历过系统学习,在研究时需要查阅资料。
    4. SMTP缺点:

?命令过于简单,没提供认证等功能。

?? 只传送7位的ASCII码,不能传送二进制文件

参考网站:python网络编程——socket基础篇 - 人生苦短,python当歌 - 博客园

GitHub - zhangchi991022/smtp-socket: SMTP代理服务器

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:49:25  更:2022-01-04 13:51:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 6:29:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码