Email mit Standard-Email-client versenden, aber mit Anhang und ohne MAPI

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Email mit Standard-Email-client versenden, aber mit Anhang und ohne MAPI

    Hallo Leute,

    ich habe eine Email-Adresse und ein PDF-Dokument (oder auch eine andere Datei).
    Nun möchte ich aus meiner VB.NET Anwendung diese Datei an die angegebene Email-Adresse versenden. Aber nicht direkt, sondern es soll eine neue Email im Standard-Email-Client aufgehen wo der Empfänger bereits eingetragen ist, optimalerweise ein vordefiniertes Betreff schon drinsteht und die Datei im Anhang ist.

    Der User soll dann seine Email-Nachricht manuell schreiben und absenden.

    Früher ging das einmal ganz nett mit MAPI32. Aber seit den neuen Office- und Outlook Versionen funktioniert das nicht mehr.
    Zudem wäre es schön, nicht nur auf Office Outlook beschränkt zu sein, sonder auch jeden anderen Email-Clienten damit verwenden zu können (Outlook-Express, Thunderbird etc..).

    Habt Ihr eine Idee ob das möglich ist und wie?

    LG Roland

    *Topic verschoben*
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @dive26 Ich hab mal ne Runde gesucht.
    Wie es aussieht, funktioniert alles bis auf den Anhang:

    VB.NET-Quellcode

    1. Dim address = "a.b@c.de"
    2. Dim betreff = "Betrifft Test"
    3. Dim txt = "bla bla bla"
    4. Dim pfad = "C:\Temp\Dokument.pdf" ' der kommt nicht
    5. Process.Start("mailto:" & address & "?subject=" & betreff & "&body=" & txt & "&Attach=" & pfad)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Zum einen ist da das MailTo Protokoll, das mit Process.Start() den eingestellten Standard-email Client aufruft, mitsamt Empfänger, Titel und Text bereits ausgefüllt:
    dotnet-snippets.de/snippet/mailto-protokol-url-erzeugen/4883
    Anlagen muss der User dann jedoch noch selbst hinzufügen.

    Oder aber du baust einen kleinen E-Mail Editor, und schickst die E-Mail dann selbst an den SMTP Server:
    docs.microsoft.com/de-de/dotne…ent?view=netframework-4.8
    Vielen Dank @RodFromGermany and @EaranMaleasi

    Oder aber du baust einen kleinen E-Mail Editor, und schickst die E-Mail dann selbst an den SMTP Server:

    Das wäre die letzte Option. Weil mit eigenen SMTP-Versand hat man immer wieder Probleme mit verschiedenen Email-Anbietern. Zumindest habe ich diese Erfahrung gemacht.
    Oder habt Ihr eine Idee wie ich mit .NET SMTP Gmail oder GMX Mails versenden kann?

    Folgender Codes und "Settings" funktionieren mit meinem eigenen Mailserver auf Port 25 aber nicht mit z.B. Gmail:

    VB.NET-Quellcode

    1. Dim message As New MailMessage("software.2018.wn@gmail.com", "info@bonit.at", "Betreff", "Email von software.2018.wn@gmail.com an info@bonit.at mit Anhang") With {.IsBodyHtml = False}
    2. Dim smtp As New SmtpClient
    3. With smtp
    4. .Credentials = New NetworkCredential("software.2018.wn@gmail.com", CreateSecureString("sagichnicht"))
    5. .EnableSsl = True
    6. .UseDefaultCredentials = False
    7. .Host = "smtp.gmail.com"
    8. .Port = 465
    9. End With

    VB.NET-Quellcode

    1. Private Function CreateSecureString(clearText As String) As SecureString
    2. Dim secString As New SecureString()
    3. For Each c As Char In clearText
    4. secString.AppendChar(c)
    5. Next
    6. Return secString
    7. End Function


    Ich hätte zwar auch noch ein Mail-Plugin, aber wenns mit den .NET Hausmitteln auch ginge, würde ich mir das sparen.


    Ich hab mal ne Runde gesucht.

    Ja, so weit war ich auch schon. Funktioniert 100% mit allen Mailclients, aber leider 100% nicht mit Anhängen ;-).
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „dive26“ ()

    dive26 schrieb:

    .Host = "smtp.gmail.com"
    .Port = 465
    Hast du auch mal smtp.googlemail.com
    und/oder Port 587 versucht?

    Ansonsten ein Beispiel:
    emailarchitect.net/easendmail/kb/vbnet.aspx?cat=2

    Wenn das alles nicht funktioniert, musst du das OAuth-Protokoll verwenden:
    emailarchitect.net/easendmail/sdk/?ct=object_oauth
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    @petaod Vielen Dank!

    Ich habe alle Kombinationen von Host, Port und ServicePointManager.SecurityProtocol = SecurityProtocolType ausprobiert.
    Bei Gmail ohne Erfolg (bei einigen Kombinationen kommt die Fehlermeldung im Screenshot).

    Bei der Recherche bin ich überall auf das selbe Problem gestoßen - es scheint keine .NET Funktionen zu geben mit denen man das ohne Drittanbieterkomponente machen könnte.

    Eine Drittanbieterkomponente habe ich sowieso - aber die wollte ich mir sparen.
    Ich verstehe nicht, dass Microsoft in den aktuellen .NET Versionen das nicht richtig einbauen kann ...
    Bilder
    • 06022020114542.jpg

      34,02 kB, 409×159, 112 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich habe alles ausprobiert was geht und bin bei zwei Varianten angekommen, welche ich beide verwenden werde.

    1. Wenn MS Outlook installiert ist

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Versendet eine Email mit Microsoft Outlook
    3. ''' Option Stict muss leider "OFF" bleiben wegen später Bindung
    4. ''' </summary>
    5. ''' <param name="an"></param>
    6. ''' <param name="cc"></param>
    7. ''' <param name="bcc"></param>
    8. ''' <param name="betreff"></param>
    9. ''' <param name="inhalt">Inhalt in Textform - Zeilenumbrüche werden automatisch durch BR ersetzt</param>
    10. ''' <param name="anhang">Stringarray mit Pfad- und Dateinamen</param>
    11. Public Sub NeueEmailMitOutlookVersenden(an As String, cc As String, bcc As String, betreff As String, inhalt As String, anhang() As String)
    12. Dim outlookapi As Object
    13. Dim outlookItem As Object
    14. outlookapi = CreateObject("Outlook.application")
    15. outlookItem = outlookapi.createitem(0)
    16. With outlookItem
    17. .Subject = betreff
    18. .To = an
    19. .cc = cc
    20. .bcc = bcc
    21. If inhalt <> "" Then .HTMLbody = inhalt.Replace(vbCrLf, "<br>")
    22. For i As Integer = 1 To 9
    23. If anhang(i) <> "" Then .Attachments.Add(anhang(i))
    24. Next
    25. .display
    26. End With
    27. outlookapi = Nothing
    28. outlookItem = Nothing
    29. End Sub


    2. Wenn kein Email-Client installiert ist versende ich die Emails mit Anhang und HTML-Body mit der Komponente Imports Limilabs.Client.SMTP direkt aus meiner Anwendung heraus. Damit habe ich schon sehr gute Erfahrungen gemacht und die ermittelt die SSL-Verbindungen automatisch. Diese Komponente funktioniert mit Gmail, GMX und allen anderen Emailanbietern einwandfrei. Da muss ich zwar noch einen Email-Editor dazu basteln, aber das ist schnell passiert.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    dive26 schrieb:

    VB.NET-Quellcode

    1. ''' Option Stict muss leider "OFF" bleiben wegen später Bindung
    Wenn Du mit

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.Office.Interop.Outlook
    3. Imports System.Reflection
    4. Imports System.Runtime.InteropServices
    arbeitest, geht das auch mit Strict On:

    VB.NET-Quellcode

    1. ' Outlook als Objekt festlegen
    2. Dim objOutlook As Outlook.Application
    3. ' ...
    4. Dim xxx = Marshal.GetActiveObject("Outlook.Application")
    5. objOutlook = DirectCast(xxx, Microsoft.Office.Interop.Outlook.Application)
    6. ' ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Super, danke @RodFromGermany. Werde ich nachher gleich ausprobieren.

    Was ist aber, wenn ein Rechner die Microsoft.Office.Inerop nicht installiert hat? Wir verwenden oft LTSC Windows-Versionen. Startet da die Anwendung überhaupt oder gibt es auch erst den Fehler beim Prozeduraufruf?
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 diese Interop sind .NET-DLLs, die aus OCX-DLLs generiert werden.
    Und die OCX'se sollten eigentlich da sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany, @ErfinderDesRades hat es in einem ältern Thread bereits treffend beschrieben, warum das "frühe" Binden nicht ganz so gut sein kann - wegen der Office-Versionen und falls mal gar kein Office insalliert:

    Wenn man dieses Programm jetzt auf einem anderen PC ausführt, wo nur z.B. Office 2003 drauf ist. Funktioniert das ganze Programm nicht mehr. Daher ist es bei Office-Verweisen gar nicht so schlecht, wenn man Späte Bindung verwendet. Dann muss man halt Option Strict für dieses Projekt ausschalten oder noch besser, nur Späte Bindung zulassen.


    Da es mit später Bindung und Option Stict Off funktioniert, lasse ich es mal so. Ist ohnehin nur ein kleines und überschaubares Modul. Zur Kontrolle der anderen Funktionen darin kann ich Option Strict ja kurzfristig auf on stellen. Danke aber trotzdem für das Aufzeigen aller Möglichkeiten.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at