Проблема с Indy IMAP и Outlook365 при сохранении в папку черновиков с вложениями - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь создать письмо в папке черновиков в Outlook / Office 365. Проблема в том, что сервер продолжает сбрасывать соединение. Иногда код работает, в других случаях он вызывает исключение либо с сообщением «10054: сброс соединения по одноранговому узлу», либо «10053: программное обеспечение вызвало прерывание соединения».

Кажется, что ошибки зависят от размера вложения. Больше, чем 500 КБ, почти всегда ошибка, менее 100 КБ, как правило, хорошо. Файл размером около 500 КБ - это примерно 50:50, независимо от того, удастся ли это или нет. Я вполне уверен, что это не содержимое вложения, так как один и тот же файл иногда будет работать, иногда не удастся, но его размер определяет вероятность сбоя. Если это удастся, то все выглядит нормально на сервере.

Кажется, что код хорошо работает на Gmail, у него просто проблемы в Outlook / Office 365 (и Hotmail). Я использую последние openssl библиотеки от Fulgan.

Кто-нибудь может посоветовать?

bool SendToOutlook365Drafts()
{
    TIdMessage *Message = new TIdMessage(NULL);

    TIdMessageBuilderHtml *Builder = new TIdMessageBuilderHtml;
    Builder->PlainText->Text = "plain text goes here";
    Builder->Html->Text = "HTML goes here";
    Builder->Attachments->Add("S:\\test.zip");
    Builder->FillMessage(Message);
    Message->Flags << mfDraft;
    Message->From->Text = IMAPUsername;

    TIdSSLIOHandlerSocketOpenSSL *SSLHandler = new TIdSSLIOHandlerSocketOpenSSL(NULL);
    SSLHandler->SSLOptions->Method = sslvTLSv1_2;
    SSLHandler->SSLOptions->SSLVersions << sslvTLSv1_2;
    SSLHandler->SSLOptions->SSLVersions << sslvTLSv1_1;
    SSLHandler->SSLOptions->SSLVersions << sslvTLSv1; // Allow all TLS methods
    SSLHandler->SSLOptions->SSLVersions << sslvSSLv3;
    SSLHandler->SSLOptions->SSLVersions << sslvSSLv23;
    SSLHandler->SSLOptions->SSLVersions << sslvSSLv2; // Allow all SSL methods
    SSLHandler->SSLOptions->Mode = sslmUnassigned;

    TIdIMAP4 *IMAPClient = new TIdIMAP4(NULL);
    IMAPClient->IOHandler = SSLHandler;
    IMAPClient->Host = IMAPAddress;                  // outlook.office365.com
    IMAPClient->Port = IMAPPort;                     // 993
    IMAPClient->Username = IMAPUsername;
    IMAPClient->Password = IMAPPassword;
    IMAPClient->UseTLS = utUseImplicitTLS;

    try{
        IMAPClient->Connect(10000);

        IMAPClient->AppendMsg("Drafts", Message, Message->Flags);   // exception thrown here. Either "10054:Connection reset by peer" or "10053:Software caused connection abort"
        IMAPClient->Disconnect();
        delete IMAPClient;
        delete SSLHandler;
        delete Message;
        return true;
    }
    catch(Exception &exception)
    {
        IMAPClient->Disconnect();
        ErrorDialog(exception.Message);
        delete IMAPClient;
        delete SSLHandler;
        delete Message;
        return false;
    }
}

Редактировать: Вывод из журнала IMAP ниже: -

Stat Connected.
Recv 02/10/2019 20:25:24: * OK The Microsoft Exchange IMAP4 service is ready. [TABOAFgAUAAyADYANQBDAEEAMAAwADkAMwAuAEcAQgBSAFAAMgA2ADUALgBQAFIATwBEAC4ATwBVAFQATABPAE8ASwAuAEMATwBNAA==]<EOL>
Sent 02/10/2019 20:25:24: C1 LOGIN des@+++++.onmicrosoft.com "+++++++++"<EOL>
Recv 02/10/2019 20:25:24: C1 OK LOGIN completed.<EOL>
Sent 02/10/2019 20:25:24: C2 CAPABILITY<EOL>
Recv 02/10/2019 20:25:24: * CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CLIENTACCESSRULES CLIENTNETWORKPRESENCELOCATION BACKENDAUTHENTICATE CHILDREN IDLE NAMESPACE LITERAL+<EOL>C2 OK CAPABILITY completed.<EOL>
Sent 02/10/2019 20:25:25: C3 APPEND "Drafts" (\Draft) {816681+}<EOL>
Sent 02/10/2019 20:25:25: From: "des@+++++.onmicrosoft.com" <des@+++++.onmicrosoft.com><EOL>Content-Type: multipart/mixed; boundary="AB7sooOH0c7ZwPjBXeilIv=_zBKjZ16keW"<EOL>MIME-Version: 1.0<EOL>Date: Wed, 2 Oct 2019 20:25:24 +0100<EOL><EOL>
Sent 02/10/2019 20:25:25: This is a multi-part message in MIME format<EOL><EOL>--AB7sooOH0c7ZwPjBXeilIv=_zBKjZ16keW<EOL>Content-Type: multipart/alternative;<EOL>   boundary="UvatywYlNKXglQCy=_QgJ3A4j1k29J4UFf"<EOL><EOL>--UvatywYlNKXglQCy=_QgJ3A4j1k29J4UFf<EOL>Content-Type: text/plain<EOL>Content-Transfer-Encoding: quoted-printable<EOL>Content-Disposition: inline<EOL><EOL>plain text goes here<EOL><EOL>--UvatywYlNKXglQCy=_QgJ3A4j1k29J4UFf<EOL>Content-Type: text/html<EOL>Content-Transfer-Encoding: quoted-printable<EOL>Content-Disposition: inline<EOL><EOL>HTML goes here<EOL><EOL>--UvatywYlNKXglQCy=_QgJ3A4j1k29J4UFf--<EOL><EOL>--AB7sooOH0c7ZwPjBXeilIv=_zBKjZ16keW<EOL>Content-Type: application/zip;<EOL>  name="test.zip"<EOL>Content-Transfer-Encoding: base64<EOL>Content-Disposition: attachment;<EOL> filename="test.zip"<EOL><EOL>LyoqKioqKioqKioqKioqKioqICBTVEFOREFSRCBGSUxFIEhFQURFUiAtIFNUQVJUICoqKioqKioq<EOL>KioqKioqKioqKioqKioqKi8NCi8vI3ByYWdtYSBoZHJmaWxlICJ3aW5wcm9wWC5jc20iDQojaW5j<EOL>bHVkZSAic3RkX2hlYWQuaW5jIg0KI3By
--- binary data edited out here, but is incomplete ----
Stat Disconnected.
Stat Disconnected.
Stat Disconnected.
...