计网大作业--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代理服务器

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值