无法从 python aiosmtpd SMTP 服务器发送或接收电子邮件,卡在 250 ok
Unable to send or recieve emails from python aiosmtpd SMTP server, stuck at 250 ok
我已经“成功”制作了一个 SMTP 服务器。该代码可以很好地连接到 SMTP 客户端。但它既不能接收电子邮件也不能发送电子邮件。我尝试了各种测试服务器以及标准 gmail/yahoo 等。
这是代码:
# Copyright 2014-2021 The aiosmtpd Developers
# SPDX-License-Identifier: Apache-2.0
import asyncio
from asyncio.base_events import Server
import logging
import aiosmtpd
from aiosmtpd.controller import DEFAULT_READY_TIMEOUT, Controller
import ssl
from aiosmtpd.smtp import Envelope, Session
from smtplib import SMTP as SMTPCLient
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain('cert.pem', 'privkey.pem')
class ExampleHandler():
async def handle_RCPT(self, server, session, envelope, address, rcpt_options):
if address.endswith('@example.com'):
print('not relaying to that domain bro :(')
return '550 not relaying to that domain'
envelope.rcpt_tos.append(address)
print(address+" "+"is added to rcpt_tos")
# Make an envelope for the recipient with the same content.
return '250 OK'
# async def handle_EHLO(self, server, session, envelope):
# print('EHLO from %s' % envelope.mail_from)
# return '250-Hello, how are you?\n250-I am fine\n250 HELP'
async def handle_DATA(self, server, session, envelope):
print('Message from %s' % envelope.mail_from)
print('Message for %s' % envelope.rcpt_tos)
print('Message data:\n')
for ln in envelope.content.decode('utf8', errors='replace').splitlines():
print(f'> {ln}'.strip())
print()
print('End of message')
# Dump the contents of envelope.content to a file.
fi=open('./mailbox/firstletter.txt','w')
fi.write(envelope.content.decode('utf8', errors='replace'))
fi.close()
# print everything in DATA.
# Send the envelope to the recipient.
return '250 Message will be delivered'
#Define Relay server.
async def amain(loop):
cont = Controller(ExampleHandler(),hostname='x.x.x.x', port=25, server_hostname='Galam Limited',ready_timeout=5000)
# Combining ExampleHandler and Controller into a single Controller.
cont.start()
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
loop = asyncio.get_event_loop()
loop.create_task(amain(loop=loop))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
您可以测试服务器的可达性。我被困住了,花了整整 2 天无济于事。问题绝对不是连接性问题,我打开了端口 25。确保 godaddy 也没有外部问题。如有任何帮助,我们将不胜感激。
编辑:1
当我 运行 客户端脚本时,wire shark 数据的快速峰值显示绝对没有数据包被传输到外部。
这是我用来测试的 clinet 脚本。
from smtplib import SMTP as Client
from aiosmtpd.controller import Controller
class controller:
hostname='192.168.1.33'
port=25
client = Client(controller.hostname, controller.port)
r = client.sendmail('a@galam.in', ['tester@192.168.1.200'], """\
From: Anne Person <anne@galam.in>
To: Bart Person <tester@192.168.1.200>
Subject: A test
Message-ID: <ant>
Hi Bart, this is Anne.
""")
SMTP 250 代码表示已成功建立连接,但您要向其发送邮件的远程主机可能已将发送邮件的域归类为非法域。
如果您的域不是 authenticated/verified,则可能会发生这种情况。
您可以通过 sendgrid
等受信任的 SMTP 服务转发邮件
您还可以通过从您的服务向 check-auth@verifier.port25.com
发送邮件来检查您的域是否经过验证。 Port25 是一个自动化工具,可以验证您的 DNS 记录、SPF 记录等。
希望这对你有用!
在您的代码中,cont.start()
启动一个 SMTP 服务器,该服务器在端口 25 上接收消息并使用 handle_RCPT 和 handle_DATA 处理它们,但您实际上没有编写任何代码将电子邮件转发到远程主机。这就是为什么发送到您的服务器的电子邮件不会出现在任何人的收件箱中 - 服务器实现不是完整的电子邮件中继。
如果您想通过 Internet 向 anne@galam.in
发送电子邮件,那么您应该联系负责 galam.in
域的 SMTP 服务器,而不是您 运行 的 SMTP 服务器宁使用 aiosmtpd。对于此任务,您不需要 运行 一个 SMTP 服务器,因为据推测互联网上已经有一个 SMTP 服务器 运行ning 用于 galam.in
;相反,您只需要一个 SMTP 客户端 组件,例如您用来测试服务器的 smtplib 脚本。使用 SMTP 发送电子邮件与 aiosmtpd 无关。
进一步阅读:Email § Operation on Wikipedia. See also the SO question 。
我已经“成功”制作了一个 SMTP 服务器。该代码可以很好地连接到 SMTP 客户端。但它既不能接收电子邮件也不能发送电子邮件。我尝试了各种测试服务器以及标准 gmail/yahoo 等。 这是代码:
# Copyright 2014-2021 The aiosmtpd Developers
# SPDX-License-Identifier: Apache-2.0
import asyncio
from asyncio.base_events import Server
import logging
import aiosmtpd
from aiosmtpd.controller import DEFAULT_READY_TIMEOUT, Controller
import ssl
from aiosmtpd.smtp import Envelope, Session
from smtplib import SMTP as SMTPCLient
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain('cert.pem', 'privkey.pem')
class ExampleHandler():
async def handle_RCPT(self, server, session, envelope, address, rcpt_options):
if address.endswith('@example.com'):
print('not relaying to that domain bro :(')
return '550 not relaying to that domain'
envelope.rcpt_tos.append(address)
print(address+" "+"is added to rcpt_tos")
# Make an envelope for the recipient with the same content.
return '250 OK'
# async def handle_EHLO(self, server, session, envelope):
# print('EHLO from %s' % envelope.mail_from)
# return '250-Hello, how are you?\n250-I am fine\n250 HELP'
async def handle_DATA(self, server, session, envelope):
print('Message from %s' % envelope.mail_from)
print('Message for %s' % envelope.rcpt_tos)
print('Message data:\n')
for ln in envelope.content.decode('utf8', errors='replace').splitlines():
print(f'> {ln}'.strip())
print()
print('End of message')
# Dump the contents of envelope.content to a file.
fi=open('./mailbox/firstletter.txt','w')
fi.write(envelope.content.decode('utf8', errors='replace'))
fi.close()
# print everything in DATA.
# Send the envelope to the recipient.
return '250 Message will be delivered'
#Define Relay server.
async def amain(loop):
cont = Controller(ExampleHandler(),hostname='x.x.x.x', port=25, server_hostname='Galam Limited',ready_timeout=5000)
# Combining ExampleHandler and Controller into a single Controller.
cont.start()
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
loop = asyncio.get_event_loop()
loop.create_task(amain(loop=loop))
try:
loop.run_forever()
except KeyboardInterrupt:
pass
您可以测试服务器的可达性。我被困住了,花了整整 2 天无济于事。问题绝对不是连接性问题,我打开了端口 25。确保 godaddy 也没有外部问题。如有任何帮助,我们将不胜感激。
编辑:1 当我 运行 客户端脚本时,wire shark 数据的快速峰值显示绝对没有数据包被传输到外部。 这是我用来测试的 clinet 脚本。
from smtplib import SMTP as Client
from aiosmtpd.controller import Controller
class controller:
hostname='192.168.1.33'
port=25
client = Client(controller.hostname, controller.port)
r = client.sendmail('a@galam.in', ['tester@192.168.1.200'], """\
From: Anne Person <anne@galam.in>
To: Bart Person <tester@192.168.1.200>
Subject: A test
Message-ID: <ant>
Hi Bart, this is Anne.
""")
SMTP 250 代码表示已成功建立连接,但您要向其发送邮件的远程主机可能已将发送邮件的域归类为非法域。
如果您的域不是 authenticated/verified,则可能会发生这种情况。 您可以通过 sendgrid
等受信任的 SMTP 服务转发邮件您还可以通过从您的服务向 check-auth@verifier.port25.com
发送邮件来检查您的域是否经过验证。 Port25 是一个自动化工具,可以验证您的 DNS 记录、SPF 记录等。
希望这对你有用!
在您的代码中,cont.start()
启动一个 SMTP 服务器,该服务器在端口 25 上接收消息并使用 handle_RCPT 和 handle_DATA 处理它们,但您实际上没有编写任何代码将电子邮件转发到远程主机。这就是为什么发送到您的服务器的电子邮件不会出现在任何人的收件箱中 - 服务器实现不是完整的电子邮件中继。
如果您想通过 Internet 向 anne@galam.in
发送电子邮件,那么您应该联系负责 galam.in
域的 SMTP 服务器,而不是您 运行 的 SMTP 服务器宁使用 aiosmtpd。对于此任务,您不需要 运行 一个 SMTP 服务器,因为据推测互联网上已经有一个 SMTP 服务器 运行ning 用于 galam.in
;相反,您只需要一个 SMTP 客户端 组件,例如您用来测试服务器的 smtplib 脚本。使用 SMTP 发送电子邮件与 aiosmtpd 无关。
进一步阅读:Email § Operation on Wikipedia. See also the SO question