python代码报错,使用Socket API编写一个邮件服务器程序,该程序使用HTTP接收来自浏览器客户端的邮件,并使用SMTP转发到实际的接收邮件服务器的用户邮箱

Traceback (most recent call last):
File "D:\pycharm\PyCharm Community Edition 2023.1.2\pythonProject\mail2.py", line 282, in
main()
File "D:\pycharm\PyCharm Community Edition 2023.1.2\pythonProject\mail2.py", line 143, in main
data = connection.recv(1024)
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

首先,你需要使用 Python 的 socket 模块创建一个 HTTP 服务器,以便浏览器客户端可以将邮件发送到该服务器。
然后,你需要解析 HTTP 请求,提取邮件内容,并将其转发到实际的接收邮件服务器的用户邮箱。你可以使用 Python 的 smtplib 模块来发送邮件。
以下是一个简单的代码示例:

import socket
import smtplib

# 创建 HTTP 服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen(1)

while True:
    # 接受客户端连接
    client_socket, client_address = server_socket.accept()

    # 接收请求数据
    request_data = client_socket.recv(1024).decode('utf-8')

    # 解析请求头
    request_lines = request_data.split('\r\n')
    method, path, version = request_lines[0].split()

    # 提取邮件内容
    if method == 'POST':
        content_length = int([line.split(':')[1].strip() for line in request_lines if line.startswith('Content-Length')][0])
        mail_content = request_data.split('\r\n\r\n')[1][:content_length]

        # 发送邮件
        smtp_server = smtplib.SMTP('smtp.example.com', 587)
        smtp_server.starttls()
        smtp_server.login('username', 'password')
        smtp_server.sendmail('sender@example.com', ['recipient@example.com'], mail_content)
        smtp_server.quit()

    # 返回响应
    response_data = 'HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n'
    client_socket.sendall(response_data.encode('utf-8'))
    client_socket.close()

ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接

错误通常意味着远程主机已经关闭了连接,但是本地主机仍然尝试发送数据。这可能是由于以下原因导致的:

  1. 网络连接不稳定,导致连接中断。

  2. 远程主机在处理连接时遇到了问题,强制关闭了连接。

  3. 本地主机尝试发送太多数据,超出了远程主机的处理能力。

要解决这个问题,可以尝试以下步骤:

  • 确认网络连接稳定,重新连接尝试。

  • 检查远程主机的日志文件,以确定是否有任何错误或异常。

  • 调整本地主机发送数据的速率,以确保不会超出远程主机的处理能力。
    如果上述步骤都无法解决问题,可以尝试使用其他方式进行通信,例如使用其他协议或更可靠的网络连接。

这应该是没有设置socket的连接时长导致的,在默认情况下,超过一定时间没有数据收发操作时,连接会自动断开,从而报这个错误,解决方法就是在客户端在创建socket之后,设置心跳

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, True)
sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 60 * 1000, 30 * 1000))


可以参考下

import socket
 
# 1.创建套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
# 2.建立连接
tcp_client_socket.connect(("www.icoderi.com", 80))
 
# 3.拼接请求协议
# 3.1 请求行
request_line = "GET / HTTP/1.1\r\n"
 
# 3.2 请求头
request_header = "Host:www.icoderi.com\r\n"
 
# 3.3 请求空行
request_blank = "\r\n"
 
# 整体拼接
request_data = request_line + request_header + request_blank
 
# 4.发送请求协议
tcp_client_socket.send(request_data.encode())
 
# 5.接收服务器响应
recv_data = tcp_client_socket.recv(4096)
recv_text = recv_data.decode()
 
# 找到响应数据中的html内容
loc = recv_text.find("<html>")
html_data = recv_text[loc:]
print(html_data)
 
# 关闭连接
tcp_client_socket.close()

这个错误是指远程主机强制关闭了连接,导致你的Python程序无法继续接收数据,从而引发了ConnectionResetError异常。可以通过增加缓冲区大小、调整连接超时时间等手段优化网络连接

首先不排除你的网络连接问题,你可以加个try/except语句,捕捉到ConnectionResetError异常看下,包括重连机制