如何为Red Hat上的aiosmtpd服务器配置日志以排查认证连接问题
aiosmtpd日志配置与认证问题排查方案
1. 核心问题说明
你当前日志不生效、看不到交互内容有两个直接原因:一是现有logging配置存在语法错误,二是aiosmtpd默认未开启SMTP协议级的交互日志。
2. 修复logging配置错误
你现有configure_logging函数中给handler绑定Formatter的逻辑写反了,修正后的完整配置如下:
def configure_logging(): file_handler = logging.FileHandler("aiosmtpd.log", "a") stderr_handler = logging.StreamHandler(sys.stderr) # aiosmtpd默认日志输出到两个logger下,需要同时配置 logger_mail = logging.getLogger("mail.log") logger_smtpd = logging.getLogger("aiosmtpd") fmt = "[%(asctime)s %(levelname)s] %(message)s" formatter = logging.Formatter(fmt, datefmt="%Y-%m-%d %H:%M:%S") # 给两个handler绑定格式化规则 stderr_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 给两个logger添加handler并设置日志级别 for logger in [logger_mail, logger_smtpd]: logger.addHandler(stderr_handler) logger.addHandler(file_handler) logger.setLevel(logging.DEBUG)
3. 开启SMTP完整交互日志
初始化Controller时添加debug=True参数,即可打印客户端和服务器之间所有的命令交互(包括EHLO、AUTH、MAIL FROM等所有阶段的请求和返回):
controller = Controller( handler, hostname='0.0.0.0', port=587, authenticator=authenticator_func, auth_required=True, auth_require_tls=False, debug=True # 新增此行开启协议级调试 )
4. 补充认证失败日志(快速排查设备连接问题)
你当前的认证函数没有日志输出,无法看到设备提交的账号密码实际值,修改authenticator_func添加日志:
def authenticator_func(server, session, envelope, mechanism, auth_data): assert isinstance(auth_data, LoginPassword) username = auth_data.login password = auth_data.password # 打印认证请求详情,可直接看到设备提交的账号密码 Lprint(f"认证请求:来源IP {session.peer[0]} 提交账号 {username!r} 提交密码 {password!r}", 2) if auth_db.get(username) == password: Lprint(f"认证成功:账号 {username!r}", 2) return AuthResult(success=True) else: Lprint(f"认证失败:账号 {username!r} 不存在或密码错误", 2) return AuthResult(success=False, handled=False)
配置后效果
- 你可以在当前目录的
aiosmtpd.log中看到所有SMTP协议交互、报错信息 - 自定义的业务日志仍会输出到
/home/matthew_gale/smtp-server/Logging/EmailExtractorLog.out - 可直接从日志中看到设备提交的认证信息,快速排查账号密码格式不匹配、特殊字符编码错误等常见问题
内容的提问来源于stack exchange,提问作者MattieG4
相关产品推荐
相关产品推荐

