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

使用win32com发邮件时Outlook LDAP查询超限错误解决

问题描述

我正在使用Python的win32com.client模块通过Outlook发送邮件,email实例化为CDispatch对象,但调用Send()方法时遇到LDAP错误。

错误详情

控制台输出以下错误信息:

(-2147352567, 'Ausnahmefehler aufgetreten.', (4096, 'Microsoft Outlook', 'Outlook kennt mindestens einen Namen nicht.', None, 0, -2147467259), None)

同时弹出Outlook提示框:

Microsoft LDAP-Verzeichnis
Die Anzahl der vom LDAP-Verzeichnisserver für diesen Suchvorgang gefundenen Einträge überschreitet das von Ihnen vorgegebene Limit.

翻译:“LDAP目录服务器为此搜索操作找到的条目数超出了您设置的限制。”

当前代码

以下是我使用的简化Python代码:

import win32com.client
from win32com.client import CDispatch

def setup_mailbox(shared_mailbox_display_name: str):
    outlook = client.Dispatch("Outlook.Application")
    mailbox_kaffee = None

    namespace = outlook.GetNamespace("MAPI")
    stores = namespace.Stores
    for store in stores:
        print(store.DisplayName)
        if store.DisplayName == shared_mailbox_display_name:
            mailbox_kaffee = store
            break

    if mailbox_kaffee is None:
        raise Exception(f"Shared mailbox '{shared_mailbox_display_name}' not found.")
    return mailbox_kaffee

def send_email(body: str,
               _mailbox: CDispatch,
               receiver: str,
               display_name: str):
    mail_folder = mailbox.GetDefaultFolder(6)  # 6 is for email folder
    email = mail_folder.Items.Add(0)  # Add an email item
    email.Subject = "Test Email"
    email.HTMLBody = body
    email.SentOnBehalfOfName = display_name
    email.Recipients.Add(receiver)

    email.Save()
    email.Send()  # Error occurs here

# Simplified call to the function
mailbox_display_name = "test"
mailbox = setup_mailbox(mailbox_display_name)
send_email("<html><body>Hello</body></html>", mailbox, "receiver@example.com", "Sender Display Name")

环境信息

  • Python 3.10
  • pywin32 版本306
  • Microsoft Outlook 2016

问题

如何解决此错误?或如何阻止Outlook执行超出结果限制的LDAP查询?是否可通过手动配置Outlook修复?


解决方案

一、代码层面优化

1. 用邮箱地址替代显示名称

Outlook解析SentOnBehalfOfName的显示名称时会触发LDAP查询,结果过多就会报错。直接使用发件人邮箱地址:

# 替换原代码中的email.SentOnBehalfOfName = display_name
email.SentOnBehalfOfName = "sender@example.com"  # 发件人实际邮箱地址

2. 提前验证收件人

添加收件人后调用Resolve()方法预解析,避免发送时触发批量LDAP查询:

recipient = email.Recipients.Add(receiver)
if not recipient.Resolve():
    raise ValueError(f"无法解析收件人地址:{receiver}")

3. 直接创建邮件对象

绕过共享邮箱文件夹的条目添加逻辑,直接从Outlook应用创建邮件:

# 修改send_email函数中的邮件创建部分
outlook = win32com.client.Dispatch("Outlook.Application")
email = outlook.CreateItem(0)  # 0代表邮件项
# 后续主题、正文等设置逻辑保持不变

二、Outlook客户端配置调整

1. 提高LDAP查询结果限制

  • 打开Outlook,点击文件 > 选项 > 高级
  • 找到目录板块,点击目录设置
  • 选择当前LDAP服务器,点击修改
  • 在搜索选项卡中,调高“搜索结果的最大数量”(比如改为1000)
  • 保存设置后重启Outlook

2. 禁用自动名称解析

  • 打开Outlook,点击文件 > 选项 > 邮件
  • 找到发送邮件板块,点击编辑器选项
  • 选择高级,取消勾选自动完成列表中显示联系人建议
  • 重启Outlook后,发送邮件将不再自动触发LDAP名称解析

3. 确认共享邮箱权限

确保当前账号拥有共享邮箱的“发送代表”权限,避免因权限问题触发额外LDAP查询,可联系Exchange管理员确认配置。

三、服务器端调整(需管理员权限)

若客户端配置无效,可联系Exchange管理员:

  • 提高LDAP查询的默认结果限制
  • 优化LDAP查询过滤规则,减少返回结果数量

内容的提问来源于stack exchange,提问作者Junsong Du

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:07:12