使用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属性更改从utUseRequireTLSutUseImplicitTLS。 IMAP端口993希望客户端在套接字连接后立即发送SSL/TLS握手,然后服务器可以将IMAP问候(加密)发送到客户端。 utUseRequireTLS不会那样握手,utUseImplicitTLS呢。您的客户端因为没有发送握手而处于冻结状态,并且正在尝试读取服务器未发送的(未加密的)问候语。

在旁注中,您不应该设置您当前正在设置的大部分SSLIOHandler的属性。您应该手动设置的唯一属性是Name(可选),SSLOptions和所需的事件处理程序。其余的房产由Indy在内部为您处理(主要由Connect()),因此您不需要惹恼他们。

+0

这样做。 –