![]() |
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 |
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; |
AW: Dateianhang mit Indys
Hallo,
habe die gleichen Probleme gehabt. Meine Lösung sieht etwa so aus:
Delphi-Quellcode:
Habe noch einige Properties im Objectinspector (IDMSG) gesetzt, die hier noch vieleicht wichtig sind:
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; AttachmentEncoding: MIME ContentTransferEncoding: 8 bit AttachmentTempdir: Encoding: meMIME Einiges davon kommt noch in die Procedure, ist noch nicht ganz fertig. |
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 |
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:
DANKE!!!!!!!!!!!!!!
[...]
(* 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; [...] Michael |
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 |
AW: Dateianhang mit Indys
Statt dem ContentType einen statischen Wert zuzuweisen, gibt es intern eine schöne Funktion
Delphi-Quellcode:
, welche einem anhand der Datei (dessen Dateiendung) den zugehörigen passenden ContentType ermittelt:
GetMIMETypeFromFile(const AFile: TIdFileName): string;
Delphi-Quellcode:
uses
IdGlobalProtocols; // ... idAttachment := TIdAttachmentFile.Create(idMessageFinal.MessageParts, 'd:\test.pdf'); idAttachment.ContentType := GetMIMETypeFromFile('d:\test.pdf'); |
AW: Dateianhang mit Indys
Super! Danke für die Zusatzinfo.
|
AW: Dateianhang mit Indys
Zitat:
|
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:
Oder was meinst du ist schon spät :-D
idMessageFinal.ContentType := 'multipart/mixed';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz