Delphi 如何使用Indy将消息发送到存储在TListView组件中的多个电子邮件地址?

Delphi 如何使用Indy将消息发送到存储在TListView组件中的多个电子邮件地址?,delphi,indy,indy10,tlistview,Delphi,Indy,Indy10,Tlistview,我正在尝试从TListView中获取电子邮件列表,并将其分配给TIdMessage.Recipients.EMailAddresses。我正在尝试获取ListView标题并将其指定为收件人电子邮件地址,但我无法确定如何执行此操作 以下是我当前的错误代码: 过程TfrmEmailer.btnSendClick(发送方:TObject); 变量 smtpServer:tidstp; msgEmail:TIdMessage; ssl:TIdSSLIOHandlerSocketOpenSSL; i:整数

我正在尝试从
TListView
中获取电子邮件列表,并将其分配给
TIdMessage.Recipients.EMailAddresses
。我正在尝试获取ListView标题并将其指定为收件人电子邮件地址,但我无法确定如何执行此操作

以下是我当前的错误代码:

过程TfrmEmailer.btnSendClick(发送方:TObject);
变量
smtpServer:tidstp;
msgEmail:TIdMessage;
ssl:TIdSSLIOHandlerSocketOpenSSL;
i:整数;
开始
smtpServer:=tidstp.Create(nil);
msgEmail:=TIdMessage.Create(无);
ssl:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
ssl.SSLOptions.Method:=sslvTLSv1_2;
ssl.SSLOptions.Mode:=sslmUnassigned;
ssl.SSLOptions.VerifyMode:=[];
ssl.SSLOptions.VerifyDepth:=0;
msgEmail.Sender.Address:=edtssenderAddress.Text;
msgEmail.Sender.Name:=edtssenderName.Text;
msgEmail.ReplyTo.EMailAddresses:=edtplyto.Text;
对于i:=0到长度(lsvRecipients.ItemIndex)do
开始
msgEmail.Recipients.EMailAddresses:=lsvRecipients.Items[0]。标题;
结束;
msgEmail.Subject:=edtSubject.Text;
msgEmail.Body.Text:=redBody.Text;
smtpServer.IOHandler:=ssl;
smtpServer.Host:=edtHost.Text;
smtpServer.Port:=stroint(edtPort.Text);
smtpServer.Username:=edtUsername.Text;
smtpServer.Password:=edtppassword.Text;
smtpServer.UseTLS:=utUseExplicitTLS;
smtpServer.Connect;
smtpServer.Send(msgEmail);
断开连接;
免费的;
msgEmail.Free;
ssl.Free;
//输出
嘟嘟声
ShowMessage('Email Sent!');
结束;
程序TfrmEmailBomber.btnAddEmailClick(发送方:TObject);
开始
emailToAdd:=lsvRecipients.Items.Add;
emailToAdd.Caption:=edtAddEmail.Text;
结束;

TIdMessage.Recipients.EMailAddresses
设计为一个分隔字符串,包含多个电子邮件地址,但您在循环中一遍又一遍地为其分配各个电子邮件地址,因此它将只包含您分配的最后一个电子邮件地址

在这种情况下,请使用
TIdMessage.Recipients.Add()
而不是
TIdMessage.Recipients.EMailAddresses

此外,您没有正确枚举
TListView
项。而且,如果引发异常,您也无法保护代码不受内存泄漏的影响

请尝试以下方法:

var
smtpServer:tidstp;
msgEmail:TIdMessage;
ssl:TIdSSLIOHandlerSocketOpenSSL;
i:整数;
开始
smtpServer:=tidstp.Create(nil);
尝试
msgEmail:=TIdMessage.Create(smtpServer);
msgEmail.Sender.Address:=edtssenderAddress.Text;
msgEmail.Sender.Name:=edtssenderName.Text;
msgEmail.ReplyTo.EMailAddresses:=edtplyto.Text;
对于i:=0到lsvRecipients.Count-1 do
开始
msgEmail.Recipients.Add.Address:=lsvRecipients.Items[i]。标题;
//或:
//msgEmail.Recipients.Add.Text:=lsvRecipients.Items[i]。标题;
结束;
msgEmail.Subject:=edtSubject.Text;
msgEmail.Body.Text:=redBody.Text;
ssl:=TIdSSLIOHandlerSocketOpenSSL.Create(smtpServer);
ssl.SSLOptions.Method:=sslvTLSv1_2;
ssl.SSLOptions.Mode:=sslmUnassigned;
ssl.SSLOptions.VerifyMode:=[];
ssl.SSLOptions.VerifyDepth:=0;
smtpServer.IOHandler:=ssl;
smtpServer.Host:=edtHost.Text;
smtpServer.Port:=stroint(edtPort.Text);
smtpServer.Username:=edtUsername.Text;
smtpServer.Password:=edtppassword.Text;
smtpServer.UseTLS:=utUseExplicitTLS;
smtpServer.Connect;
尝试
smtpServer.Send(msgEmail);
最后
断开连接;
结束;
最后
免费的;
结束;
//输出
嘟嘟声
ShowMessage('Email Sent!');
结束;
程序TfrmEmailBomber.btnAddEmailClick(发送方:TObject);
变量
电邮地址:TListItem;
开始
emailToAdd:=lsvRecipients.Items.Add;
emailToAdd.Caption:=edtAddEmail.Text;
结束;

对于i:=0到长度(lsvRecipients.ItemIndex)do
对于i:=0到lsvRecipients.Items.Count-1 do和
msgEmail.Recipients.EMailAddresses
显然是错误的,因为它一直覆盖相同的属性。另外,
lsvRecipients.Items[0]。标题
应清楚地显示为
lsvRecipients.Items[i]。标题
。您需要使用
try..finally
块来保护您的资源。谢谢Andreas。我没有意识到可以将一个变量作为项目索引,但这是有意义的。什么是资源?感谢您的回复。我不明白为什么计数最后必须是-1。如果我忽略它,我会得到一个内存访问冲突。是因为它试图在一个没有电子邮件的地方搜索电子邮件吗<代码>对于i:=0到lsvRecipients.Count-1 do@Bollywagger“我不明白为什么计数必须在末尾有-1”-阅读Delphi的文档:。“是因为它试图在一个没有电子邮件的地方搜索电子邮件吗?”-是的,如果没有-1,循环将超出
集合的范围。