SMTP Mail mit Anhang versenden

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

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von dopppartze.

    SMTP Mail mit Anhang versenden

    Hallo,

    ich möchte auf meiner Anwendung über SMTP (Mit Verschlüsselung) eine Mail per SMTP versenden.

    Genutzt habe ich hierfür diesen Code (ja, dieser ist "zusammenkopiert"):

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Msg As New MailMessage
    3. Dim myCredentials As New System.Net.NetworkCredential
    4. myCredentials.UserName = "absender@mail.tld"
    5. myCredentials.Password = "Passwort des Absenders"
    6. Msg.IsBodyHtml = False
    7. Dim mySmtpsvr As New SmtpClient()
    8. mySmtpsvr.Host = "imap.sender.tld"
    9. mySmtpsvr.Port = 993
    10. mySmtpsvr.EnableSsl = True
    11. mySmtpsvr.UseDefaultCredentials = False
    12. mySmtpsvr.Credentials = myCredentials
    13. Try
    14. Msg.From = New MailAddress("absender@mail.tld")
    15. Msg.To.Add("Empfänger@mail.tld")
    16. Msg.Subject = "Betreff"
    17. Msg.Body = "Inhalt"
    18. Msg.Attachments.Add((TextBox1.Text))
    19. mySmtpsvr.Send(Msg)
    20. MsgBox("E-Mail gesendet.", MsgBoxStyle.Information, Title:="Information")
    21. Catch ex As Exception
    22. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString) 'Falls ein Fehler auftritt wird eine MsgBox angezeigt
    23. End Try
    24. End Sub


    In der Textbox1 (wird noch durch ein Combofeld ersetzt) soll der Pfad zur Datei ausgewählt werden.

    Wenn ich das nun aber so starten will, bekomme ich folgenden Fehler:
    Fehler BC30311 Der Wert vom Typ "String" kann nicht in "Attachment" konvertiert werden. WindowsApp2 C:[Pfad]\Form1.vb 21 Aktiv


    Jemand eine Idee?

    Grüße!
    Moin,

    joa. Die Fehlermeldung sagt ja alles. Du willst dort nur nen String rein packen. Das geht ja nicht.
    MailMessage.Attachments.Add() erwartet ein Attachment Object also musst du so eines auch mit geben.

    Siehe Attachment Class dort ist auch ein Code Beispiel mit nem File: docs.microsoft.com/de-de/dotne…t?view=netframework-4.7.2

    Dann sehe ich hier wieder nen nicht so tolles Try-Catch und MsgBox das ist VB6 lies dir da mal bitte beide Links in meiner Signatur durch.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Hey

    NoIde schrieb:

    guggst du hier:

    Sorry, wenn ich jetzt wahrscheinlich total Dämlich frage (Dürfte auch an dem liegen, was unter meinem Profilbild steht ;) ), aber wie kann ich die Variable dann befüllen. Der Beispielcode wird für mich auch mit nem Converter (dass ich da nen VB.NET Code habe) nicht wirklich aufschlussreich.

    Bei "Msg.Attachments.Add("C:\Pfad")" bekomme ich weiterhin die Meldung.

    Grüße und Danke!
    Ich bin mal nett heute:

    VB.NET-Quellcode

    1. Dim _filePath As String = "file.txt"
    2. Dim _attachment As Attachment = New Attachment(_filePath, MediaTypeNames.Application.Rtf)
    3. Dim message As MailMessage = New MailMessage()
    4. message.Attachments.Add(_attachment)
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Dies überlasse ich nun dir das raus zu finden. Ich denke mal selber einen Klassennamen + VB.net in Google einzugeben
    bzw in den Docs zu suchen sollte jeder können oder?
    Ist auch nicht böse gemeint aber wenn man alles vorkaut lernt man nicht ;)
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    Ist auch nicht böse gemeint aber wenn man alles vorkaut lernt man nicht

    Alles Gut. Nur leider sind die Hilfeseiten von MS zu dem Zeug nicht wirklich Hilfreich.

    Gibt die Art der Anwendungsdaten in der Anlage einer E-Mail an.

    Ja.. Und?

    Ich weiß nicht, obs daran Liegt, aber ich hab die Erweiterung ja raus genommen, weil man ja alles versenden können soll.

    Email wird nun auch versendet, nur eben Ohne Anhang :D

    Grüße!

    Nochmal sorry, wenn ich mich bedeppert anstelle, aber ich bin IT-Seitig eher die "andere" (admin-)Fraktion ;)

    HeizungAuf5 schrieb:

    weil man ja alles versenden können soll.


    Ich kenn mich mit dem Mail-Zeugs in .vbnet nicht wirklich aus, aber du kannst ZIPs senden, vorher ein Archiv packen mit einer beliebigen Datei(oder auch mehrere)
    docs.microsoft.com/de-de/dotne…e?view=netframework-4.7.2
    und das anhängen. So einfach kann es sein.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Dafür gibt es ja sogar den pdf Type zum auswählen.
    Und ansonsten wenn du nicht weißt was versendet wird gibt es da noch einen Type zur auswahl.

    Dieser besagt: "Specifies that the MediaTypeNames.Application data is not interpreted."
    Mit diesem kommt bei mir alles an per Mail mit Anhang.

    Du musst dir doch einfach nur mal die Seite durchlesen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    Du musst dir doch einfach nur mal die Seite durchlesen.


    Das habe ich nun mehrfach getan. Dort steht, dass ich die Klasse mit Public Class MediaTypeNames erstellen kann. Aber dann? Ich kann die Klasse ja nicht leer lassen?

    Ich weiß, jeder der sich damit mehr auskennt als ich wird mich nun auf den Mond jagen :D

    Ich will doch nur, dass der Mist funktioniert ;(
    Hallo,

    was ich noch gefunden habe: ein Imports System.Net.Mime am Anfang löst die Fehlermeldung (wurde mir von VS empfohlen).

    Mails versenden klappt nun auch, nur leider Ohne Anhang.

    Zur Übersicht meine aktuelle sendfax() Sub

    VB.NET-Quellcode

    1. Sub sendfax()
    2. Dim Msg As New MailMessage
    3. Dim myCredentials As New System.Net.NetworkCredential
    4. Dim _filePath As String = "C:\Test\test.pdf"
    5. Dim _attachment As Attachment = New Attachment(_filePath, MediaTypeNames.Application.Rtf)
    6. Dim message As MailMessage = New MailMessage()
    7. myCredentials.UserName = "absender@mail.tld"
    8. myCredentials.Password = "Mail.Passwort"
    9. Msg.IsBodyHtml = False
    10. Dim mySmtpsvr As New SmtpClient()
    11. mySmtpsvr.Host = "smtp.mail.de"
    12. mySmtpsvr.Port = 25
    13. mySmtpsvr.EnableSsl = True
    14. mySmtpsvr.UseDefaultCredentials = False
    15. mySmtpsvr.Credentials = myCredentials
    16. Try
    17. Msg.From = New MailAddress("absender@mail.tld")
    18. Msg.To.Add("empfänger@mail.tld")
    19. Msg.Subject = "Betreff"
    20. Msg.Body = "Inhalt"
    21. 'Msg.Attachments.Add(("pfad"))
    22. message.Attachments.Add(_attachment)
    23. mySmtpsvr.Send(Msg)
    24. MsgBox("E-Mail gesendet.", MsgBoxStyle.Information, Title:="Information")
    25. Catch ex As Exception
    26. MsgBox(Err.Number & ex.Message & ex.StackTrace.ToString) 'Falls ein Fehler auftritt wird eine MsgBox angezeigt
    27. End Try
    28. End Sub


    Das PDF liegt auch definitiv an der Stelle ;)

    Grüße und Danke!

    HeizungAuf5 schrieb:

    Dim _attachment As Attachment = New Attachment(_filePath, MediaTypeNames.Application.Rtf)


    Nochmal: Hast Du mal bei MediaTypeNames.Application.... das Rtf weg gemacht, den Punkt neu gesetzt und geschaut, welche Möglichkeiten dir die IDE (also IntelliSense) anbietet?

    Rtf ist halt auch kein Pdf
    "Hier könnte Ihre Werbung stehen..."
    MediaType kann man angeben, muss man aber nicht.

    VB.NET-Quellcode

    1. Dim msg As New Net.Mail.MailMessage
    2. msg.Subject = "Attachment test"
    3. msg.Body = "smtp mail with attachment."
    4. msg.From = senderAddress
    5. msg.To.Add(receiverAddress)
    6. msg.Attachments.Add(New Net.Mail.Attachment("D:\Temp\Invoice.pdf"))
    7. msg.Attachments.Add(New Net.Mail.Attachment("D:\Temp\LocalDoc.zip"))
    8. msg.Attachments.Add(New Net.Mail.Attachment("D:\Temp\network-todo.docx"))
    9. msg.Attachments.Add(New Net.Mail.Attachment("D:\Temp\network-printer.xlsx"))
    10. client.Credentials = smtpCred
    11. client.EnableSsl = True
    12. Try
    13. client.Send(msg)
    14. Debug.Print($"Message sent at {Date.Now.ToString}")
    15. Catch ex As Exception
    16. Debug.Print(ex.Message)
    17. Debug.Print(ex.StackTrace)
    18. End Try


    So klappt es bei mir problemlos. Siehe screenshot.

    Jou das is richtig.

    Allerdings hätte er das ja gewusst wenn er sich mal die dinge anschaut die ihm die IDE sagt.
    Ich weiß das klingt hart aber alles vorkauen ist auch doof.

    Ausserdem ist dein Try-Catch nicht grad schön @xtts02 fange lieber spezifisch die exception ab nicht einfach alles.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Also wenn der Code im Eingangsthread richtig ist, können

    VB.NET-Quellcode

    1. mySmtpsvr.Host = "imap.sender.tld"
    2. mySmtpsvr.Port = 993


    nicht funktionieren.

    Imap ist ein Posteingangsprotokoll und 993 ist der Port für verschlüsselten Emailabruf per IMAP.

    Mails versenden kann man weder mit dem Imap-Protokoll noch über Port 993.

    Gruß, Volkmar