В настоящее время я работаю над интеграцией нашей системы с MS Exchange (я использую Microsoft Exchange Server 2013 15.00.1395.000), и у меня возникла странная проблема.А именно, я могу создать черновик электронной почты и отправить его (а также позвонить в другие службы), но по какой-то причине я не могу добавить вложение в электронную почту, потому что сервер не авторизует меня (я продолжаю получать 401 Anonymous Request Disallowed
).Все вызовы выполняются пользователем с ролью ApplicationImpersonation
, и вот моя функция Perl, которая готовит мои вызовы:
sub do_authorized_call($$$) {
my ($callparam1, $callparam2, $callparam3) = @_;
my $username = 'USERNAME';
my $password = 'PASSWORD';
my $proxy = 'exchange.asmx PATH';
my @ua_args = (keep_alive => 1);
my @credentials = ("SERVER ADDRESS WITH 443 PORT", "", $username, $password);
my $ua = LWP::UserAgent->new(@ua_args);
$ua->credentials(@credentials);
my $soap = SOAP::Lite
->uri(MESSAGES_URI)
->ns(MESSAGES_URI, 'm')
->endpoint($proxy)
->encodingStyle('') # .NET requirement
->on_action( sub { join '/', MESSAGES_URI } )
->proxy($proxy, @ua_args, credentials => \@credentials)
->on_fault(\&soapGetBad);
$soap->serializer()->register_ns(TYPES_URI, 't');
$soap->schema->useragent($ua);
$soap->transport()->proxy->conn_cache($ua->conn_cache);
return $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
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header>
<t:ExchangeImpersonation>
<t:ConnectingSID>
<t:SmtpAddress>USER_EMAIL</t:SmtpAddress>
</t:ConnectingSID>
</t:ExchangeImpersonation>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<CreateAttachment xmlns="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<ParentItemId ChangeKey="CQAAABYAAABp6uewA08qSL/Bt1DTe9bxAAAS2C7L" Id="AAMkAGM5N2Q4MGU2LTNlYTMtNDIzZi1iZTg4LTFlZmRmZTQ1NTQ4MQBGAAAAAADa5apTmZVLS4pW4o+BzNotBwBp6uewA08qSL/Bt1DTe9bxAAAAAAEPAABp6uewA08qSL/Bt1DTe9bxAAAS2C56AAA=" />
<Attachments>
<t:FileAttachment>
<t:Name>Attachment555.docx</t:Name>
<t:Content>ATTACHMENT CONTENT REMOVED FOR BREVITY</t:Content>
</t:FileAttachment>
</Attachments>
</CreateAttachment>
</soap:Body>
</soap:Envelope>
Если я отправлю точно такой же конверт в SoapUI и предоставлю имя пользователя и пароль для авторизации NTLM, все будет работать правильно.
И снова, как я сказал в начале, у меня есть 3 последовательных запроса: создать черновикдобавьте вложения (если необходимо) и отправьте черновик (все с использованием того же do_authorized_call
, который использует те же учетные данные. Если я закомментирую вложения, создание и отправка черновика работает отлично, никаких проблем с авторизацией. Но как только вложенияЯ проверил журналы и ничего не смог понять. Все, что я прочитал, - это несколько неудачных попыток авторизации.
Я сейчас чувствую себя беспомощным, потому что я просматривал Интернет повсюду,Я все проверил, сто раз отладил, проверял каждую строку кода и не могу понятьт, что происходит.