在LinuxMint22.3+Python3.12的aiosmtpd中,如何在handle_XXXX方法获取远程IP?
在aiosmtpd的handle_XXX方法中获取远程客户端IP
在最新版aiosmtpd中,所有handle_XXXX方法均可通过会话对象获取远程客户端的IP地址,具体实现方式如下:
- 自定义Handler类时,每个
handle_*方法(如handle_HELO、handle_DATA等)会接收session参数 - 从
session中取出transport属性(这是asyncio的传输对象),调用transport.get_extra_info('peername')方法,返回值为包含远程IP和端口的元组(ip_address, port),取元组第一个元素即可得到IP地址
示例代码:
from aiosmtpd.handlers import Handler class CustomSMTPHandler(Handler): def handle_HELO(self, server, session, envelope, hostname): # 获取远程IP remote_addr = session.transport.get_extra_info('peername') remote_ip = remote_addr[0] print(f"远程客户端IP: {remote_ip}") return '250 Hello ' + hostname def handle_DATA(self, server, session, envelope): # 同样方式获取IP remote_ip = session.transport.get_extra_info('peername')[0] print(f"收到来自{remote_ip}的邮件") # 这里添加邮件处理逻辑 return '250 Message accepted for delivery'
注意:不同handle_*方法的参数顺序可能略有差异,需确保正确引用session参数;get_extra_info('peername')在TCP连接场景下稳定有效,返回的IP地址格式为字符串(如192.168.1.100)。
内容的提问来源于stack exchange,提问作者HippoMan




