2016-06-27 13 views
0

私は、Delphi(Rad Studio 10.1)を使用してAndroidプログラムを作成しています。このプログラムは、電子メール(SMTPなどを使用)でテキストファイルにデータを送信します。TIdAttachmentFileコンストラクタでプログラムがハングする

現在メールは送信できますが、添付ファイルは送信できません。次のコードを使用して添付ファイルを作成すると、プログラムがフリーズして表示されます。

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

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

あなたはTest、ないtest.txtという名前のファイルをロードしています。 LoadFromFile()は、ファイル拡張子.txtを追加しません。ファイル名は、入力したとおりに使用されます。

その行が実際に動作する場合は、あなたが本当にTestという名前のファイルを持っている、そしてそれは同様にTIdAttachmentFileに与える必要がする必要がある:

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

あなたのタイトル凍結TIdAttachmentFileコンストラクタで起こると主張コンストラクタが実際のファイルにまだアクセスしていない場合は、いくつかのプロパティ値(FilenameStoredPathNameFileIsTempFile、およびContentType)を割り当てます。 TIdSMTP.Send()がファイルデータをエンコードする必要があるまで、ファイルは実際にはアクセスされません。 フリーズが発生している場合は、ファイルへのアクセスがブロックされているか、ネットワークトラフィックがブロックされているかなどです。 Send()が多くの操作を実行するため、Indyのソースコードをデバッグせずに、フリーズが実際に発生している場所を正確に確認することは困難です。

Memo2.Lines.LoadFromFile()作品ならば、代わりにあなたがTIdText.Bodyプロパティに同じLoadFromFile()方法を利用できるので、TIdText代わりのTIdAttachmentFileを使用することです:

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

いずれかの方法で、TIdAttachmentMemoryを取り除く、それあなたがそれにファイルデータをロードしていないのであなたのために何もしていません。

+0

"Test.txt"の代わりに "Test"を入力したのは、誤植でした。これは素晴らしい作品です!ありがとうございました! – DelphiAndroid12