Отправка вложений через API веб-служб Exchange - PullRequest
0 голосов
/ 26 октября 2018

В настоящее время я работаю над интеграцией нашей системы с 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, который использует те же учетные данные. Если я закомментирую вложения, создание и отправка черновика работает отлично, никаких проблем с авторизацией. Но как только вложенияЯ проверил журналы и ничего не смог понять. Все, что я прочитал, - это несколько неудачных попыток авторизации.

Я сейчас чувствую себя беспомощным, потому что я просматривал Интернет повсюду,Я все проверил, сто раз отладил, проверял каждую строку кода и не могу понятьт, что происходит.

...