非Exchange环境下如何编程获取Microsoft Outlook通讯组成员
可以用Microsoft Graph API实现需求
完全可以通过Graph API来获取Outlook通讯组列表的成员,且完全适配Linux环境,无需依赖Exchange服务器或win32库。以下是具体实现方案:
前提准备
- Microsoft 365租户权限:需要你的律所拥有Microsoft 365租户,并且有管理员权限为应用授予API访问权限。
- 注册Azure AD应用:在Azure门户中注册一个应用程序,获取以下信息:
- 客户端ID(Client ID)
- 租户ID(Tenant ID)
- 客户端密钥(Client Secret)
- 配置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
相关产品推荐
相关产品推荐

