我有一个使用 Flask 构建的网络应用程序。
现在,我有一个需求,需要我扩展通讯组列表。我遇到了 Exchangelib 库并尝试使用它。
我可以毫无问题地进行配置。 我正在使用 OAuth2。 我还在 Azure 上注册了一个应用程序。
exchangelib 配置是:
from exchangelib import OAuth2Credentials,Version,Build,Configuration,Account,Credentials,IMPERSONATION,OAUTH2
from exchangelib.version import EXCHANGE_O365
username = '<primary_smtp_email_id>'
tenant_id = app.config['APP_TENANT_ID']
client_id = app.config['APP_CLIENT_ID']
secret_value = app.config['APP_CLIENT_SECRET']
version=Version(build=EXCHANGE_O365)
credentials = OAuth2Credentials(client_id=client_id, client_secret=secret_value, tenant_id=tenant_id)
config = Configuration(service_endpoint = 'https://outlook.office365.com/EWS/Exchange.asmx',
credentials=credentials,
auth_type=OAUTH2 ,
version=version)
account = Account(username, credentials=credentials, autodiscover=False, config=config, access_type=IMPERSONATION)
以及扩展 DL 的代码:
def print_expanded_dl(dl):
for mailbox in account.protocol.expand_dl(dl):
print(mailbox.email_address)
但是,当我调用 print_expanded_dl 函数时出现错误。 我遇到的错误是:
exchangelib.errors.ErrorInvalidExchangeImpersonationHeaderData: ExchangeImpersonation SOAP header must be present for this type of OAuth token.
请帮忙,因为我搜索了类似的案例,发现配置中的access_type需要设置为IMPERSONATION。我已经做到了。 此外,Azure 上的应用程序具有以下权限:
此外,如果有任何其他方法可以使用其他库扩展分发列表,请随时提出相同的建议。谢谢你。
您还需要在
identity
实例上设置 Credentials
属性,如 https://ecederstrand.github.io/exchangelib/#oauth-authentication 中所述