You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

aiosmtpd SMTP服务器认证功能失效问题求助

解决aiosmtpd SMTP服务器认证不支持问题

问题根源

你的aiosmtpd服务器没有配置支持的认证机制——默认情况下,即使你设置了authenticator和auth_required参数,aiosmtpd也不会主动启用SMTP AUTH扩展,导致客户端收到"SMTP AUTH extension not supported by server"错误。

解决方案

1. 服务器端修改

在创建Controller实例时添加auth_mechanisms参数,指定支持的认证机制(比如["PLAIN", "LOGIN"],这是客户端最常用的两种明文认证方式),同时修正认证函数的错误逻辑:

修改后的完整服务器代码:

import logging
from aiosmtpd.controller import Controller
from aiosmtpd.smtp import AuthResult, LoginPassword

auth_db = {
    b"user1": b"password1",
    b"user2": b"password2",
    b"user3": b"password3",
}


def authenticator_func(server, session, envelope, mechanism, auth_data):
    assert isinstance(auth_data, LoginPassword)
    username = auth_data.login
    password = auth_data.password

    # 修正验证逻辑:密码匹配才通过,否则拒绝
    if auth_db.get(username) == password:
        return AuthResult(success=True)
    else:
        return AuthResult(success=False, handled=False)


class CustomSMTPHandler:
    async def handle_DATA(self, server, session, envelope):
        print('=== 收到新邮件 ===')
        print(f"发件人: {envelope.mail_from}")
        print(f"收件人: {envelope.rcpt_tos}")
        print(f"邮件内容:\n{envelope.content.decode('utf-8')}")
        return '250 Message accepted for delivery'


logging.basicConfig(level=logging.DEBUG)
handler = CustomSMTPHandler()
controller = Controller(
    handler,
    hostname='192.168.1.1',
    port=8025,
    authenticator=authenticator_func,
    auth_required=True,
    # 关键:添加这行指定支持的认证机制
    auth_mechanisms=["PLAIN", "LOGIN"],
)

controller.start()
input("服务器已启动,按回车退出...")
controller.stop()

2. 客户端优化(可选但推荐)

客户端代码无需大改,但可以显式调用ehlo()确保服务器返回所有支持的扩展(包括AUTH),避免潜在的自动调用失败问题:

修改后的send_mail函数:

def send_mail(mail_from, mail_to, mail_subject, mail_message):
    try:
        smtp_server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        smtp_server.set_debuglevel(True)
        # 显式发送EHLO指令,触发服务器返回扩展信息
        smtp_server.ehlo()
        msg = MIMEMultipart()
        msg['From'] = mail_from
        msg['To'] = mail_to
        msg['Subject'] = mail_subject
        msg.attach(MIMEText(mail_message, 'html'))
        smtp_server.login('user1', 'password1')
        smtp_server.send_message(msg)
        smtp_server.quit()
    except SMTPException as smtp_err:
        return {"Error": f"SMTP错误: {repr(smtp_err)}"}
    except Exception as gen_err:
        return {"Error": f"通用错误: {repr(gen_err)}"}

    return {"成功": f"邮件已发送到SMTP服务器: {SMTP_SERVER}"}

关键说明

  • auth_mechanisms是必须的:aiosmtpd不会默认启用任何认证机制,必须明确指定才能让服务器在EHLO响应中包含AUTH标识,客户端才能发起认证请求。
  • 原认证函数的错误:你之前在else分支也返回success=True,这会导致无论密码对错都能登录,完全失去认证意义,必须修正为返回失败结果。
  • Thunderbird配置:确保在Thunderbird的账户设置中,将认证方式设置为"正常密码"(对应PLAIN/LOGIN机制),并填写正确的用户名密码和端口。

内容的提问来源于stack exchange,提问作者Chucha Cuta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:56:02