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

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

За Amazon опубликованы инструкции:

Подключитесь к вашему клиентскому приложению IMAP

Вы можете подключить любое IMAP-совместимое клиентское программное обеспечение к Amazon WorkMail, предоставив следующую информацию: 

Тип учетной записи IMAP 
Протокол IMAPS 
Порт 993 
Требуется защищенное соединение;SSL 
Входящее имя пользователя Адрес электронной почты, связанный с вашей учетной записью Amazon WorkMail 
Входящий пароль Ваш пароль 
Входящий сервер Конечная точка, соответствующая региону, в котором расположен ваш почтовый ящик: • us-east-1 imap.mail.us-east-1.awsapps.com

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

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

Delphi 10.2

Indy 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 := 'emailTest.1236@foo.bar.com';
  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.

1 ответ

Решение

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

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

Другие вопросы по тегам