程序挂起在TIdAttachmentFile构造函数中

时间:2016-06-27 19:32:58

标签: android delphi smtp email-attachments indy

我正在使用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);

我收到附件的电子邮件,但是,附件没有名称,是空的,并且无法与我想要附加的文件相关,因为要发送电子邮件,必须注释掉与附件文件相关的行。

1 个答案:

答案 0 :(得分:1)

在这一行:

Memo2.Lines.LoadFromFile(GetHomePath+'/Test');`

您正在加载名为Test的文件,而不是test.txtLoadFromFile()不会为您添加.txt个文件扩展名。文件名完全按照您提供的方式使用。

如果该行真的有效,那么你确实有一个名为Test的文件,这也需要提供给TIdAttachmentFile

Attachment := TIdAttachmentFile.Create(IdMessage1.MessageParts, GetHomePath+'/Test');

你的标题声明冻结发生在TIdAttachmentFile构造函数中,但构造函数尚未访问实际文件,它只分配了一些属性值(FilenameStoredPathName,{ {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; ,它都没有为你做任何事情,因为你没有将文件数据加载到其中。