python - 具有基本身份验证的 python aiosmtpd 服务器
问题描述
我正在尝试创建一个 aiosmtpd 服务器来处理收到的电子邮件。它在没有身份验证的情况下工作得很好,但我根本不知道如何设置身份验证。我浏览了这些文件并搜索了这方面的示例。
我当前如何使用它的示例:
from aiosmtpd.controller import Controller
class CustomHandler:
async def handle_DATA(self, server, session, envelope):
peer = session.peer
mail_from = envelope.mail_from
rcpt_tos = envelope.rcpt_tos
data = envelope.content # type: bytes
# Process message data...
print('peer:' + str(peer))
print('mail_from:' + str(mail_from))
print('rcpt_tos:' + str(rcpt_tos))
print('data:' + str(data))
return '250 OK'
if __name__ == '__main__':
handler = CustomHandler()
controller = Controller(handler, hostname='192.168.8.125', port=10025)
# Run the event loop in a separate thread.
controller.start()
# Wait for the user to press Return.
input('SMTP server running. Press Return to stop server and exit.')
controller.stop()```
which is the basic method from the documentation.
could someone please provide me with an example as to how to do simple authentication?
解决方案
好的,由于您使用的是 1.3.0 版本,因此您可以按照Authentication 的文档进行操作。
一个快速的开始方法是创建一个遵循Authenticator Callback 指南的“验证器函数”(可以是处理程序类中的方法,可以是独立的)。
一个简单的例子:
from aiosmtpd.smtp import AuthResult, LoginPassword
auth_db = {
b"user1": b"password1",
b"user2": b"password2",
b"user3": b"password3",
}
# Name can actually be anything
def authenticator_func(server, session, envelope, mechanism, auth_data):
# For this simple example, we'll ignore other parameters
assert isinstance(auth_data, LoginPassword)
username = auth_data.login
password = auth_data.password
# If we're using a set containing tuples of (username, password),
# we can simply use `auth_data in auth_set`.
# Or you can get fancy and use a full-fledged database to perform
# a query :-)
if auth_db.get(username) == password:
return AuthResult(success=True)
else:
return AuthResult(success=False, handled=False)
然后你正在创建控制器,像这样创建它:
controller = Controller(
handler,
hostname='192.168.8.125',
port=10025,
authenticator=authenticator_func, # i.e., the name of your authenticator function
auth_required=True, # Depending on your needs
)
推荐阅读
- android - 如何在Android中以编程方式更改视图约束上边距?
- laravel - 多个模型中的 Laravel 关系与 belongsToMany 和 hasMany
- android - Ionic+Android 上的 Firebase 身份验证打开一个浏览器窗口
- build - 如何在不发布的情况下将创建的 Outlook 插件分享给某人?
- java - 带有 Play 框架的 Swagger UI
- ms-access - 使用自动生成列插入选择
- html - 将按钮移动到与复选框和文本框引导程序在同一行
- python - 使用 pyspark 的 Spark RDD 的替代方法
- android - 如何从 CloudWatch 日志中过滤掉重复值?
- amazon-web-services - 如何从 AWS Java SDK 使用 IMDSv2