Подключение к 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()
), так что вам не нужно возиться с ними.