Mail erstellen und darstellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von strzata.

    Mail erstellen und darstellen

    Guten Abend,
    ich suche nach einer Möglichkeit, eine selbst erstellte Mail ohne Client darzustellen.
    Das Erstellen geschieht in etwa so:

    VB.NET-Quellcode

    1. message = New MailMessage(from, to)
    2. message.Body = "Abrechnung"
    3. attachment = new Attachment("myFile")
    4. message.Attachments.Add(attachment)
    5. message.Headers.Add("Subject", "Lieferung")

    Das ist nur das Grundgerüst. Header und Body sind viel umfangreicher und es kommen auch noch Mime.ContentTypes und Encodings hinzu.
    Versendet wird die Mail dann über die Telematik (KIM). Ich muss sie vorher als eml auf die Platte speichern, um sie zu prüfen und zu archivieren. Könnte das ohne einen Client gehen? Gibt es eine App, die mir die Daten als Mail anzeigt. Oder kann das vielleicht VisualStudio auch selbst irgendwie? Hab schon im Netz gesucht, aber nichts gefunden.

    Wäre toll, wenn ihr mir mal wieder auf die Beine helfen könntet.
    Viele Grüße
    Norbert

    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Du willst das über KIM/die TI machen? Die Gematik hat ja dazu extra bei den Usern Thunderbird installiert und mit Zertifikaten und wasweißich versehen, damit es mit der TI und den SMB-/SMCB-/HBA-Kartenlesern kommuniziert, um die Sicherheit und den Zugang zum TI-Netzwerk sicherzustellen. Ich kenne bisher keinen Weg, aber mir wäre es zu heikel, da was zu machen. Das soll eine gesicherte Infrastruktur bleiben. Daher werd ich mich zumindest nicht daran beteiligen, da quasi einen Bypass zu finden.
    Es ist hier nicht Deine Frage, aber Mailvorlagen in Thunderbird kommen nicht infrage? Das wäre thoeretisch eher mein Weg, dass ich versuche, Thunderbird diesbezüglich zu automatisieren, als da eine mögliche Sicherheitswand aufzubrechen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank für die schnelle Antwort. Ich glaube aber, Du hast mich etwas missverstanden. Ich will nichts "aufbohren". Ich erstelle nur die Mail mit den Daten und per Klick wird alles an den KIM-Client geliefert, der das verschlüsselt - signiert - und in die TI schickt. Der KIM-Client ist eine Blackbox (Software), da kann man nichts manipulieren. Das funktioniert problemlos und ist absolut safe. Ich hätte nur gern die Mail vor dem Senden nochmal zu Gesicht bekommen, unverschlüsselt, so wie ich sie erstellt habe.
    VG
    Dementsprechend geht es eher darum, eine Mail vorzubereiten und diese an das eigentliche Programm zu senden. Danns tellt sich die Frage, ob es Thunderbird ist oder ein anderer Mailclient. Die werden sicherlich unterschiedlich angesprochen. Dazu gibt es bestimmt was im Netz.
    Also nur zur Sicherheit, was ich verstanden habe, Du machen willst:
    • Mail im eingenen Programm erstellen
    • diese prüfen/archivieren
    • auf Knopfdruck zum TI-Mailclient schicken
    • Mail ggf. automatisch, notfalls manuell versenden
    Wenn das stimmt: Welcher Mailclient soll angesprochen werden?
    Oder alternativ: Sowas wie das hier zum Erstellen von eml-Files hattest Du schon probiert?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn das stimmt
    Ja bis auf den vierten Punkt genau so. Ich sagte ja - möglichst kein Client. Ich bin vielleicht sehr naiv, wenn ich glaube, dass das möglich ist. Die Mail zusammenzubasteln war ja kein Hexenwerk. Nur wenige Zeilen Code. Aber die Mail dann darzustellen - dazu hab ich keine Idee. Da in VS programmiert, dann vielleicht als Bypass doch den SMTP von .Net benutzen? Könnte ich dann die Mail erstmal an mich persönlich senden und mit z.B. Thunderbird öffnen, bevor sie in die TI geht? Muss dieser Umstand wirklich sein?

    Hatte wieder mal nicht das Gehirn eingeschaltet und zu schnell geantwortet. Oder hast Du den Link später eingefügt. Ich hatte ihn nämlich vorher nicht gesehen. Hab kurz reingeschaut. Also wenn es in VS das wirklich gibt
    mailMessage.ToEml()
    dann bin ich aus dem Schneider. Hab jetzt leider schon VS runtergefahren. Schaue ich mir morgen gleich an.
    Wo Du nur sowas alles ausgräbst ... ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „strzata“ ()

    Danke. Ist für Testzwecke keine schlechte Idee. Aber wir haben Anwender, die unser PVS fahren. Denen kann ich das so nicht anbieten. Bei allen anderen Dokumenten in der TI (eAU, eRP, eAB, ePA) gibt es StyleSheets, mit denen man sich den Inhalt ansehen kann, bevor man auf "Senden" klickt. Es ist immer möglich, dass noch ein Fehler drin ist, den man dann korrigieren kann (z.B. Tippfehler, Zahlendreher usw.). So stelle ich mir das auch bei den eMails vor. Einen eigenen StyleSheet zu schreiben übersteigt meine Fähigkeiten. Ich möchte auch jetzt zum Erstellen bei VS bleiben, da der Bereich Mail eine Klasse in einer großen App ist.

    Habs mal auf die Schnelle mit dem Link in #4 versucht. Der MailWriter von Net.Mail könnte erfolgversprechend sein. Leider streiken alle Online Converter (C# to VB.Net) und es bedarf doch noch etwas Zeit, um das zu coden. Wenn jemand ein Codeschnipsel für VB hat wäre das toll. Ich kann erst morgen weitermachen. Muss jetzt 500 qm Rasen mähen, sonst wachsen wir zu ...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „strzata“ ()

    Pfeif aufs Gras, das hier ist viel heisser :)
    Habs gefunden. Zwei Zeilen Code! Nachdem ich die gesamte Mail zusammengestellt habe folgen nur noch

    VB.NET-Quellcode

    1. client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory
    2. client.PickupDirectoryLocation = "c:\temp"

    Und natürlich: client.Send(message)
    Ein Doppelklick auf die Datei in C:\Temp und mein Mailprogramm zeigt mir alles astrein an. Ich könnte auch die Mail im Code programmgesteuert vor dem Versenden anzeigen.
    Vielen Dank für eure Mühe.
    Norbert
    Dateien
    • mail.png

      (1,39 MB, 13 mal heruntergeladen, zuletzt: )
    Na, so einfach wars dann doch nicht. Mit meiner Methode wird die Mail zwar gespeichert, aber ich hatte keinen Einfluss darauf, unter welchem Namen dies geschieht. Es wurde eine Zufalls-GUID genommen. Ich brauche den Namen aber fürs Archiv-Grid.

    Glücklicherweise hat das auch schon vor mir einige Programmierer frustriert und sie haben Code veröffentlicht, der das Problem löst. Jetzt kann ich mit
    save(message, Filename)
    meine Mail so speichern, wie ich das will.
    Wenn es jemand braucht, hier eine sehr gute Lösung:

    VB.NET-Quellcode

    1. MailMessageExtension.Save(message, Application.StartupPath & "\OneClick\Outbox\" & sendID & ".eml")
    2. Module MailMessageExtension
    3. <Extension()>
    4. Public Sub Save(ByVal msg As MailMessage, FileName As String)
    5. Dim asm As Assembly = New SmtpClient().GetType().Assembly
    6. Dim _mailWriterType As Type = asm.GetType("System.Net.Mail.MailWriter")
    7. Using _fileStream As FileStream = New FileStream(FileName, FileMode.Create)
    8. Dim _mailWriterContructor As ConstructorInfo = _mailWriterType.GetConstructor(BindingFlags.Instance Or BindingFlags.NonPublic,
    9. Nothing, New Type() {GetType(Stream)}, Nothing)
    10. Dim _mailWriter As Object = _mailWriterContructor.Invoke(New Object() {_fileStream})
    11. Dim _sendMethod As MethodInfo = New MailMessage().GetType().GetMethod("Send", BindingFlags.Instance Or BindingFlags.NonPublic)
    12. Dim _closeMethod As MethodInfo = _mailWriter.GetType().GetMethod("Close", BindingFlags.Instance Or BindingFlags.NonPublic)
    13. _sendMethod.Invoke(msg, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {_mailWriter, True, True}, Nothing)
    14. _closeMethod.Invoke(_mailWriter, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {}, Nothing)
    15. End Using
    16. End Sub