Python使用exchangelib库通过Exchange发送邮件及版本兼容问题解决
本文详解如何使用Python的exchangelib库向Microsoft Exchange服务器发送邮件,涵盖代码编写、参数配置及常见报错处理。重点解决因本地与服务器exchangelib版本不一致导致的AutoDiscoverFailed错误,提供降级安装方案。此外,还介绍了利用PyQt4打包UI及使用PyInstaller生成独立exe文件的完整流程与常用命令参数。
Python hasattr函数基础用法
Python内置的hasattr()函数
功能说明
该函数用于检测指定对象是否拥有指定的属性。
函数定义
调用格式如下:
hasattr(object, name)
参数说明
- object:待检测的目标对象。
- name:表示属性名称的字符串。
返回值说明
若对象存在该属性则返回True,反之返回False。
示例演示
以下代码展示了hasattr函数的具体用法:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Coordinate:
x = 10
y = -5
z = 0
point1 = Coordinate()
print(hasattr(point1, 'x'))
print(hasattr(point1, 'y'))
print(hasattr(point1, 'z'))
print(hasattr(point1, 'no')) # 没有该属性
运行输出结果如下:
True True True False
PyQt4 UI打包与PyInstaller应用
UI文件打包命令
执行路径:C:\Python27\Lib\site-packages\PyQt4>pyuic4 E:\pyDemo\proTools.ui -o proTools.py
Qt框架采用面向对象设计,逻辑清晰且易于上手。所有添加的界面组件均被视为对象,并具备独立的方法,例如toPlainText()用于获取输入框内容。这种设计使得开发过程十分便捷。
应用程序打包命令:C:\Python27\Scripts>python pyinstaller-script.py -w E:\pyDemo\PyQt\testPyQt.py testPyQt.spec
-F参数:生成包含控制台窗口的单个可执行文件。
-W参数:生成无控制台窗口的单个可执行文件。
-i参数:指定应用程序图标。
示例命令:pyinstaller -i D:\ALIX_SH\2carReport\yx.ico -W D:\ALIX_SH\2carReport\upload2carReport.py
-F -w组合参数:生成不带黑窗口的单个exe文件。
示例命令:pyinstaller -i D:\ALIX_SH\2carReport\yx.ico -F -w D:\ALIX_SH\2carReport\upload2carReport.py
接下来使用PyInstaller生成一个可执行文件进行测试。
在命令行中进入待打包代码所在的目录,直接输入命令“pyinstaller -F -w 文件名.py”(注意F需大写);执行后当前目录下会生成新的文件夹,其中包含打包好的exe文件。
- -F, -onefile:将程序打包为单个exe文件。
- -w, -windowed:使用窗口模式,不显示控制台。
- -c, -console:无窗口模式,显示控制台。
- -D, -onedir:创建一个目录,包含exe文件及依赖的其他文件。
- --icon=图标路径:指定exe文件的图标。
如需查看完整帮助信息,可运行“Pyinstaller -h”。
使用exchangelib发送Exchange邮件
Python发送邮件的核心代码如下:
只需将代码中加粗部分替换为实际信息,即可正常运行。
from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody
def Email(to, subject, body):
creds = Credentials(
username='xxxxxx',
password='xxxxxx'
)
account = Account(
primary_smtp_address='xxx@xxx.com',
credentials=creds,
autodiscover=True,
access_type=DELEGATE
)
m = Message(
account=account,
subject=subject,
body=HTMLBody(body),
to_recipients = [Mailbox(email_address=to)]
)
m.send()
Email("xxx@xxx.com", "abc", "def")
若Python环境配置存在瑕疵,可能会遇到如下报错:
$python3 ab.py
Traceback (most recent call last):
File "ab.py", line 22, in <module>
Email("xxx@xxx.com", "abc", "def")
File "ab.py", line 12, in Email
access_type=DELEGATE
File "/usr/local/lib/python3.5/site-packages/exchangelib/account.py", line 66, in __init__
credentials=credentials)
File "/usr/local/lib/python3.5/site-packages/exchangelib/autodiscover.py", line 214, in discover
email=email)
File "/usr/local/lib/python3.5/site-packages/exchangelib/autodiscover.py", line 236, in _try_autodiscover
return _try_autodiscover(e.server, credentials, email)
File "/usr/local/lib/python3.5/site-packages/exchangelib/autodiscover.py", line 262, in _try_autodiscover
raise_from(AutoDiscoverFailed('All steps in the autodiscover protocol failed'), None)
File "/usr/local/lib/python3.5/site-packages/future/utils/__init__.py", line 398, in raise_from
exec(execstr, myglobals, mylocals)
File "<string>", line 1, in <module>
exchangelib.errors.AutoDiscoverFailed: All steps in the autodiscover protocol failed
幸运的是,我在另一台安装了Python 3.5.2的机器上执行上述代码,运行完全正常。
至此问题终于解决!记录时间:2017-12-11
版本不匹配报错与解决方案
问题根源在于Exchange客户端库版本不匹配。
本机环境信息:
pip3 search exchangelib exchangelib (1.10.6) - Client for Microsoft Exchange Web Services (EWS) INSTALLED: 1.9.4 LATEST: 1.10.6
服务器环境信息:
$pip3 search exchangelib exchangelib (1.10.6) - Client for Microsoft Exchange Web Services (EWS) INSTALLED: 1.10.4 LATEST: 1.10.6
解决方案是将服务器端的库版本降级至1.9.4,即可解决问题。
执行命令:pip3 install exchangelib==1.9.4
再次执行发送邮件操作,成功搞定!

1、首先下载并安装exchangelib库,命令为:pip install exchangelib
2、随后只需将下方代码中的信息修改为实际配置即可。
from exchangelib import Account, Message, Mailbox, HTMLBody, ServiceAccount
#忽略警告
import urllib3
urllib3.disable_warnings()
#报错处理:ConnectionError: HTTPConnectionPool(host='mail.xxx.com', port=443): Max retries exceeded with url:
# import socket
# socket.create_connection((host, port), timeout=10)
def Email(to, subject, body):
creds = ServiceAccount(username='域\名', password='密码')
account = Account('发送的邮箱', credentials=creds, autodiscover=True)
m = Message(account=account,subject=subject,body=HTMLBody(body),
to_recipients = [Mailbox(email_address=to)]
)
m.send()
Email("接收的邮箱", "邮件标题", "邮件内容")
安装exchangelib库
pip install exchangelib1
脚本代码内容
# coding=utf-8
#
# Created on 2018/2/
from exchangelib import DELEGATE, Account, Credentials, Configuration, NTLM, Message, Mailbox, HTMLBody
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter
#此句用来消除ssl证书错误,exchange使用自签证书需加上
BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter
# 输入你的域账号如example\leo
cred = Credentials(r'EXAMPLE\leo', '输入你的密码')
config = Configuration(server='输入邮箱服务器网页地址', credentials=cred, auth_type=NTLM)
a = Account(
primary_smtp_address='输入你要绑定的邮箱名(leo@example.com)', config=config, autodiscover=False, access_type=DELEGATE
)
# 此处为用来发送html格式邮件的文件路径
with open(r'C:\Users\leo\Desktop\1.html') as f:
msg = f.read().decode('utf-8')
m = Message(
account=a,
folder=a.sent,
subject=u'测试邮件',
body=HTMLBody(msg),
to_recipients=[Mailbox(email_address='输入你要绑定的邮箱名(leo@example.com)')]
)
m.send_and_save()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









