![]() |
Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Indy hat für die Protokolle SMTP/POP3 und vor allen Dingen IMAP immer mehr verquaste Komponenten und einiges an Workaround ist erforderlich um Indy so zum Laufen zu bringen, das auch etwas komplexere Aufgaben zu erledigen. Wie so oft bei anderen Entwicklungen beobachtet, wird Indy immer mehr verschlimmbessert. Ein typisches Beispiel ist das Laden von Mail-Quelltexten (.eml) über einen Stream oder als File. Warum es manchmal klappt und dann wieder nicht ist nicht nachzuvollziehen. Nach meiner Beobachtung arbeitet man auch nicht mehr an der Weiterentwicklung.
Ich habe mir deshalb Visual Studio 2015 Community und hier speziell Mailkit/Mimekit angesehen und bin begeistert wie einfach man mit ein paar Zeilen cSharp-Code komplexe Aufgaben erledigen kann. Die DLL-s sind sauschnell und zuverlässig. Auch lassen Sie sich einfach von Delphi XE2 aufrufen. Ich habe auch zum Beispiel cSharp genutzt um sehr elegant HTML-Code in PDF zu verwandeln. Hier das Beispiel:
Code:
Wie wäre es, wenn wir hier eine Diskussion beginnen Teile von Delphi durch cSHarp sinnvoll zu ersetzen. Man kann bei Delphi bleiben, erweitert aber seinen Horizont ( und löst ganz einfach Aufgaben, die man in Delphi so nicht lösen kann).
using Microsoft.Win32;
using RGiesecke.DllExport; using SelectPdf; using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace Test { public class gcCommon { [DllExport(CallingConvention = CallingConvention.StdCall)] [return: MarshalAs(UnmanagedType.Bool)] public static bool GeneratePdfFile ( [param: MarshalAs(UnmanagedType.BStr)]string content, [param: MarshalAs(UnmanagedType.BStr)]string filename ) { try { string pdf_page_size = PdfPageSize.A4.ToString(); PdfPageSize pageSize = (PdfPageSize)Enum.Parse(typeof(PdfPageSize), pdf_page_size, true); string pdf_orientation = PdfPageOrientation.Portrait.ToString(); PdfPageOrientation pdfOrientation = (PdfPageOrientation)Enum.Parse(typeof(PdfPageOrientation), pdf_orientation, true); // instantiate a html to pdf converter object HtmlToPdf converter = new HtmlToPdf(); // set converter options converter.Options.PdfPageSize = pageSize; converter.Options.PdfPageOrientation = pdfOrientation; converter.Options.MarginLeft = 35; converter.Options.MarginRight = 35; converter.Options.MarginTop = 20; converter.Options.MarginBottom = 20; //converter.Options.WebPageWidth = webPageWidth; //converter.Options.WebPageHeight = webPageHeight; // create a new pdf document converting an url SelectPdf.PdfDocument doc = converter.ConvertHtmlString(content); // save pdf document doc.Save(@filename); // close pdf document doc.Close(); } catch (Exception e) { MessageBox.Show(e.Message); } return true; } } } Vielleicht kann Delphipraxis hierfür auch eine eigene Rubrik eröffnen? Interesse? |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Eine nette Idee, aber ich habe große Bedenken ...
Ich erstelle u. a. Delphi-VCL-Applikationen (monolithisch), um Abhängigkeiten (Installationen) zu vermeiden. Wenn man Indy nicht so mag (so wie ich) oder deren Wirrwarr in den Versionen, dann nimmt man halt andere Component-Sets, die gut funktionieren. |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
Frage: Welche guten Componenten gibt es es als Ersatz für Indy? Als Freeware und/oder Kaufversion? Mit Gruß HPB |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Kollegen nutzen zum Empfang und Versenden von E-Mails erfolgreich die ICS-Komponenten:
![]() |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
Das erforderliche Framework für cSharp wird seit Vista mitinstalliert und ständig aktualsiert, weil auch das Windows-Betriebssystem dieses Framework nutzt. Im Übrigen ist die Installation des Frameworks bei Inno-Setup kein Problem. Es gibt keinen kostenlosen Ersatz für Indy. Alle anderen bekannten Komponenten kosten richtig viel Geld. ICS hat noch nicht mal das Imap-Protokoll. Ist wohl zu kompliziert. Naja es war ja nur ein Vorschlag von mir über das Thema hier zu diskutieren. Meine Begeisterung kann ich wohl nicht übertragen.:) |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
Nachtrag: Ich glaube, die gab es auch schon bei XE2 Pro gratis dazu. |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
IP-Works fängt mit $ 1,599 an als Singlelizenz. Bei cSharp und Mailkit gibts das alles kostenlos. SMime kann IP-Works meines Wissens nicht, Mailkit schon.
|
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
|
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Synapse?
Das wäre auch kostenfrei und vor allem sehr stabil. ![]() Ich setze Synapse in den unterschiedlichsten Bereichen sehr erfolgreich ein, war mir immer schon lieber als Indy. |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Hmm..
.. am Rande: Indy ließt nur RFC konforme .EML Dateien ein. Leider halten sich u.A. Microsoft (Outlook) nicht an die RFC... Beispiel: Lt. RFC sollen Leerzeilen im Body mit '..' gespeichert werden. MS macht nur '.' (einen Punkt). Oder es fehlt am Ende der Datei ein #13#10'.'#13#10.. Aufgrund dieser Fehler kann (oder will) Indy diese EML-Dateien nicht lesen.. Hierfür hatte ich mir für einen einfachen EML-Viewer eine Lade-Routine geschrieben, die diese Fehler vor dem Einlesen durch INDY beseitigt.. |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
|
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
Sorry hätte ich auch direkt machen können..
Delphi-Quellcode:
Hinweis:
function LoadEMFFileToMsg(AFileName: string;Msg : TIdMessage):boolean;
var tmpStringList : TStringList; tmpStream : TMemoryStream; tmpBuffer : array[0..4] of AnsiChar; i : integer; begin result := false; try if UpperCase(ExtractFileExt(AFileName)) = '.EML' then begin tmpStringList := TStringList.Create; try tmpStringList.LoadFromFile(AFileName); // Bugfix mit '.' statt '..' wenn durch Zeilenumbruch der '.' alleine in der Zeile steht // Microsoft hällt sich nicht RFC und speichert dann nur mit '.' statt '..'! for i := 0 to tmpStringList.Count -1 do begin if tmpStringList[i] = '.' then tmpStringList[i] := '..'; end; tmpStream := TMemoryStream.Create; try tmpStringList.SaveToStream(tmpStream); tmpStream.Position := tmpStream.Size -5; tmpStream.Read(tmpBuffer,5); if tmpBuffer <> #13#10'.'#13#10 then tmpStream.WriteBuffer(#13#10'.'#13#10,5); tmpStream.Position := 0; Msg.LoadFromStream(tmpStream); result := true; finally tmpStream.Free; end; finally tmpStringList.Free; end; end; except end; end; Diese Routine benutze unter Delph 6, es könnte somit Probleme mit Unicode in neueren Delphis geben ;) Indy 10. Hiermit bekomme ich eigendlich alle EMLs von Outlook oder Thunderbird geladen.. |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Zitat:
Zitat:
Delphi-Quellcode:
:zwinker:
if (tmpStringList.Count > 0) and (tmpStringList[tmpStringList.Count-1] <> '.') then
tmpStringList.Add('.'); |
AW: Ersatz von Indy mit Visual Studio 2015 und Mimekit/Mailkit
Hmm..
Ich hab mal meine eigene Routine noch mal angeschaut... eigentlich kann ich immer ein
Delphi-Quellcode:
machen, bevor ich die Stingliste in den Stream packe.
tmpStringList.Add('.');
Denn vorher werden aus allen '.' -> '..' somit würde die Abfrage nach dem '.' in der letzten Zeile eh immer false ergeben.. Ach.. Das mit Except end; war einfach nur Faulheit ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 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