You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的exchangelib库时遇到端口连接问题

问题描述

用Flask搭建了一个Web应用,此前使用Flask-Mail实现邮件发送功能,运行正常。现因需求需要扩展通讯组列表,尝试使用exchangelib库,但无法建立连接。

遇到的错误信息如下:

exchangelib.errors.TransportError: HTTPSConnectionPool(host='<mail_server_name>', port=443):
 Max retries exceeded with url: /EWS/Exchange.asmx (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001B71F194040>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it'))

此前使用的Flask-Mail配置如下:

MAIL_SERVER='<mail_server_name>'
MAIL_PORT=587
MAIL_USERNAME='<user-name provided by exchange admin>'
MAIL_PASSWORD='<password>'
MAIL_USE_TLS=True
MAIL_USE_SSL=False

该配置已保存至config.cfg文件并加载,尝试使用相同配置连接exchangelib,代码如下:

app = Flask(__name__,template_folder = 'Templates',static_folder='Static') 
app.config.from_pyfile('config.cfg')

cred = Credentials(username=app.config['MAIL_USERNAME'],password=app.config['MAIL_PASSWORD'])
config = Configuration(server=app.config['MAIL_SERVER'], credentials=cred)
account = Account(primary_smtp_address='<admin_email_address>', config=config, autodiscover=False, access_type=DELEGATE)

请问问题出在哪里?注意到错误信息中使用的端口是443,而Flask-Mail使用的是587端口,这是否是目标机器拒绝连接的原因?如果是,如何让exchangelib使用587端口连接?


问题分析与解决

核心原因:两种库依赖的服务完全不同

Flask-Mail基于SMTP协议(587是SMTP的TLS端口),仅用于发送邮件;而exchangelib是连接Exchange的EWS(Exchange Web Services),用于访问Exchange的通讯录、邮件、日历等全量功能,EWS默认使用443端口(HTTPS)。两者是Exchange服务器上的独立服务,端口不通用,这是连接被拒绝的核心原因。

具体问题排查与解决步骤

  1. 确认Exchange EWS服务的可用性

    • 联系Exchange管理员,确认:
      • EWS服务是否在目标服务器上启用
      • EWS服务的访问端口(通常为443,少数情况会用自定义端口)
      • 你的客户端IP是否被允许访问EWS服务(服务器防火墙可能拦截了请求)
    • 587是SMTP服务的端口,EWS不会运行在这个端口上,不要尝试让exchangelib用587连接,这不符合服务设计。
  2. 修正exchangelib的配置参数

    • 如果管理员告知EWS使用非默认端口,在Configuration中指定端口:
      config = Configuration(
          server=app.config['MAIL_SERVER'], 
          credentials=cred,
          port=指定的EWS端口  # 比如管理员说用8443就填8443
      )
      
    • 检查账号格式:如果是域账号,用户名需要带上域名,格式为DOMAIN\username:
      cred = Credentials(username='DOMAIN\\' + app.config['MAIL_USERNAME'], password=app.config['MAIL_PASSWORD'])
      
  3. 尝试自动发现EWS配置

    • 如果Exchange服务器支持自动发现,关闭手动配置,让exchangelib自动获取正确的EWS地址和端口:
      account = Account(
          primary_smtp_address='<admin_email_address>', 
          credentials=cred, 
          autodiscover=True, 
          access_type=DELEGATE
      )
      

内容的提问来源于stack exchange,提问作者Vivek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:46:03