首页 > 解决方案 > 使用 TIdSMTP 组件将邮件发送到具有 TLS/SSL 配置的服务器

问题描述

我需要使用 Delphi7 和 Indy10 组件 TIdSMTP 发送邮件;邮件必须发送到意大利税务局的服务器。

我使用了一个简单的 MAPI 组件来发送电子邮件,但现在必须使用 Indy 组件,但我不知道它们。

我尝试这样创建一个程序:

procedure TForm1.BtCreateClick(Sender: TObject);
var
  DATA : TIdMessage;
  SMTP : TIdSMTP;
  SSL : TIdSSLIOHandlerSocketOpenSSL;
begin
  try
    SMTP := TIdSMTP.Create(nil);
    DATA := TIdMessage.Create(nil);
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    SSL.SSLOptions.Method := sslvTLSv1;
    SSL.SSLOptions.Mode := sslmClient;     // or sslmUnassigned ?
    SSL.SSLOptions.VerifyMode := [];
    SSL.SSLOptions.VerifyDepth := 0;
    DATA.From.Address := eUser.Text;       // 'my.name@pec.it'
    DATA.Recipients.EMailAddresses := eDest.Text; // 'recipient@pec.it'
    DATA.Subject := eOggetto.Text;         // 'dispatch of test'
    DATA.Body.Text := eCorpo.Lines.Text;   // ' Isend a mail from "pec" client to "ord" server)
    if (eAlleg.Text <> '') and FileExists(eAlleg.Text) then
       TIdAttachmentFile.Create(DATA.MessageParts, eAlleg.Text); 
    SMTP.IOHandler := SSL;
    SMTP.UseTLS := utUseExplicitTLS;
    SMTP.Host := eHost.Text;               // 'imaps.pec.aruba.it';
    SMTP.Port := StrToInt(ePorta.Text);    // 993 ;
    SMTP.Username := eUser.Text;           // 'my.name@pec.it'
    SMTP.Password := ePassw.Text;          // 'my_password_123'
    // SMTP.SASLMechanisms;                // no
    try
      try
        SMTP.Connect;
        SMTP.Send(DATA);
      except
        on E:Exception do
           ShowMessage('Non posso spedire E-Mail: ' + E.Message);
      end;
    finally
      if SMTP.Connected then SMTP.Disconnect;
    end;
  except
    on E : Exception do
    ShowMessage('Errore durante la spedizione del file: ' + E.Message);
  end;
end;

我在 \Windows\System32 目录中插入了“libeay32.dll”和“ssleay32.dll”(rel:openssl 1.0.2q)。

单击后,似乎邮件已发送,出现圆圈(screen.Hourglass)但任何后续动作(循环?)。没有错误信息。

我相信这是握手问题,客户端未传达某些属性。TIdSSLIOHandlerSocketOpenSSL 的设置不完整?

我承认 Indy 文档对我来说太难和太费时了,我没有正确的知识来理解各种属性的使用。

有人可以向我指出为什么该程序不起作用吗?

标签: emailopenssldelphi-7indy10

解决方案


替补:

SSL.SSLOptions.Method: = sslvTLSv1; 使用 SSL.SSLOptions.Method: = sslvTLSv1_2;

SMTP.UseTLS:= utUseExplicitTLS; 使用 SMTP.UseTLS:= utUseImplicitTLS;

然后使用: SMTP.Host: = 'smtps.pec.aruba.it'; SMTP.端口:= 465;

然后需要使用openssl-1.0.2q-i386-win32库libeay32.dll ssleay32.dll

插入FormCreate

IdOpenSSLSetLibPath(两个库的路径:最好在程序所在的地方插入);

对于上述方法,输入 Uses: IdSSLOpenSSLHeaders

尝试并与 Aruba PEC 一起工作。


推荐阅读