You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在LinuxMint22.3+Python3.12的aiosmtpd中,如何在handle_XXXX方法获取远程IP?

在aiosmtpd的handle_XXX方法中获取远程客户端IP

在最新版aiosmtpd中,所有handle_XXXX方法均可通过会话对象获取远程客户端的IP地址,具体实现方式如下:

  • 自定义Handler类时,每个handle_*方法(如handle_HELOhandle_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

火山引擎 最新活动