我正在尝试开发一个应该在 docker 容器中运行的测试电子邮件服务器。docker 容器使用 --network=host -P 运行;虽然对于单元测试我想使用--network=none。
我特意指定应该使用端口 0(让操作系统选择一个可用端口)。然后我有一个函数来获取实际使用的端口。服务器代码是
#! /usr/bin/env python3
import asyncio #pylint: disable=unused-import
from aiosmtpd.controller import Controller
class DemoEmailHandler:
async def handle_DATA(self, server, session, envelope):
message = {
'peer' : session.peer,
'mailfrom' : envelope.mail_from,
'to': envelope.rcpt_tos,
'data' : envelope.content}
print(message)
return '250 Message accepted for delivery'
class DemoEmailServer:
def __init__(self):
self._handler = DemoEmailHandler()
self._server = Controller(
handler=self._handler,
hostname="0.0.0.0",
port=0
)
self._server.start()
self._port = self._server.server.sockets[0].getsockname()[1]
def stop(self):
"""Tell the server to stop"""
self._server.stop()
def getPort(self) -> int:
"""Return the port the SMTP (email) server is actually on"""
return self._port
SERVER = DemoEmailServer()
print(SERVER.getPort())
SERVER.stop()
我不断收到连接被拒绝:
Traceback (most recent call last):
File "./demo_email_server.py", line 36, in <module>
SERVER = DemoEmailServer()
File "./demo_email_server.py", line 25, in __init__
self._server.start()
File "/usr/local/lib/python3.8/dist-packages/aiosmtpd-1.4.2-py3.8.egg/aiosmtpd/controller.py", line 223, in start
self._trigger_server()
File "/usr/local/lib/python3.8/dist-packages/aiosmtpd-1.4.2-py3.8.egg/aiosmtpd/controller.py", line 313, in _trigger_server
s = stk.enter_context(create_connection((hostname, self.port), 1.0))
File "/usr/lib/python3.8/socket.py", line 808, in create_connection
raise err
File "/usr/lib/python3.8/socket.py", line 796, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
如果我使用没有拒绝连接的 s.bind(('0.0.0.0', 0)) 创建一个简单的服务器套接字。
(我的主机和容器都是 Ubuntu 20.04,python 3.8.5,容器从源代码安装了 aiosmtpd 1.4.2)。
有人可以帮忙吗?