【问题标题】:Program hangs at TIdAttachmentFile constructor程序在 TIdAttachmentFile 构造函数处挂起
【发布时间】:2016-10-29 22:23:12
【问题描述】:

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

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

【问题讨论】:

    标签: android delphi smtp email-attachments indy


    【解决方案1】:

    在这一行:

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

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

    如果该行确实有效,那么您确实有一个名为 Test 的文件,并且还需要提供给 TIdAttachmentFile

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

    您的标题声称冻结发生在 TIdAttachmentFile 构造函数中,但构造函数尚未访问实际文件,它只是分配了一些属性值(FilenameStoredPathNameFileIsTempFile 和 @987654333 @)。在TIdSMTP.Send() 需要对文件数据进行编码之前,不会实际访问该文件。 此时,如果发生冻结,则要么对文件的访问被阻止,要么网络流量被阻止,等等。如果不调试到 Indy 的源代码以查看真正发生冻结的位置,就很难诊断出这一点,因为Send() 执行了许多操作。

    如果Memo2.Lines.LoadFromFile() 有效,那么另一种方法是使用TIdText 而不是TIdAttachmentFile,因此您可以在LoadFromFile() 属性中使用相同的LoadFromFile() 方法:

    Text := TIdText.Create(IdMessage1.MessageParts, nil);
    with Text do
    begin
      Body.LoadFromFile(GetHomePath+'/Test');
      ContentType := 'text/plain';
      ContentDisposition := 'attachment';
      FileName := 'test.txt';
    end; 
    

    不管怎样,去掉TIdAttachmentMemory,它对你没有任何作用,因为你没有将文件数据加载到其中。

    【讨论】:

    • 只有“Test”而不是“Test.txt”是一个错字。这很好用!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2019-01-03
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    相关资源
    最近更新 更多