使用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服务器上的独立服务,端口不通用,这是连接被拒绝的核心原因。
具体问题排查与解决步骤
确认Exchange EWS服务的可用性
- 联系Exchange管理员,确认:
- EWS服务是否在目标服务器上启用
- EWS服务的访问端口(通常为443,少数情况会用自定义端口)
- 你的客户端IP是否被允许访问EWS服务(服务器防火墙可能拦截了请求)
- 587是SMTP服务的端口,EWS不会运行在这个端口上,不要尝试让exchangelib用587连接,这不符合服务设计。
- 联系Exchange管理员,确认:
修正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'])
- 如果管理员告知EWS使用非默认端口,在
尝试自动发现EWS配置
- 如果Exchange服务器支持自动发现,关闭手动配置,让exchangelib自动获取正确的EWS地址和端口:
account = Account( primary_smtp_address='<admin_email_address>', credentials=cred, autodiscover=True, access_type=DELEGATE )
- 如果Exchange服务器支持自动发现,关闭手动配置,让exchangelib自动获取正确的EWS地址和端口:
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

