如何使用Python exchangelib获取Exchange服务器的所有邮箱?
如何用 exchangelib 获取 Exchange 服务器的所有邮箱
可以用 exchangelib 实现,前提是你的账号拥有Exchange管理员权限(普通账号只能访问自己有权限查看的邮箱,无法获取全部),具体实现方式如下:
1. 先连接到 Exchange 服务器
from exchangelib import Credentials, Account # 替换为你的管理员账号和密码 credentials = Credentials(username='admin@yourdomain.com', password='your_admin_password') # 初始化账号连接,autodiscover会自动查找Exchange服务器地址 account = Account( primary_smtp_address='admin@yourdomain.com', credentials=credentials, autodiscover=True, access_type='delegate' # 如果使用模拟权限,可改为'impersonation' )
2. 获取所有邮箱的两种方法
方法一:遍历全局地址列表(GAL)
全局地址列表包含了Exchange服务器上的所有邮箱用户,直接遍历即可:
# 获取全局地址列表实例 gal = account.protocol.get_global_address_list() # 遍历所有邮箱条目,提取关键信息 for entry in gal.all(): if hasattr(entry, 'primary_smtp_address'): print(f"邮箱地址: {entry.primary_smtp_address}, 用户姓名: {entry.name}")
方法二:直接查询邮箱根文件夹(需更高权限)
如果你的账号拥有Exchange完全管理权限,可以直接查询所有邮箱的根文件夹,从而获取邮箱信息:
from exchangelib import FolderQuerySet # 查询所有邮箱的根文件夹 mailbox_roots = FolderQuerySet(account=account).filter(is_root=True).all() # 提取邮箱地址和名称 for root in mailbox_roots: print(f"邮箱地址: {root.mailbox.email_address}, 显示名称: {root.mailbox.name}")
注意事项
- 权限限制:普通账号只能看到GAL中自己有权限访问的条目,只有管理员账号才能获取全部邮箱。
- 性能优化:如果服务器上邮箱数量较多,建议使用分页查询(比如
gal.all().page(page_size=100)),避免一次性加载过多数据导致性能问题。 - Exchange Online适配:如果是Office 365(Exchange Online),建议使用OAuth2认证替代用户名密码,避免密码泄露风险。
内容的提问来源于stack exchange,提问作者grasdy
相关产品推荐
相关产品推荐

