Perl 通过Exchange Web服务API发送附件

Perl 通过Exchange Web服务API发送附件,perl,soap,exchange-server,exchangewebservices,ntlm,Perl,Soap,Exchange Server,Exchangewebservices,Ntlm,我目前正在努力将我们的系统与MS Exchange集成(我使用的是Microsoft Exchange Server 2013 15.00.1395.000),我遇到了一个奇怪的问题。也就是说,我可以创建电子邮件草稿并发送它(也可以呼叫其他服务),但由于某些原因,我无法在电子邮件中添加附件,因为服务器不会授权我(我不断收到401匿名请求,但被拒绝了)。 所有调用都由具有ApplicationImpersonation角色的用户进行,下面是准备调用的Perl函数: sub do\u authori

我目前正在努力将我们的系统与MS Exchange集成(我使用的是Microsoft Exchange Server 2013 15.00.1395.000),我遇到了一个奇怪的问题。也就是说,我可以创建电子邮件草稿并发送它(也可以呼叫其他服务),但由于某些原因,我无法在电子邮件中添加附件,因为服务器不会授权我(我不断收到
401匿名请求,但被拒绝了
)。 所有调用都由具有
ApplicationImpersonation
角色的用户进行,下面是准备调用的Perl函数:

sub do\u authorized\u call($$){
my($callparam1,$callparam2,$callparam3)=@;
我的$username='username';
我的$password='password';
my$proxy='exchange.asmx PATH';
my@ua_args=(keep_alive=>1);
my@credentials=(“带有443端口的服务器地址,”“,$username,$password);
my$ua=LWP::UserAgent->new(@ua\u args);
$ua->凭证(@凭证);
my$soap=soap::Lite
->uri(消息和uri)
->ns(消息_URI,'m')
->端点($proxy)
->编码样式(“”)#.NET要求
->关于动作(子{join'/',消息{u URI})
->代理($proxy,@ua\u args,credentials=>\@credentials)
->关于故障(\&soapGetBad);
$soap->serializer()->寄存器(类型URI,'t');
$soap->schema->useragent($ua);
$soap->transport()->proxy->conn\u缓存($ua->conn\u缓存);
返回$soap->call($callparam1、$callparam2、$callparam3);
此函数生成的CreateAttachment请求如下所示:

POST <EWS ADDRESS> HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Authorization: NTLM TlRMTVNTUAABAAAAB7IAAAoACgAgAAAAAgACACoAAABBcHBJbXBfU1ZDQ1c=
User-Agent: SOAP::Lite/Perl/1.27
Content-Length: 52759
Content-Type: text/xml; charset=utf-8
SOAPAction: http://schemas.microsoft.com/exchange/services/2006/messages
POST HTTP/1.1
接受:text/xml
接受:多部分/*
接受:应用程序/soap
授权:NTLM TLRMTVNTUAABAAB7IAAAOACGAGAAAAGACACACAAABBCHBJBXBFU1ZDQ1C=
用户代理:SOAP::Lite/Perl/1.27
内容长度:52759
内容类型:text/xml;字符集=utf-8
SOAPAction:http://schemas.microsoft.com/exchange/services/2006/messages

用户电子邮件
附件555.docx
为简洁起见,删除了附件内容
若我在SoapUI中发送完全相同的信封,并提供用户名和密码作为NTLM授权,那个么一切都正常工作

同样,正如我在开始时所说,我有3个按顺序的请求:创建草稿、添加附件(如果需要)和发送草稿(所有这些都使用相同的
do_authorized_call
,并且使用相同的凭据。如果我对附件进行注释,草稿的创建和发送工作会很好,授权没有问题。但是一旦涉及附件,所有操作都会失败。我检查了日志,无法找出任何结果。我看到的只是几次授权失败诱惑


我现在感到很无助,因为我浏览了互联网的各个角落,我检查了所有东西,调试了数百次,验证了每一行代码,却不知道发生了什么。

没有太多关于Exchange web服务的非Microsoft语言实现的资源。特别是Perl。我已经了解了n我需要的一切都在本地使用和扩展。但我相信它没有内置您需要的功能。为了使调试更容易,请查看LWP::ConsoleLogger::Everywhere,我在调试EWS API时将其提交给LWP::ConsoleLogger。@simbabque它与
SOAP::Lite+trace=>all有什么不同
这已经为我提供了完整的信封和请求头?可能没有太大区别。它处理请求和响应。但是,我使用的Web服务的实现基于XML::Compile::SOAP,而不是SOAP::Lite,因此没有提供简单的额外调试选项。密码不正确时会出现相同的身份验证错误吗?是吗所有3个请求都不一样?可能需要添加附件。您确定要将附件添加到正确的草稿中吗?