Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   IdPOP3 Error in Retrieve bei Android (https://www.delphipraxis.net/178978-idpop3-error-retrieve-bei-android.html)

benjaminradde 6. Feb 2014 14:07

IdPOP3 Error in Retrieve bei Android
 
Hallo!

Ich möchte in einer Android-APP mit Hilfe des IDPOP3-Clients Mails herunterladen. Lässt man die APP unter Win32 laufen ist alles gut. Im Android steigt er bei:

IdPOP3.Retrieve(i, Mail);

mit der Exception:

...Klasse EFCreateError mit der Meldung 'Datei "/Indy72C59D5A" kann nicht erstellt werden. Not a directory' aufgetreten.

aus.

Verfolgt man es weiter landet man in der Unit System.Classes bei TFileStream.Create

Es fliegt die Exception, siehe unten fett markiert. Bei FileOpen ird ja unten der Unterschied gemacht. Ich nehme an, bei FileCreate sollte dies wohl auch sein.

Jemand eine Idee?

constructor TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
var
LShareMode: Word;
begin
if (Mode and fmCreate = fmCreate) then
begin
LShareMode := Mode and $FF;
if LShareMode = $FF then
LShareMode := fmShareExclusive; // For compat in case $FFFF passed as Mode
inherited Create(FileCreate(AFileName, LShareMode, Rights));
if FHandle = INVALID_HANDLE_VALUE then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);
end
else
begin
{$IFDEF MSWINDOWS}
inherited Create(FileOpen(AFileName, Mode or Rights));
{$ELSE !MSWINDOWS}

inherited Create(FileOpen(AFileName, Mode));
{$ENDIF MSWINDOWS}
if FHandle = INVALID_HANDLE_VALUE then
raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);

end;
FFileName := AFileName;
end;

Union 6. Feb 2014 18:12

AW: IdPOP3 Error in Retrieve bei Android
 
Ja, Du musst den Pfad für die Attachment-Tempfiles setzen:
Delphi-Quellcode:
Mail := TIdMessage.Create;
Mail.AttachmentTempDirectory := TPath.GetTempPath; // z.b. storage/emulated/0/Android/data/com.embarcadero.AndroidPOP3/files/tmp
PopMail.Retrieve(i, Mail);
Wenn Du zunächst nur eine Übersicht haben willst und Laufzeit sparen, verwende alternativ RetrieveHeader.

Das ist ein Fehler im MakeTempFilename von Indy. Dort fehlt der Mobile-ifdef für die Verarbeitung bei leerem Attachment-Pfadnamen.

benjaminradde 6. Feb 2014 19:16

AW: IdPOP3 Error in Retrieve bei Android
 
Hi!

Danke, das hat erst einmal geklappt.

Leider kommt jetzt das nächste Problem beim Speichern vom Attachment.

Attachment.SaveToFile(destfilename);

Attachment.Filename : BA_Gabelstapler.pdf
destfilename : /storage/emulated/0/download/BA_Gabelstapler.pdf (TPath.GetSharedDownloadsPath + PathDelim)

Exception: Error saving attachment

Hierzu auch so ne gute Idee? :-)

Union 9. Feb 2014 16:11

AW: IdPOP3 Error in Retrieve bei Android
 
Die generische Kopierroutine von Indy ist fehlerhaft. Also anstelle von SavetoFile folgendes einsetzen:
Delphi-Quellcode:
TFile.Copy(Attachment.StoredPathName, DestinationFile, True);


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz