Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy - Attachment verliert Namen (erst seit Delphi2009) (https://www.delphipraxis.net/121673-indy-attachment-verliert-namen-erst-seit-delphi2009.html)

Samashy 2. Okt 2008 08:25


Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Hallo in die Runde,

kann sich bitte mal jemand meinen Quelltext anschauen. Ich stehe völlig auf der Leitung. Ist bestimmt wieder so 'ne Unicodegeschichte. Prog war in Delphi 2007 geschrieben und ich wollte es auf Delphi 2009 umschreiben. Nun scheitere ich daran, dass das Attachment nur nur *.att heißt beim Empfänger.

Delphi-Quellcode:
var
att:TIDAttachmentFile;
begin
 TRY
   screen.cursor:=crhourglass;
   eMail.CCList.EMailAddresses := 'blah blah';
   SMTP.Host := 'blah blah';
   SMTP.UserName := 'blah blah';
   SMTP.Password := 'blah blah';
   SMTP.Port := 25;
  // SMTP.AuthType := atDefault;    /*was kommt anstelle dessen hin?*/
   SMTP.Connect;
   while not eof do begin
     email.MessageParts.Clear;
     email.ContentTransferEncoding := 'udf-8';
     with TIdText.Create(Email.MessageParts, nil) do
     begin
         ContentType := 'text/plain';
         CharSet        := 'ISO-8859-1';
         ContentTransfer := 'base64';
         body.Text := 'blah blah'
     end;
    // Anfang EMail erzeugen
     eMail.From.Text := 'blah';
     eMail.Recipients.EMailAddresses := 'blah';
     eMail.Subject := 'blah';
     email.ContentType := 'multipart/related; type="text/plain"';
     email.CharSet :='ISO-8859-1';
     //Attachment ranbauen
     att := TIdAttachmentFile.Create(Email.MessageParts, 'c:\test.pdf');
     //Prüfen ob Attachment da
     if FileExists('c:\test.pdf') then
        SMTP.Send(eMail);
     SMTP.Disconnect;
  end; //with helpi do begin
  screen.Cursor :=crdefault;
 except
     screen.Cursor :=crdefault;
 END;

end;
Der gleiche Quelltext hat sonst ohne Probleme funktioniert.

Hat jemand eine Idee?
Danke,
Romy

Assertor 2. Okt 2008 10:21

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Hi Romy,

ist keine Unicode-Geschichte, sondern leider eine Bug-Geschichte ;)

Liegt an einem kleinen Fehler in Indy, mehr dazu in meinem Blog (wo auch eine Lösung für das Problem beschrieben ist). Das ganze ist auch schon bei CodeGear im QC als QC 66867 aufgeführt.

Im nächsten Update von D2009 sollte das behoben sein.

Der Fehler entstand durch einen falschen Zeilenumbruch vor der Ausgabe des Dateinamens. Mailclients ignorieren dann den Dateinamen, wenn er nicht in einer eigenen Zeile steht.

Gruß Assertor

Samashy 2. Okt 2008 11:53

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Danke Assertor für Deine Hilfe.
Ich glaube, dass ich dennoch jetzt irgendwas falsch gemacht habe.
Beim Compilieren bekomme ich die Meldung...

[DCC Fataler Fehler] IdMessageClient.pas(402): F1026 Datei nicht gefunden: 'IdCompilerDefines.inc'

Romy

Assertor 2. Okt 2008 12:05

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Hi,

Zitat:

Zitat von Samashy
Danke Assertor für Deine Hilfe.

Gerne!

Zitat:

Zitat von Samashy
Ich glaube, dass ich dennoch jetzt irgendwas falsch gemacht habe.
Beim Compilieren bekomme ich die Meldung...

[DCC Fataler Fehler] IdMessageClient.pas(402): F1026 Datei nicht gefunden: 'IdCompilerDefines.inc'

Nicht Dein Fehler, Delphi kann die angegebene Datei nicht finden.

Du findest diese in:
C:\Program Files\CodeGear\RAD Studio\6.0\source\Indy\Indy10\Protocols\IdCompiler Defines.inc

Kopier die Datei einfach mit in das Projektverzeichnis. Dann sollte es gehen.

Gruß Assertor

Samashy 2. Okt 2008 12:43

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
:hello: Es funktioniert!!!

Nochmal vielen vielen Dank!

