email - 使用 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 文档对我来说太难和太费时了,我没有正确的知识来理解各种属性的使用。
有人可以向我指出为什么该程序不起作用吗?
解决方案
替补:
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 一起工作。
推荐阅读
- node.js - 无法在 macOS Big Sur 11.4 上安装 Gulp-sass
- android - 如何在许多活动之间保存 int 值
- discord.js - MessageEmbed 字段值不能为空。不和谐.js
- python - 在python中如何替换放置在字符串和特殊字符之间的字符串
- sql - 根据两个标识符连接 Trino 中同一列的字符串
- r - lmerTest 之后的事后 emmeans() 测试出现问题
- python - 将所有包含文件的目录从 FTP 复制到本地目录
- c# - 什么是“OnDockChanged”事件处理程序?
- mongodb - 如何通过 ID 查找可以嵌套 n 级深的嵌套子文档?
- flutter - 如何在 Flutter 中将 cURL -X -u、-H、-d 转换为 http post