Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Dateianhang mit Indys (https://www.delphipraxis.net/163973-dateianhang-mit-indys.html)

scrat1979 24. Okt 2011 10:25

Dateianhang mit Indys
 
Hallo zusammen,

schon stundenlang versuche ich nun mit den Indy-Komponenten (Version von Delphi 2010) eine Nachricht mit Dateianhang zu verschicken. Das funtioniert soweit, jedoch wird die Datei in die Nachricht mit reincodiert und z.B. in einem Webmailer nicht als "richtiger" Anhang angezeigt. Habe schon verschiedene Codierungen und Content-Typs versucht - leider ohne Erfolg. Die Suche im Forum und unter Google brachte ebenfalls keine Lösung lediglich die Erkenntnis, dass es mehreren schon so ergangen ist - leider ohne Lösungsvorschläge.

Mit der Clever Internet Suite (testweise probiert) funktioniert es ohne Probleme, habe jedoch keine Lust über 100€ dafür auszugeben da ich überzeugt bin, dass es mit den Indys auch funktioniert und bestimmt nur eine Property richtig gesetzt werden muss.

Hat jemand von Euch ein Codeschnipsel zum Versenden und korrekten Anhängen einer Datei?

Grüsse,
Michael

ConnorMcLeod 24. Okt 2011 10:45

AW: Dateianhang mit Indys
 
Das ist schon ca. vier Jahre her und war eine Riesenplackerei, aber wenn's mal funkt, dann funkt's prima.

Aus legalen Gründen muss ich da viel auslassen, aber es geht ungefähr so ...
Hoffe, das hilft!
Delphi-Quellcode:
    IdSMTP1        := TIdSMTP.Create(Self);
    IdSMTP1.Name  := 'MeinTollesMailSystem';
    IndyMessage   := TIdMessage.Create(Self);

    slAttachments := TStringList.Create;

    try
      slAttachments.CommaText := 'DateiEins.txt';

      // Message-Objekt initialisieren:
      IndyMessage.Clear ;
      IndyMessage.MessageParts.clear ;
      IndyMessage.ClearBody ;

//====================

      with TIdMessageBuilderHtml.Create do
      try
        PlainText.Text := 'das will ich jetzt sagen: ... ';
        Attachments.Assign(slAttachments);
        FillMessage(IndyMessage);
      finally
        Free;
      end;

//====================

      // WICHTIG: das alles muss unbedingt NACH dem TIdMessageBuilderHtml befüllt werden!

      IndyMessage.Subject     := 'blah';
      IndyMessage.From.Address := 'me';
      IndyMessage.From.Name   := 'connor';
... etc.
      try
        try
          IdSMTP1.Host    := 'blah';
          IdSMTP1.Username := 'blah';
          IdSMTP1.Password := 'blah';
          IdSMTP1.Connect ;
          IdSMTP1.Send (IndyMessage) ;
        except
          on e: Exception do
            begin
              // irgendwas tun ...
            end;
        end;
      finally
        IdSMTP1.Disconnect ;
      end;
    finally
      IdSMTP1.Free;
      IdSMTP1 := nil;

      IndyMessage.MessageParts.Clear;
      IndyMessage.Headers.Clear;
      IndyMessage.Free;
      IndyMessage := nil;

      slAttachments.Clear;
      slAttachments.Free;
      slAttachments := nil;
    end;

Neumann 24. Okt 2011 11:17

AW: Dateianhang mit Indys
 
Hallo,

habe die gleichen Probleme gehabt. Meine Lösung sieht etwa so aus:

Delphi-Quellcode:
procedure tdmm.sendmail(aSubject:string);
var
  Anhang:tidAttachmentfile;
  i:integer;
begin
  if mailactive and (fileexists(dml.savepath+'\'+asubject+'.xml')) then
  begin

    with IdMsgSend do
      begin
{$IFDEF SERVER}

         dmg.cdsclients.First;
         Recipients.Clear;
         i:=0;
         repeat
           Recipients.Add;
           Recipients[i].Address:=dmg.CdsClientsMail.AsString;

           inc(i);
           dmg.CdsClients.Next;
         until dmg.CdsClients.eof;
{$ELSE}
         Recipients.EMailAddresses := ReceiverEMail;
{$ENDIF}
         contenttype:='multipart/mixed' ;
         idMsgSend.IsEncoded:=true;
         From.Text := UserEmail;
         ReplyTo.EMailAddresses := UserEmail;
         ReceiptRecipient.Text := '';
         Subject := asubject; { Subject: header }

          Body.LoadFromFile(dml.savepath+'\'+asubject+'.xml'); // Nur für Testzwecke
         Priority := TIdMessagePriority(3); { Message Priority }

          Anhang:=TIdAttachmentFile.Create(IdMsgSend.MessageParts );
          Anhang.ContentType := 'text/plain';
          Anhang.StoredPathName:=dml.savepath+'\'+asubject+'.xml';
          Anhang.FileName:=extractfilename(asubject+'.xml');
          Anhang.OpenLoadStream;
          Anhang.CloseLoadStream;

      end;


     SMTP.Username := UserEmail;
     SMTP.Password := SmtpServerPassword;
     SMTP.Host := SmtpServerName;
     SMTP.Port :=SmtpServerPort;

   
     try
      try
        SMTP.Connect;
        SMTP.Send(IdMsgSend);
        deletefile(dml.savepath+'\'+asubject+'.xml');
        //messagedlg(_('Daten erfolgreich gesendet'),mtinformation,[mbok],0);
      except
      on e:exception do
        writeerrlog('Mail konnte nicht gesendet werden ',e);
      end;
     finally
        SMTP.Disconnect;
        Idmsgsend.MessageParts.Clear;
     end;
  end;
end;
Habe noch einige Properties im Objectinspector (IDMSG) gesetzt, die hier noch vieleicht wichtig sind:

AttachmentEncoding: MIME
ContentTransferEncoding: 8 bit
AttachmentTempdir:
Encoding: meMIME

Einiges davon kommt noch in die Procedure, ist noch nicht ganz fertig.

scrat1979 24. Okt 2011 13:20

AW: Dateianhang mit Indys
 
Werde mir heute ABend die bisherigen Antworten mal zu Gemüte führen! Vielen Dank schonmal für die tollen Code-Schnipsel!

Michael

scrat1979 24. Okt 2011 20:11

AW: Dateianhang mit Indys
 
Habe mal mit Neumanns Codeschnipsel begonnen (da etwas "vollständiger") und es funktioniert PERFEKT!!!! Allerdings weiß ich jetzt nich sicher, an welcher Einstellung es liegt (evtl. probiere ich das nachher aus und gebe Rückmeldung).

Anbei mein (nahezu) vollständiger Code der Vollständigkeit halber...

Delphi-Quellcode:
    [...]

    (* SMTP-Komponente initialisieren *)
    idSMTPFinal := TIdSMTP.Create(nil);
    idSMTPFinal.AuthType := satDefault;
    idSMTPFinal.Host := 'mail.gmx.net';
    idSMTPFinal.Password := 'xxxxxxxxxxxxx';
    idSMTPFinal.Port := 25;
    idSMTPFinal.Username := 'xxxxxxxxxxxxxxxxxxx';
    idSMTPFinal.UseTLS := utNoTLSSupport;
    idSMTPFinal.UseVerp := False;

    (* Nachricht erstellen *)
    idMessageFinal := TIdMessage.Create(nil);
    idMessageFinal.ContentType := 'multipart/mixed';
    idMessageFinal.ContentTransferEncoding := '8 bit';
    idMessageFinal.Encoding := meMIME;
    idMessageFinal.AttachmentEncoding := 'MIME';

    idAttachment := TIdAttachmentFile.Create(idMessageFinal.MessageParts, 'd:\test.pdf');
    idAttachment.ContentType := 'application/pdf';

    IdMessageFinal.From.Address := 'xxxxxxxxxxxxxxxxxxxxx';
    IdMessageFinal.From.Name := 'xxxxxxxxxxxxxxxxx';
    idMessageFinal.Subject := 'Testnachricht';
    idMessageFinal.Body.Add('Das ist die Nachricht.......');

    idMessageFinal.Recipients.Add.Address := 'xxxxxxxxxxxxxxxx';

    StatusBar.Panels[0].Text := 'Versenden der eMail, bitte warten...';
    Application.ProcessMessages;

  try
    IdSMTPFinal.Connect;
    IdSMTPFinal.Send(idMessageFinal);
    IdSMTPFinal.Disconnect();
    idAttachment.Free;
    idMessageFinal.Free;
    idSMTPFinal.Free;

  except
    if IdSMTPFinal.Connected then
      IdSMTPFinal.Disconnect();
      idAttachment.Free;
      idMessageFinal.Free;
      idSMTPFinal.Free;
  end;

  [...]
DANKE!!!!!!!!!!!!!!

Michael

scrat1979 25. Okt 2011 19:18

AW: Dateianhang mit Indys
 
Es ist wie verhext! Ich denke, ich habe jetzt meine "alte" Einstellungen, nachdem ich alle Einstellungen bezüglich Encoding etc. entfernt habe und plötzlich funktioniert es auch so, die Anhänge werden in Webmailer etc. korrekt angezeigt... :gruebel: Einstellungen im OI fallen weg, da die Instanzen dynamisch erzeugt werden.

Wie dem auch sei. Wollte ich - wie versprochen - nur noch kurz mitteilen...

Grüsse,
Michael

geskill 25. Okt 2011 21:32

AW: Dateianhang mit Indys
 
Statt dem ContentType einen statischen Wert zuzuweisen, gibt es intern eine schöne Funktion
Delphi-Quellcode:
GetMIMETypeFromFile(const AFile: TIdFileName): string;
, welche einem anhand der Datei (dessen Dateiendung) den zugehörigen passenden ContentType ermittelt:
Delphi-Quellcode:
uses
  IdGlobalProtocols;

    // ...

    idAttachment := TIdAttachmentFile.Create(idMessageFinal.MessageParts, 'd:\test.pdf');
    idAttachment.ContentType := GetMIMETypeFromFile('d:\test.pdf');

scrat1979 25. Okt 2011 22:40

AW: Dateianhang mit Indys
 
Super! Danke für die Zusatzinfo.

Luckie 25. Okt 2011 23:11

AW: Dateianhang mit Indys
 
Zitat:

Zitat von geskill (Beitrag 1132557)
Statt dem ContentType einen statischen Wert zuzuweisen, gibt es intern eine schöne Funktion
Delphi-Quellcode:
GetMIMETypeFromFile(const AFile: TIdFileName): string;
, welche einem anhand der Datei (dessen Dateiendung) den zugehörigen passenden ContentType ermittelt:
Delphi-Quellcode:
uses
  IdGlobalProtocols;

    // ...

    idAttachment := TIdAttachmentFile.Create(idMessageFinal.MessageParts, 'd:\test.pdf');
    idAttachment.ContentType := GetMIMETypeFromFile('d:\test.pdf');

Die Frage ist jetzt, was passiert, wenn man unterschiedliche Dateitypen anhängt.

geskill 26. Okt 2011 00:09

AW: Dateianhang mit Indys
 
Jedes Attachment bekommt sein eigenen ContentType. Intern wird dies in die MessageParts Attachment-Sammlung aufgenommen. Der "overall"-ContentType wurde so gesetzt:
Delphi-Quellcode:
idMessageFinal.ContentType := 'multipart/mixed';
Oder was meinst du ist schon spät :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr.
Seite 1 von 2  1 2      

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