簡體   English   中英

使用 Delphi 和 Indy 連接到 Amazon Work Mail

[英]Connecting to Amazon Work Mail with Delphi and Indy

我有一個連接到 RackSpace 的 IMAP4 客戶端運行良好,但該客戶端正在轉移到 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();

它返回“已連接”狀態,但此后程序掛起。 我通過組件源跟蹤線程,發現它在函數TIdIMAP4.GetResponse: string;等待亞馬遜的返回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 := '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.

您需要將TIdImap4.UseTLS屬性從utUseRequireTLSutUseImplicitTLS IMAP 端口 993 期望客戶端在套接字連接后立即發送 SSL/TLS 握手,然后服務器才能向客戶端發送 IMAP 問候語(加密)。 utUseRequireTLS不做那個握手, utUseImplicitTLS做。 您的客戶端正在凍結,因為它沒有發送握手,並且正在嘗試讀取服務器未發送的(未加密的)問候語。

附帶說明一下,您不應設置當前正在設置的大多數 SSLIOHandler 屬性。 您應該手動設置的唯一屬性是Name (可選)、 SSLOptions和所需的事件處理程序。 其余的屬性由 Indy 在內部為您處理(主要由Connect() ),因此您無需弄亂它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM