From dd5f7134ddf687cfa0be929e090eaca27458bce2 Mon Sep 17 00:00:00 2001
From: typingbugs <21281280@bjtu.edu.cn>
Date: Thu, 28 Mar 2024 21:55:25 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B7=B2=E5=AE=8C=E6=88=90lab1=20&=20lab2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Lab1/src/main.py | 86 +++++++++++++++++
Lab1/www/dir/hello.html | 14 +++
Lab1/www/index.html | 14 +++
Lab2/email_config.json | 9 ++
Lab2/emails.json | 207 ++++++++++++++++++++++++++++++++++++++++
Lab2/receiver.py | 62 ++++++++++++
Lab2/sender.py | 31 ++++++
7 files changed, 423 insertions(+)
create mode 100644 Lab1/src/main.py
create mode 100644 Lab1/www/dir/hello.html
create mode 100644 Lab1/www/index.html
create mode 100644 Lab2/email_config.json
create mode 100644 Lab2/emails.json
create mode 100644 Lab2/receiver.py
create mode 100644 Lab2/sender.py
diff --git a/Lab1/src/main.py b/Lab1/src/main.py
new file mode 100644
index 0000000..03c5098
--- /dev/null
+++ b/Lab1/src/main.py
@@ -0,0 +1,86 @@
+import os
+import socket
+import urllib.parse
+
+# 设置服务器的根目录
+WEB_ROOT = os.path.abspath("../www")
+
+def serve_file(client_socket:socket.socket, path):
+ # 解析请求的URL路径,移除开头的/,并处理URL编码
+ requested_path = urllib.parse.unquote(path)
+ if requested_path == "/":
+ requested_path = "/index.html" # 默认页面
+
+ # 构建文件的绝对路径
+ file_path = os.path.join(WEB_ROOT, requested_path.lstrip('/'))
+
+ # 获取安全的绝对路径,以确保它不会跳出根目录
+ safe_path = os.path.abspath(file_path)
+ if not safe_path.startswith(WEB_ROOT):
+ # 如果请求的路径不是根目录的子路径,则返回403 Forbidden
+ response = b"HTTP/1.1 403 Forbidden\r\n"
+ response += b"Content-Type: text/html\r\n"
+ response += b"\r\n"
+ response += b"
403 Forbidden
"
+ else:
+ try:
+ # 尝试打开并读取文件
+ with open(safe_path, "rb") as file:
+ content = file.read()
+ # 根据文件类型设置Content-Type(这里简化处理,仅对HTML进行了处理)
+ content_type = "text/html" if safe_path.endswith(".html") else "application/octet-stream"
+ response = b"HTTP/1.1 200 OK\r\n"
+ response += f"Content-Type: {content_type}\r\n".encode()
+ response += b"Content-Length: " + str(len(content)).encode() + b"\r\n"
+ response += b"\r\n"
+ response += content
+ except FileNotFoundError:
+ # 文件未找到,返回404响应
+ response = b"HTTP/1.1 404 Not Found\r\n"
+ response += b"Content-Type: text/html\r\n"
+ response += b"\r\n"
+ response += b"404 Not Found
"
+
+ client_socket.send(response)
+
+def start_server(host="0.0.0.0", port=80):
+ socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许地址重用
+ socket_server.bind((host, port))
+ socket_server.listen(5)
+ print(f"Server listening on {host}:{port}")
+
+ while True:
+ client_socket = None
+ try:
+ client_socket, address = socket_server.accept()
+ print(f"Connection from {address}")
+
+ # 接收客户端请求
+ request = client_socket.recv(1024).decode("utf-8")
+ if not request:
+ print("Empty request received.")
+ continue
+
+ # 解析HTTP请求的第一行获取请求路径
+ request_lines = request.split("\r\n")
+ if request_lines and len(request_lines[0].split(" ")) >= 3:
+ method, path, _ = request_lines[0].split(" ", 2)
+ # 根据路径返回相应的文件
+ serve_file(client_socket, path)
+ print(f'Respond client socket {client_socket} succeed')
+ else:
+ print("Invalid request line:", request_lines[0])
+ # 关闭客户端连接
+
+ except ConnectionResetError:
+ print("Connection reset by peer.")
+ except Exception as e:
+ print(f"Unexpected error: {e}")
+ finally:
+ if client_socket:
+ client_socket.close()
+
+if __name__ == "__main__":
+ start_server()
+
diff --git a/Lab1/www/dir/hello.html b/Lab1/www/dir/hello.html
new file mode 100644
index 0000000..b6ca0d5
--- /dev/null
+++ b/Lab1/www/dir/hello.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ Hello页面
+
+
+ Hello页面
+ 这是一个简单的Hello页面。
+ 返回主页
+
+
+
diff --git a/Lab1/www/index.html b/Lab1/www/index.html
new file mode 100644
index 0000000..728c1c1
--- /dev/null
+++ b/Lab1/www/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+ 主页
+
+
+ 欢迎来到主页
+ 这是网站的主页。
+ 访问hello页面
+
+
+
diff --git a/Lab2/email_config.json b/Lab2/email_config.json
new file mode 100644
index 0000000..678fb54
--- /dev/null
+++ b/Lab2/email_config.json
@@ -0,0 +1,9 @@
+{
+ "sender": "jingfan.ke@qq.com",
+ "receiver": "jingfan.ke@qq.com",
+ "subject": "SMTP 邮件测试",
+ "body": "这是一封测试邮件,发送自Python程序。",
+ "smtp_server": "smtp.qq.com",
+ "imap_url": "imap.qq.com",
+ "password": "dbeucjitqdczebad"
+}
\ No newline at end of file
diff --git a/Lab2/emails.json b/Lab2/emails.json
new file mode 100644
index 0000000..e0fd2c3
--- /dev/null
+++ b/Lab2/emails.json
@@ -0,0 +1,207 @@
+[
+ {
+ "From": "=?utf-8?b?5Lqs5LicSkQuY29t?= ",
+ "Subject": "京东已收到您的订单【290695******】,欢迎您随时关注订单状态!",
+ "Body": "\r\n\r\n \r\n \r\n 京东已收到您的订单【290695******】,欢迎您随时关注订单状态!\r\n \r\n \r\n \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n | \r\n | \r\n \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n | \r\n | \r\n 我的京东 | \r\n | \r\n | \r\n | \r\n 京东会员 | \r\n | \r\n | \r\n | \r\n 退订投诉 | \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n | \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n 尊敬的京东用户您好: 感谢您在京东(JD.COM)购物! 我们已经收到了您的订单,会尽快为您安排发货。您选择的是在线支付,订单信息以“我的订单”页面显示为准,您也可以随时进入页面对订单进行修改等操作。 | \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n | \r\n 订单编号: 290695****** | \r\n | \r\n 支付方式: 在线支付 | \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n | \r\n | \r\n | \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n | \r\n \r\n \r\n 查看更多订单信息> | \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n \r\n \r\n 重要说明: 您理解并同意:本网站上销售商展示的商品和价格等信息仅仅是要约邀请,您下单时须填写您希望购买的商品数量、价款及支付方式、收货人、联系方式、收货地址(合同履行地点)、合同履行方式等内容;系统生成的订单信息是计算机信息系统根据您填写的内容自动生成的数据,仅是您向销售商发出的合同要约;销售商收到您的订单信息后,只有在销售商将您在订单中订购的商品从仓库实际直接向您发出时(以商品出库为标志),方视为您与销售商之间就实际直接向您发出的商品建立了合同关系;如果您在一份订单里订购了多种商品并且销售商只给您发出了部分商品时,您与销售商之间仅就实际直接向您发出的商品建立了合同关系,只有在销售商实际直接向您发出了订单中订购的其他商品时,您和销售商之间就订单中其他已实际直接向您发出的商品才成立合同关系;对于电子书、数字音乐、在线手机充值等数字化商品,您下单并支付货款后合同即成立。当您作为消费者为生活消费需要下单并支付货款的情况下,您货款支付成功后即视为您与销售商之间就已支付货款部分的订单建立了合同关系。 您可以随时登陆您在京东注册的账户,查询您的订单状态。更多内容请见最新的京东网站用户注册协议及京东网站各类购物规则,我们建议您不时地浏览阅读。 账户安全提醒: 互联网账号存在被盗风险,为了保障您的账号及资金安全,京东提醒您访问 我的账户> 账户安全,尽快启用所有安全服务。 | \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n | \r\n \r\n \r\n | \r\n | \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n | \r\n \r\n \r\n \r\n \r\n | \r\n \r\n \r\n | \r\n \r\n \r\n \r\n | \r\n | \r\n
\r\n \r\n
\r\n \r\n\r\n"
+ },
+ {
+ "From": "jingfan.ke@qq.com",
+ "Subject": "SMTP 邮件测试",
+ "Body": "这是一封测试邮件,发送自Python程序。"
+ },
+ {
+ "From": "=?utf-8?B?UVHpgq7nrrHlm6LpmJ8==?= <10000@qq.com>",
+ "Subject": "更安全、更高效、更强大,尽在QQ邮箱APP",
+ "Body": "\r\n\r\n\r\n\r\n \r\n imap\r\n \r\n\r\n\r\n \r\n
\r\n
\r\n QQ邮箱APP,让高效触手可及。在这里,你可以登录多个邮箱账号、便捷存储微信邮件、多窗口编辑邮件......还有更多功能,等你探索!\r\n
\r\n
\r\n
01
\r\n
多帐号登录
\r\n
可以同时登录多个邮箱帐号
\r\n
一站式灵活管理各类邮件信息
\r\n

\r\n
\r\n
\r\n
02
\r\n
文件中转站
\r\n
把各类文件存在云端
\r\n
还能便捷导入微信文件,过期烦恼不再有
\r\n

\r\n
\r\n \r\n
\r\n
03
\r\n
多窗口编辑
\r\n
写邮件、写记事、写日程都可收起为浮窗
\r\n
编辑内容的同时不错过重要邮件
\r\n

\r\n
\r\n
\r\n
04
\r\n
富文本信息一键添加
\r\n
日程邀请、地理位置、记事本、在线文档
\r\n
这些重要内容可以一键加入邮件正文
\r\n

\r\n
\r\n
\r\n
05
\r\n
灵活管理日程
\r\n
全新日历功能、日程列表更清晰,重要事件不错过
\r\n
还可以邀请伙伴共同参与,提升合作效率
\r\n

\r\n
\r\n
\r\n \r\n
\r\n \r\n 立即体验\r\n \r\n \r\n

\r\n

\r\n
\r\n\r\n\r\n