AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateianhang mit Indys

Ein Thema von scrat1979 · begonnen am 24. Okt 2011 · letzter Beitrag vom 26. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

Dateianhang mit Indys

  Alt 24. Okt 2011, 11:25
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
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dateianhang mit Indys

  Alt 24. Okt 2011, 11:45
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;
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod (24. Okt 2011 um 15:07 Uhr)
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
536 Beiträge
 
Delphi 12 Athens
 
#3

AW: Dateianhang mit Indys

  Alt 24. Okt 2011, 12:17
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.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Dateianhang mit Indys

  Alt 24. Okt 2011, 14:20
Werde mir heute ABend die bisherigen Antworten mal zu Gemüte führen! Vielen Dank schonmal für die tollen Code-Schnipsel!

Michael
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Dateianhang mit Indys

  Alt 24. Okt 2011, 21:11
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
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Dateianhang mit Indys

  Alt 25. Okt 2011, 20:18
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... 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
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Dateianhang mit Indys

  Alt 25. Okt 2011, 22:32
Statt dem ContentType einen statischen Wert zuzuweisen, gibt es intern eine schöne Funktion 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');
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Dateianhang mit Indys

  Alt 25. Okt 2011, 23:40
Super! Danke für die Zusatzinfo.
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Dateianhang mit Indys

  Alt 26. Okt 2011, 00:11
Statt dem ContentType einen statischen Wert zuzuweisen, gibt es intern eine schöne Funktion 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Dateianhang mit Indys

  Alt 26. Okt 2011, 01:09
Jedes Attachment bekommt sein eigenen ContentType. Intern wird dies in die MessageParts Attachment-Sammlung aufgenommen. Der "overall"-ContentType wurde so gesetzt: idMessageFinal.ContentType := 'multipart/mixed'; Oder was meinst du ist schon spät
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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