Подключение к Amazon Work Mail с помощью Delphi и Indy

У меня есть клиент IMAP4, который отлично работает при подключении к RackSpace, но клиент перемещается на рабочую почту Amazon.

Согласно опубликованным инструкциям Amazon:

Connect to your IMAP Client Application

You can connect any IMAP-compatible client software to Amazon WorkMail by providing the following information: 

Type of account IMAP 
Protocol IMAPS 
Port 993 
Secure connection Required;SSL 
Incoming username Email address associated with your Amazon WorkMail account 
Incoming password Your password 
Incoming server The endpoint matching the region where your mailbox is located: • us-east-1 imap.mail.us-east-1.awsapps.com

Единственная операция, которую я закодировал, это IMAPClient.Connect();

Возвращает статус "Подключено", но после этого программа зависает. Я проследил за потоком через источник компонента и обнаружил, что он ожидает возврата от Amazon в функции TIdIMAP4.GetResponse: string;. Он просто зависает там очень долго, а затем выдает исключение «Соединение изящно закрыто».

Делфи 10.2

Инди 10.6.2.5366

Что мне не хватает?

Мои настройки:

var
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;

with IMAPClient do
begin
  Name := 'IMAPClient';
  OnStatus := IMAPClientStatus;
  IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  OnDisconnected := IMAPClientDisconnected;
  OnConnected := IMAPClientConnected;
  Password := 'EmailTest1236';
  Port := 993;
  Username := '[email protected]';
  Host := 'imap.mail.us-east-1.awsapps.com';
  UseTLS := utUseRequireTLS;
  SASLMechanisms := <>;
  MilliSecsToWaitToClearBuffer := 10;
end;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(Self);

with IdSSLIOHandlerSocketOpenSSL1 do
begin
  Name := 'IdSSLIOHandlerSocketOpenSSL1';
  OnStatus := IdSSLIOHandlerSocketOpenSSL1Status;
  Destination := 'imap.mail.us-east-1.awsapps.com:993';
  Host := 'imap.mail.us-east-1.awsapps.com';
  MaxLineAction := maException;
  Port := 993;
  BoundPort := 993;
  DefaultPort := 0;
end;

Учетная запись электронной почты и пароль являются поддельными. Настоящую выдать не могу.

unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdIOHandler, IdIOHandlerSocket,
  IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
  IdIMAP4, Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    IMAPClient: TIdIMAP4;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure IMAPClientStatus(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: string);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
begin
  IMAPClient.Connect();
end;

procedure TForm4.IMAPClientStatus(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
  memo1.Lines.Add(AStatusText);
end;

end.

person Meta Mussel    schedule 09.08.2017    source источник


Ответы (1)


Вам нужно изменить свойство TIdImap4.UseTLS с utUseRequireTLS на utUseImplicitTLS. Порт IMAP 993 ожидает, что клиент отправит рукопожатие SSL/TLS, как только сокет будет подключен, прежде чем сервер сможет отправить приветствие IMAP (зашифрованное) клиенту. utUseRequireTLS не делает этого рукопожатия, utUseImplicitTLS делает. Ваш клиент зависает, потому что он не отправляет рукопожатие и пытается прочитать (незашифрованное) приветствие, которое сервер не отправляет.

С другой стороны, вы не должны устанавливать большинство свойств SSLIOHandler, которые вы устанавливаете в настоящее время. Единственными свойствами, которые вы должны установить вручную, являются Name (необязательно), SSLOptions и нужные обработчики событий. Остальные свойства обрабатываются Indy для вас (в основном Connect()), так что вам не нужно возиться с ними.

person Remy Lebeau    schedule 09.08.2017