Romy

Assertor 2. Okt 2008 13:15

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Zitat:

Zitat von Samashy
:hello: Es funktioniert!!!

Nochmal vielen vielen Dank!

Freut mich, gerne!

Gruß Assertor

hadschi92 25. Feb 2009 18:51

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Ich grabe mal den Thread hier aus, weil ich mit obigen Quellcode auch versuche eine Email zu verschicken. Dabei muss nichteinmal zwingend ein Attachment dabei sein, werde aber später auch Attachments versenden wollen, deshalb lass ich das mal drin.

Doch zuerst einmal verstehe ich nicht alle Befehle:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
att : TIDAttachmentFile;
begin
try
   screen.cursor:=crhourglass;
   IdMessage1.CCList.EMailAddresses := 'adresse';
   IdSMTP1.Host := Edit1.Text;
   IdSMTP1.UserName := Edit3.Text;
   IdSMTP1.Password := Edit4.Text;
   IdSMTP1.Port := StrToInt(Edit2.Text);
   IdSMTP1.Connect;
   while not eof do begin //für was steht eof?
     IdMessage1.MessageParts.Clear;
     IdMessage1.ContentTransferEncoding := 'udf-8';
     with TIdText.Create(IdMessage1.MessageParts, nil) do //und was ist TIdText, kann ich nicht IdMessage direkt bearbeiten?
     begin
         ContentType := 'text/plain';
         CharSet        := 'ISO-8859-1';
         ContentTransfer := 'base64';
         body.Text := Memo1.Lines.Text;
     end;
     IdMessage1.From.Text := 'blah';
     IdMessage1.Recipients.EMailAddresses := 'blah';
     IdMessage1.Subject := Edit5.Text;
     IdMessage1.ContentType := 'multipart/related; type="text/plain"'; //brauche ich das hier nur wenn ich mit TIdText arbeite?
     IdMessage1.CharSet :='ISO-8859-1';
     if CheckBox1.Checked and FileExists('c:\test.pdf') then
        att := TIdAttachmentFile.Create(IdMessage1.MessageParts, 'c:\test.pdf');
     IdSMTP1.Send(IdMessage1);
     IdSMTP1.Disconnect;
  end;
  screen.Cursor :=crdefault;
except
     screen.Cursor :=crdefault;
end;

end;
Außerdem bringt mir Delphi immer einen "E/A-Fehler 6" und zwar genau dann, wenn diese eof ausgeführt wird. Die Delphi Hilfe verrät mit, dass eof prüft ob das Dateiende erreicht ist, aber ich übergebe ja keine Variable, gar nichts. Woher soll das Programm wissen was es zu prüfen hat? Auf der Microsoft Page erfährt man folgendes:
Zitat:

ERROR_INVALID_HANDLE 6 0x6 : The handle is invalid.

Thomas Horstmann 25. Feb 2009 21:55

Re: Indy - Attachment verliert Namen (erst seit Delphi2009)
 
Hallo,

1 Das "eof" würde ich nicht allzu ernst nehmen. Der Code sieht so aus, als wenn er vereinfacht wurde.
Wahrscheinlich sollten mehrere Mails hintereinander verschickt werden.

2 TIdText: Zwischen einer Mail mit bzw. ohne Anhang besteht ein grosser Unterschied.

2.1 Wenn keine Anhänge vorhanden sind, wird der Text im Body gespeichert (IdMessage1.Body := 'Text').

2.2 Bei Anhängen ist der Text "nur" ein weiterer Anhang neben den anderen. Dieser wird mit der Klasse "TIdText" erzeugt.
"Normale" Anhänge werden mit TIdAttachment bzw. TIdAttachmentFile erzeugt. Aber alle sind von "TIdMessagePart" abgeleitet.

3 Mit Content-Type wird definiert ob es sich um Text (text/plain) oder HTML (text/htm) handelt.
Zusätzlich sollte man angeben wie kodiert bzw. welcher Zeichensatz verwendet wird. Beispiel:

Delphi-Quellcode:
    ...
    IdMessage1.Encoding               := meMIME ;
    IdMessage1.ContentType            := 'text/plain' ;
    IdMessage1.ContentTransferEncoding := 'quoted-printable' ;
    IdMessage1.CharSet                := 'ISO-8859-1' ;
    ...
Viele Spass :)

[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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