使用Delphi和Indy连接到亚马逊工作邮件
问题描述:
我有一个IMAP4客户端,可以很好地连接到RackSpace,但客户端正在转向亚马逊工作邮件。使用Delphi和Indy连接到亚马逊工作邮件
每亚马逊发布说明:
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();
它返回的“连接”状态,但在此之后的程序挂起。我通过组件源跟踪了线程,发现它正在等待从亚马逊返回的函数TIdIMAP4.GetResponse: string;
它只是挂在那里很长一段时间,然后抛出“Connection Gracefully Closed”异常。
德尔福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;
的电子邮件帐户和密码是假的。我不能给出一个真正的。
答
您需要将TIdImap4.UseTLS
属性更改从utUseRequireTLS
到utUseImplicitTLS
。 IMAP端口993希望客户端在套接字连接后立即发送SSL/TLS握手,然后服务器可以将IMAP问候(加密)发送到客户端。 utUseRequireTLS
不会那样握手,utUseImplicitTLS
呢。您的客户端因为没有发送握手而处于冻结状态,并且正在尝试读取服务器未发送的(未加密的)问候语。
在旁注中,您不应该设置您当前正在设置的大部分SSLIOHandler的属性。您应该手动设置的唯一属性是Name
(可选),SSLOptions
和所需的事件处理程序。其余的房产由Indy在内部为您处理(主要由Connect()
),因此您不需要惹恼他们。
这样做。 –