Programmatic access to Exchange 2010 using EWS, SOAP, and Python

本文介绍如何利用Python和suds库通过EWS及SOAP访问Exchange 2010邮件服务器,包括设置认证、创建客户端和服务请求的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Programmatic access to Exchange 2010 using EWS, SOAP, and Python

I’ve previously blogged about accessing Exchange (2007) using suds and Python. Turns out that things have changed slightly in Exchange 2010, so here’s an update.

First, you’ll need to use Alex Koshelev’s EWS-specific fork of suds, which you can grab from BitBucket. Next, you’ll need code a little like this:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import urllib2
 
from suds.client import Client
from suds.sax.element import Element
from suds.transport.http import HttpTransport
 
class Transport(HttpTransport):
     def __init__( self , * * kwargs):
         realm, uri = kwargs.pop( 'realm' ), kwargs.pop( 'uri' )
         HttpTransport.__init__( self , * * kwargs)
         self .handler = urllib2.HTTPBasicAuthHandler()
         self .handler.add_password(realm = realm,
                                   user = self .options.username,
                                   passwd = self .options.password,
                                   uri = uri)
         self .urlopener = urllib2.build_opener( self .handler)
 
transport = Transport(realm = 'nexus.ox.ac.uk' ,
                       uri = 'https://nexus.ox.ac.uk/' ,
                       username = 'abcd0123' ,
                       password = 'secret' )
                 transport = transport)
 
soap_headers = Element( 'RequestServerVersion' , ns = ns)
soap_headers.attributes.append( 'Version="Exchange2010_SP1"' )
client.set_options(soapheaders = soap_headers)
 
address = client.factory.create( 't:EmailAddress' )
address.Address = 'first.last@unit.ox.ac.uk'
 
client.service.GetUserOofSettings(address)

Differences from the previous post are:

  • Passing SOAP headers seems to be necessary in some circumstances. This post on StackOverflow came in handy in working out what to do. The MSDN documentation (e.g. this page about GetRoomLists) tells you which SOAP headers you can send.
  • Namespaces seem to be working better. We’ve created a t:EmailAddress element this time, not a ns1:EmailAddress.
  • The patch mentioned in my previous blog post has been applied, so there’s now no need to apply it yourself.

<think>嗯,用户遇到了在MSYS2中编译Snort 2.9.11.1时出现“programmatic interface to dynamic link loader not found”的错误。我需要先理解这个错误的原因。动态链接加载器接口通常和libltdl库有关,也就是libtool的动态加载模块。所以可能的问题是没有安装libltdl或者开发包,或者编译时没有正确链接。 首先,我应该检查用户是否安装了libltdl。在MSYS2中,可以通过pacman安装。可能需要安装libtool包,因为libltdl是其中的一部分。另外,确保安装的是开发版本,比如mingw-w64-x86_64-libtool,这包含了头文件和库文件。 然后,编译时的配置参数可能需要调整。用户可能在运行configure脚本时没有正确指定库的路径,或者没有启用动态加载支持。例如,添加--with-libltdl-include和--with-libltdl-lib参数,指向正确的include和lib目录。MSYS2中,这些通常位于/mingw64/include和/mingw64/lib下。 另外,环境变量也可能影响编译过程。比如PKG_CONFIG_PATH是否正确设置,以便pkg-config能够找到libltdl的.pc文件。可能需要导出PKG_CONFIG_PATH=/mingw64/lib/pkgconfig。 还有可能用户之前编译过,但残留文件导致问题,所以建议先make clean或删除build目录重新配置。如果之前配置有缓存,可能需要清除config.cache。 如果这些步骤都做了还是不行,可能需要检查Snort的版本是否与MSYS2中的库兼容,或者是否需要打补丁。Snort 2.9.11.1可能比较旧,对新版本的库存在兼容性问题。可以尝试寻找社区是否有相关的补丁或编译指导。 此外,用户提供的引用中提到了使用dlltool转换库文件,但这里的问题可能不直接相关。不过,如果libltdl的静态库有问题,可能需要确保动态库正确安装。 总结步骤应该是:安装libltdl开发包,配置时指定正确的路径,设置环境变量,清理旧编译文件,必要时打补丁或降级库版本。另外,可能需要检查其他依赖库是否齐全,比如libpcap、libdnet等是否已正确安装。</think>### 分步解决方案 #### 问题定位 编译Snort时出现`programmatic interface to dynamic link loader not found`错误,通常与`libltdl`(Libtool动态加载模块)缺失或配置不当有关。该库提供程序化操作动态链接器的接口,是编译依赖动态加载功能的软件的必要组件[^1][^2]。 --- #### 步骤1:安装libltdl开发包 在MSYS2终端中执行以下命令安装依赖: ```bash pacman -Sy mingw-w64-x86_64-libtool ``` 此操作会安装`libltdl`的头文件(`.h`)和库文件(`.dll.a`),解决动态加载器接口缺失问题[^1][^5]。 --- #### 步骤2:配置时指定libltdl路径 在Snort的编译配置阶段,显式指定`libltdl`路径: ```bash ./configure \ --with-libltdl-include=/mingw64/include \ --with-libltdl-lib=/mingw64/lib \ LDFLAGS="-L/mingw64/lib" \ CPPFLAGS="-I/mingw64/include" ``` * `--with-libltdl-include`:指定头文件目录 * `--with-libltdl-lib`:指定库文件目录 * `LDFLAGS`/`CPPFLAGS`:确保编译器正确找到库和头文件[^2][^4] --- #### 步骤3:设置环境变量 临时设置`PKG_CONFIG_PATH`以增强库搜索能力: ```bash export PKG_CONFIG_PATH=/mingw64/lib/pkgconfig:$PKG_CONFIG_PATH ``` 此操作帮助`pkg-config`工具准确定位`libltdl.pc`文件,避免链接错误[^5]。 --- #### 步骤4:清理并重新编译 若之前编译失败残留文件,需清理后重新配置: ```bash make distclean rm -rf config.cache ./configure ... # 重复步骤2中的配置命令 make ``` --- #### 步骤5:验证其他依赖 Snort依赖的库如`libpcap`、`libdnet`等需一并安装: ```bash pacman -Sy mingw-w64-x86_64-libpcap mingw-w64-x86_64-libdnet ``` --- #### 特殊情况处理 若仍报错,可能是库版本冲突或代码兼容性问题: 1. **降级libtool**:尝试安装旧版本`libtool` 2. **应用补丁**:检查Snort官方或社区是否有针对MSYS2的编译补丁 3. **静态链接**:尝试在配置中添加`--enable-static`以静态链接`libltdl`[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值