我正在使用Delphi(Rad Studio 10.1)编写一个Android程序,它将通过电子邮件(使用SMTP等)在文本文件中发送数据。
我目前能够发送电子邮件,但没有附件。使用以下代码制作附件文件时程序似乎冻结:
Attachment:=TIdAttachmentFile.Create(IdMessage1.MessageParts, (GetHomePath+'/test.txt'));
路径没有错,因为我可以使用以下内容将文件读入备忘录:
Memo2.Lines.LoadFromFile(GetHomePath+'/Test.txt');
以下是与附件相关的全部代码:
Text := TIdText.Create(IdMessage1.MessageParts);
Text.ContentType := 'text/plain';
Text.Body.Add('Hello!');
Attachment := TIdAttachmentFile.Create(IdMessage1.MessageParts, (GetHomePath+'/test.txt'));
with Attachment do
begin
ContentType := 'text/plain';
FileName := 'test.txt';
end;
IdMessage1.ContentType := 'multipart/mixed';
AttMemory := TIdAttachmentMemory.Create(IdMessage1.MessageParts);
在此之后,我只需连接到TIdSMTP并发送消息。同样,在没有与TIdAttachmentFile相关的行的情况下发送电子邮件也没有问题。
如果我确实包含该行
AttMemory := TIdAttachmentMemory.Create(IdMessage1.MessageParts);
我收到附件的电子邮件,但是,附件没有名称,是空的,并且无法与我想要附加的文件相关,因为要发送电子邮件,必须注释掉与附件文件相关的行。
答案 0 :(得分:1)
在这一行:
Memo2.Lines.LoadFromFile(GetHomePath+'/Test');`
您正在加载名为Test
的文件,而不是test.txt
。 LoadFromFile()
不会为您添加.txt
个文件扩展名。文件名完全按照您提供的方式使用。
如果该行真的有效,那么你确实有一个名为Test
的文件,这也需要提供给TIdAttachmentFile
:
Attachment := TIdAttachmentFile.Create(IdMessage1.MessageParts, GetHomePath+'/Test');
你的标题声明冻结发生在TIdAttachmentFile
构造函数中,但构造函数尚未访问实际文件,它只分配了一些属性值(Filename
,StoredPathName
,{ {1}}和FileIsTempFile
)。在ContentType
需要对文件数据进行编码之前,实际上不会访问该文件。
此时,如果发生冻结,则阻止对文件的访问,或者阻止网络流量等。如果没有调试到Indy的源代码中,很难诊断出确切地看到冻结的确切位置,因为TIdSMTP.Send()
执行了许多操作。
如果Send()
有效,那么另一种方法是使用Memo2.Lines.LoadFromFile()
代替TIdText
,这样您就可以在TIdAttachmentFile
中使用相同的LoadFromFile()
方法属性:
TIdText.Body
无论哪种方式,摆脱Text := TIdText.Create(IdMessage1.MessageParts, nil);
with Text do
begin
Body.LoadFromFile(GetHomePath+'/Test');
ContentType := 'text/plain';
ContentDisposition := 'attachment';
FileName := 'test.txt';
end;
,它都没有为你做任何事情,因为你没有将文件数据加载到其中。