Python 连接到 Exchange /w Windows 验证
Python Connect To Exchange /w Windows Auth
我正在尝试在 Python 3.8 脚本中创建一个脚本,该脚本可以连接到 Exchange 服务器并检索电子邮件从一个邮箱。我正在尝试使用当前经过身份验证的用户通过 Exchange 进行身份验证。如果我使用用户名和密码,我可以很好地进行身份验证。 (试图不存储任何密码或任何东西,只使用当前经过身份验证的用户。)
我正在使用 Python 3.8 和 Exchangelib 连接 Exchange 但是无法弄清楚如何使用 Windows Auth(如果可能)。
感谢任何帮助实现这一点的人。
谢谢
我正在尝试做的事情的例子:
from exchangelib import DELEGATE, IMPERSONATION, Account, Credentials, OAuth2Credentials, \
OAuth2AuthorizationCodeCredentials, FaultTolerance, Configuration, NTLM, GSSAPI, SSPI, \
OAUTH2, Build, Version
from exchangelib.autodiscover import AutodiscoverProtocol
exchange_email = 'mailboxIWantToAccess@domain.com'
account = Account(exchange_email, autodiscover=True)
# account = Account(exchange_email, credentials=credentials, autodiscover=True)
account.root.refresh()
account.public_folders_root.refresh()
print(account.root.tree())
我得到的错误:
Traceback (most recent call last):
File "c:/Users/jk354/Documents/git.ourgitserver.com/client-info/script-ex.py", line 233, in <module>
account = Account(exchange_email, autodiscover=True)
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\account.py", line 85, in __init__
self.ad_response, self.protocol = discover(
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\autodiscover\discovery.py", line 23, in discover
return Autodiscovery(
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\autodiscover\discovery.py", line 88, in discover
ad_protocol = autodiscover_cache[cache_key]
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\autodiscover\cache.py", line 97, in __getitem__
protocol = AutodiscoverProtocol(config=Configuration(
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\protocol.py", line 73, in __init__
self._session_pool = self._create_session_pool()
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\protocol.py", line 160, in _create_session_pool
session_pool.put(self.create_session(), block=False)
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\protocol.py", line 233, in create_session
with self.credentials.lock:
AttributeError: 'NoneType' object has no attribute 'lock'
我在 Windows/Exchangeserver 环境中使用 exchangelib,这是我的登录代码:
import getpass
from exchangelib import Configuration
from exchangelib import Credentials, Account
def login():
email = 'user@domain.com'
passwd = getpass.getpass(prompt='Password: ')
user_credentials = Credentials(email, passwd)
config = Configuration(server='exchangeserver',
credentials=user_credentials)
account = Account(primary_smtp_address=email, config=config,
credentials=user_credentials, autodiscover=False) #maybe try =True
return account
def main():
user_account = authenticate()
print(user_account.root.tree()) #printing the inbox
main()
input('Press enter to exit')
说完就改用 C#。
我正在使用 EWS Managed API.
我可以通过以下行使用当前经过身份验证的用户连接到 Exchange:
service.UseDefaultCredentials = true;
我终于可以使用 kerberos 示例了
from requests_kerberos import HTTPKerberosAuth
from exchangelib import DELEGATE, Account, Credentials, Configuration
import exchangelib.autodiscover
def auth_model(**kwargs):
#get kerberos ticket
return HTTPKerberosAuth()
def connect(server, email, username, password=1):
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
# Care! Ignor Exchange self-signed SSL cert
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
# fill Credential object with empty fields
creds = Credentials(
username="",
password=""
)
# add kerberos as GSSAPI auth_type
exchangelib.transport.AUTH_TYPE_MAP["GSSAPI"] = auth_model
# Create Config
config = Configuration(server=server,credentials=creds, auth_type="GSSAPI")
# return result
return Account(primary_smtp_address=email, autodiscover=False, config = config, access_type=DELEGATE)
def main():
# Connection details
server = 'mail.domain.ex'
email = 'person@domain.ex'
username = 'domain\person'
account = connect(server, email, username)
for item in account.inbox.all().order_by('-datetime_received')[:100]:
print(item.subject, item.sender, item.datetime_received)
main()
我正在尝试在 Python 3.8 脚本中创建一个脚本,该脚本可以连接到 Exchange 服务器并检索电子邮件从一个邮箱。我正在尝试使用当前经过身份验证的用户通过 Exchange 进行身份验证。如果我使用用户名和密码,我可以很好地进行身份验证。 (试图不存储任何密码或任何东西,只使用当前经过身份验证的用户。)
我正在使用 Python 3.8 和 Exchangelib 连接 Exchange 但是无法弄清楚如何使用 Windows Auth(如果可能)。
感谢任何帮助实现这一点的人。
谢谢
我正在尝试做的事情的例子:
from exchangelib import DELEGATE, IMPERSONATION, Account, Credentials, OAuth2Credentials, \
OAuth2AuthorizationCodeCredentials, FaultTolerance, Configuration, NTLM, GSSAPI, SSPI, \
OAUTH2, Build, Version
from exchangelib.autodiscover import AutodiscoverProtocol
exchange_email = 'mailboxIWantToAccess@domain.com'
account = Account(exchange_email, autodiscover=True)
# account = Account(exchange_email, credentials=credentials, autodiscover=True)
account.root.refresh()
account.public_folders_root.refresh()
print(account.root.tree())
我得到的错误:
Traceback (most recent call last):
File "c:/Users/jk354/Documents/git.ourgitserver.com/client-info/script-ex.py", line 233, in <module>
account = Account(exchange_email, autodiscover=True)
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\account.py", line 85, in __init__
self.ad_response, self.protocol = discover(
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\autodiscover\discovery.py", line 23, in discover
return Autodiscovery(
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\autodiscover\discovery.py", line 88, in discover
ad_protocol = autodiscover_cache[cache_key]
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\autodiscover\cache.py", line 97, in __getitem__
protocol = AutodiscoverProtocol(config=Configuration(
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\protocol.py", line 73, in __init__
self._session_pool = self._create_session_pool()
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\protocol.py", line 160, in _create_session_pool
session_pool.put(self.create_session(), block=False)
File "C:\Users\jk354\AppData\Local\Programs\Python\Python38-32\lib\site-packages\exchangelib\protocol.py", line 233, in create_session
with self.credentials.lock:
AttributeError: 'NoneType' object has no attribute 'lock'
我在 Windows/Exchangeserver 环境中使用 exchangelib,这是我的登录代码:
import getpass
from exchangelib import Configuration
from exchangelib import Credentials, Account
def login():
email = 'user@domain.com'
passwd = getpass.getpass(prompt='Password: ')
user_credentials = Credentials(email, passwd)
config = Configuration(server='exchangeserver',
credentials=user_credentials)
account = Account(primary_smtp_address=email, config=config,
credentials=user_credentials, autodiscover=False) #maybe try =True
return account
def main():
user_account = authenticate()
print(user_account.root.tree()) #printing the inbox
main()
input('Press enter to exit')
说完就改用 C#。 我正在使用 EWS Managed API.
我可以通过以下行使用当前经过身份验证的用户连接到 Exchange:
service.UseDefaultCredentials = true;
我终于可以使用 kerberos 示例了
from requests_kerberos import HTTPKerberosAuth
from exchangelib import DELEGATE, Account, Credentials, Configuration
import exchangelib.autodiscover
def auth_model(**kwargs):
#get kerberos ticket
return HTTPKerberosAuth()
def connect(server, email, username, password=1):
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
# Care! Ignor Exchange self-signed SSL cert
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
# fill Credential object with empty fields
creds = Credentials(
username="",
password=""
)
# add kerberos as GSSAPI auth_type
exchangelib.transport.AUTH_TYPE_MAP["GSSAPI"] = auth_model
# Create Config
config = Configuration(server=server,credentials=creds, auth_type="GSSAPI")
# return result
return Account(primary_smtp_address=email, autodiscover=False, config = config, access_type=DELEGATE)
def main():
# Connection details
server = 'mail.domain.ex'
email = 'person@domain.ex'
username = 'domain\person'
account = connect(server, email, username)
for item in account.inbox.all().order_by('-datetime_received')[:100]:
print(item.subject, item.sender, item.datetime_received)
main()