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

非Exchange环境下如何编程获取Microsoft Outlook通讯组成员

可以用Microsoft Graph API实现需求

完全可以通过Graph API来获取Outlook通讯组列表的成员,且完全适配Linux环境,无需依赖Exchange服务器或win32库。以下是具体实现方案:

前提准备

  1. Microsoft 365租户权限:需要你的律所拥有Microsoft 365租户,并且有管理员权限为应用授予API访问权限。
  2. 注册Azure AD应用:在Azure门户中注册一个应用程序,获取以下信息:
    • 客户端ID(Client ID)
    • 租户ID(Tenant ID)
    • 客户端密钥(Client Secret)
  3. 配置API权限:为注册的应用添加Application类型的权限,推荐选择Group.Read.All或Directory.Read.All(前者仅读取组信息,更符合最小权限原则),并由管理员同意该权限。

Python实现步骤

1. 安装依赖库

在Linux环境下安装所需的Python包:

pip install msal requests

2. 核心代码示例

import msal
import requests

# 配置应用凭据
CLIENT_ID = "你的客户端ID"
TENANT_ID = "你的租户ID"
CLIENT_SECRET = "你的客户端密钥"
GROUP_DISPLAY_NAME = "目标通讯组的显示名称"

# 获取Graph API访问令牌
def get_access_token():
    authority = f"https://login.microsoftonline.com/{TENANT_ID}"
    app = msal.ConfidentialClientApplication(
        CLIENT_ID, authority=authority, client_credential=CLIENT_SECRET
    )
    scopes = ["https://graph.microsoft.com/.default"]
    result = app.acquire_token_for_client(scopes=scopes)
    if "access_token" in result:
        return result["access_token"]
    else:
        raise Exception(f"获取令牌失败: {result.get('error_description')}")

# 获取通讯组ID
def get_group_id(token):
    url = f"https://graph.microsoft.com/v1.0/groups?$filter=displayName eq '{GROUP_DISPLAY_NAME}'"
    headers = {"Authorization": f"Bearer {token}"}
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    groups = response.json().get("value", [])
    if not groups:
        raise Exception(f"未找到显示名称为 {GROUP_DISPLAY_NAME} 的通讯组")
    return groups[0]["id"]

# 获取通讯组成员的邮箱列表
def get_group_members(token, group_id):
    members = []
    url = f"https://graph.microsoft.com/v1.0/groups/{group_id}/members"
    headers = {"Authorization": f"Bearer {token}"}
    while url:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        data = response.json()
        # 提取成员邮箱(处理用户和联系人类型)
        for member in data.get("value", []):
            if "mail" in member:
                members.append(member["mail"])
        # 处理分页
        url = data.get("@odata.nextLink")
    return members

if __name__ == "__main__":
    try:
        token = get_access_token()
        group_id = get_group_id(token)
        member_emails = get_group_members(token, group_id)
        print("通讯组成员邮箱列表:")
        for email in member_emails:
            print(email)
        # 这里可以将member_emails传入你的SendGrid发送逻辑
    except Exception as e:
        print(f"错误: {e}")

关键说明

  • 权限选择:使用Group.Read.All应用权限,确保脚本可以在后台无用户交互的情况下运行(适合Linux虚拟机的定时任务场景)。
  • 分页处理:如果通讯组成员超过100个,Graph API会返回分页链接,代码中已经处理了这种情况。
  • 成员类型兼容:代码会提取用户和联系人对象的mail字段,适配Outlook通讯组中可能包含的不同类型成员。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:57:40