【问题标题】:exchangelib - All steps in the autodiscover protocol failedexchangelib - 自动发现协议中的所有步骤均失败
【发布时间】:2018-03-13 11:55:17
【问题描述】:

我在 python 中使用 exchangelib 时遇到问题。我试试这个示例代码:

from exchangelib import DELEGATE, Account, Credentials

creds = Credentials(
    username='xxxx\\username', 
    password="mypassword"
)

account = Account(
    primary_smtp_address='surname.name@xxxx.fr',
    credentials=creds, 
    autodiscover=True, 
    access_type=DELEGATE
)

# Print first 10 inbox messages in reverse order
for item in account.inbox.all().order_by('-datetime_received')[:10]:
    print(item.subject, item.body, item.attachments)

我尝试了不同的用户名,但没有任何效果,而且我总是收到相同的错误消息:

AutoDiscoverFailed: All steps in the autodiscover protocol failed

顺便说一句,以防万一它有帮助,我尝试使用为 C# 编码的 Exchange Web 服务,它在这个凭据下工作得非常好,我可以发送邮件:

static void Main(string[] args)
{
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
    // The last parameter is the domain name
    service.Credentials = new WebCredentials("username", "password", "xxxx.lan");
    service.AutodiscoverUrl("surname.name@xxxx.fr", RedirectionUrlValidationCallback);
    EmailMessage email = new EmailMessage(service);
    email.ToRecipients.Add("surname.name@xxxx.fr");
    email.Subject = "salut ";
    email.Body = new MessageBody("corps du message");
    email.Send();
}

private static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
    // The default for the validation callback is to reject the URL.
    bool result = false;

    Uri redirectionUri = new Uri(redirectionUrl);

    /* Validate the contents of the redirection URL. In this simple validation
       callback, the redirection URL is considered valid if it is using HTTPS
       to encrypt the authentication credentials. */
    if (redirectionUri.Scheme == "https")
    {
        result = true;
    }
    return result;
}

提前致谢!

【问题讨论】:

  • 自动发现协商过程中的某个地方 exchangelib 未能选择正确的服务器。不幸的是,自动发现非常复杂和脆弱,因此有很多事情可能会出错。您可以在 exchangelib 中打开 DEBUG info 并将输出中的步骤与来自 testconnectivity.microsoft.com 的报告进行比较,如果您发现它做错了什么,请随时针对 exchangelib 打开一个问题。
  • 如果您透露了“xxxx.fr”背后的实际域名,您甚至可以找人为您调试。查找正确服务器的算法不需要凭据。

标签: python office365 exchange-server exchangewebservices exchangelib


【解决方案1】:

这个配置我终于成功了:

from exchangelib import DELEGATE, Account, Credentials, Configuration

creds = Credentials(
    username="domain_name\\username", 
    password="password"
)

config = Configuration(server='mail.solutec.fr', credentials=creds)

account = Account(
    primary_smtp_address="my email address",
    autodiscover=False, 
    config=config,
    access_type=DELEGATE
)

对于那些有同样问题的人,您可以通过右键单击“计算机”和“属性”来找到您的域名。 例如,用户名和密码是用于连接公司邮箱的用户名和密码。对于 Configuration 中的服务器,对我来说,这个是有效的:“mail.solutec.fr”,其中 solutec 是我公司的名称,fr 代表法国。

看起来这个自动发现的家伙真的不喜欢我^^

感谢您的帮助,祝您有美好的一天!

【讨论】:

  • requests.exceptions.SSLError: HTTPSConnectionPool(host='xyz', port=443): url: /EWS/Exchange.asmx 超过最大重试次数(由 SSLError(SSLError("糟糕的握手:错误([('SSL 例程', 'ssl3_get_server_certificate', '证书验证失败')])")))
  • @snakecharmerb:感谢您的关注,它现在正在运行,我会尽快分享最新的代码。导致这一切工作的代码 sn-p 是 - BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
  • 我无法为我的用例找到特定的服务器。你能告诉我你是如何确定使用 mail.solutec.fr 的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多