Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0013: E-Mails mit Visual Basic .NET senden

 von 

Beschreibung

Dieses Beispiel zeigt, wie man mit VB.NET E-Mails erstellen und verschicken kann. Dabei können sogar Dateianhänge (Attachments) an das Mail angehängt sowie der Content-Type der Mitteilung angepasst werden (zweiteres wird hier nicht gezeigt). Es ist aber zu beachten, dass diese Funktionen erst ab Windows 2000 funktionieren.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [4,22 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Web
'

' ##############################################################################
' ################################ MainForm.vb #################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System
Imports System.Text
Imports System.Web.Mail
Imports System.Windows.Forms

' <remarks>
'   Hauptformular der Anwendung.
' </remarks>
Public Class MainForm
    Inherits System.Windows.Forms.Form


    Private Sub btnSend_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles btnSend.Click
        Dim mailmsg As New MailMessage()
        With mailmsg
            .From = Me.txtFrom.Text.Trim()
            .To = Me.txtTo.Text.Trim()
            .Cc = Me.txtCC.Text.Trim()
            .Bcc = Me.txtBCC.Text.Trim()
            .Subject = Me.txtSubject.Text.Trim()
            .Body = Me.txtBody.Text.Trim()
            Select Case Me.cboPriority.SelectedIndex
                Case 0
                    .Priority = MailPriority.Low
                Case 1
                    .Priority = MailPriority.Normal
                Case 2
                    .Priority = MailPriority.High
            End Select
            Dim s As String
            For Each s In Me.lstAttachments.Items
                .Attachments.Add(New MailAttachment(s))
            Next s
        End With
        Try
            SmtpMail.Send(mailmsg)
            MessageBox.Show("Your mail has been successfully sent!")
        Catch ex As Exception
            MessageBox.Show("The following problem occurred when " & _
              "attempting to send your mail: " & ex.Message)
        End Try
    End Sub

    Private Sub btnAddAttachment_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles btnAddAttachment.Click
        Dim ofdlg As New OpenFileDialog()
        ofdlg.CheckFileExists = True
        ofdlg.CheckPathExists = True
        If ofdlg.ShowDialog(Me) = DialogResult.OK Then
            Me.lstAttachments.Items.Add(ofdlg.FileName)
        End If
    End Sub

    Private Sub btnRemoveAttachment_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles btnRemoveAttachment.Click
        If Me.lstAttachments.SelectedIndex >= 0 Then
            Me.lstAttachments.Items.Remove( _
              Me.lstAttachments.SelectedItem)
        End If
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 23 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Stefan am 11.05.2010 um 21:10

obriger Code funktioniert nicht unter Visual Basic 2008 Express
markiert fast jede 2. Zeile als Fehler

MFG
Stefan

Kommentar von Dirk Nestl am 08.08.2008 um 21:44

Mirko gibt in seinem Kommentar eine Möglichkeit kann, wie man die Authentifizierung durchführen kann, allerdings fällt mir dabei spontan die Metapher mit den Spatzen und den Kanonen ein...

Also hier mal ein Code, den man fürs erste fast unverändert (Server, Absender, Empfänger, Anmeldedaten anpassen!) übernehmen könnte. Der Code versendet eine einfachen E-Mail unter verwendung von SMTP-AUTH:

'Neue Nachrichtenklasse erstellen
Dim MSG As New System.Net.Mail.MailMessage

'Nachrichtenklasse mit Daten füllen
MSG.From = New System.Net.Mail.MailAddress("AbsenderAdresse@Provider.de", "Name des Absenders")
MSG.To.Add(New System.Net.Mail.MailAddress("EmpfaengerAdresse@Provider2.de", "Name des Empfängers"))
MSG.Subject = "Betreff (Test-Mail)"
MSG.ReplyTo = New System.Net.Mail.MailAddress("Antwortadresse@Provider.de", "Antwort")
MSG.Body = "Dies ist der Nachrichtentext."
MSG.Headers.Add("X-Mailer", "VB.NET Test Application")

'SMTP(Serverkommunikations-)Klasse erstellen
Dim SMTP As New System.Net.Mail.SmtpClient
("smtp.provider.de", 25)

'Authentifizierungsdaten festlegen
SMTP.Credentials = New System.Net.NetworkCredential("benutzername", "passwort")

'Sendevorgang anstoßen
'Wenn dabei ein Fehler auftritt erhält der Benutzer automatisch eine Meldung
SMTP.Send(MSG)

Kommentar von Thorsten Thiel am 22.03.2008 um 09:57

Sorry, schlechtes Beispiel.

Entweder dem kompletten Code der Form veröffentlichen, oder nur die beispielfunktionen. Im jetzigen Zustand kopiert ein Anfänger den Code komplett, was logischerweise zu einem Laufzeitfehler führen muss...werden doch die Controls gar nicht erstellt.

Selbst wenn er nach einiger Handarbeit es schafft den Code zu kompilieren, wird das Beispiel trotzdem nicht funktionieren, da die meissten SMTP-Server auf Authentifizierung bestehen, was im Beispiel komplett fehlt.

Gruß Thorsten

Kommentar von ChriZ am 20.02.2007 um 21:12

Hey leute,

is doch klar das der Fehler immer wieder kommt! Solltet ihr über Router mit eurem Provider verbunden sein, so müsst ihr nicht die smtp von eurer Privaten E-Mail eingeben, sondern die von eurem Provider, besipiel:

Deine email has de bei gmx - mail.gmx.net
Dein Provider ist T-Online - mailto.t-online.de

wenn ihr jetz als smtpserver "mailto.t-online.de" eingebt funzt es!! Wenn ihr (auf dieses beispiel gesehen) den von gmx nutzen wolt, müsst ihr benutzername, passwort, und gegebenenfalls autenthifizierung mitschicken! Und das ist die stelle an der ich auch nicht weiter weiß, also, wäre geil wenn ma einer helfen könnte!

P.S.
Den trick mit .fields("XY") = "XY" hab ich auch schon probiert, geht aba leider nich bei jedem Prov!

Liebe Grüße

Chris

Kommentar von FDX am 06.10.2006 um 14:08

Bei mir klappt es in VisualStudio 2005 Express. Ich kann das Projekt öffnen, es bearbeiten, und es starten. Allerdings bekomme ich, wenn ich auf "send" klicke, den Fehler:
The following problem occurred when attempting to send your mail: Die Nachricht konnte dnicht an SMPT-Server gesendet werden. Der Transportfehlercode lautet 0x80040217. Die Serverantwort lautet 'Not available'.

Kann mir jemand helfen?

THX


MfG FDX

Kommentar von Fabian am 18.08.2006 um 18:04

Hallo,

das Sample funktioniert leider nicht unter VS 2005 Express.
Kann es jamand and VS 2005 anpassen?

Danke

Kommentar von Seipp Daniel am 14.02.2006 um 12:16



Hallo suche ein Prog. VB wo man gewicht, geschlecht und alter sowie Größe eingibt und das das BMI body mass index ausgibt ist das möglich?

WÄre nett wenn jemand ein Projekt mit mir Startet.
Ps. Habe bisher leider nur etwas Grundkenntnisse mir autodidaktisch angearbeitet. Gruß Daniel

Kommentar von Torsten Ryll am 19.01.2006 um 21:01

@Helmut
Bitte vorher auf System.web.dll referencieren.

Kommentar von helmut am 13.01.2006 um 08:30

Hallo

Wo habt ihr denn alle den "System.Web.Mail"-Namespace her? Ich hab den gar nicht. Soviel ich weiß, ist das Framework doch allgemein. Ich kann mit Visual Basic.net 2003 (Standardversion) nur auf das Framework V1.1 zugreifen und weiß nicht was ich einstellen muss damit auf das Framework 2.0 zugegriffen werden kann.

Gruß

Helmut

Kommentar von Christian am 10.11.2005 um 14:46

Hallo Leute,

ich habe hier mal eine ganz einfache Lösung für das Problem mit dieser besagten Fehlermeldung "Auf das Objekt 'CDO.Message' konnte nicht zugegriffen werden!".

Ihr müßt einfach nur das Objekt SmtpMail deklarieren.

z.B. Dim SmtpMail As Mail.SmtpMail

Kommentar von Mirko am 17.10.2005 um 10:51

Hallo,
das Problem mit :
>>Falls ihr die Fehlermeldung "Auf das Objekt 'CDO.Message' konnte nicht zugegriffen werden!" <<
hate ich auch:
Hier die Lösung:


.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Fields( "http://schemas.microsoft.com/cdo/configuration/sendusername") = "dein_username"
.Fields( "http://schemas.microsoft.com/cdo/configuration/sendpassword") = "dein_password"

Kommentar von Hascii am 30.05.2005 um 15:12

Hallo zusammen,

ich habe das problem, das ich den Smtp Server nicht direkt anspreche, sondern die E-Mail erst an einen Exchange 2k3 Server senden muss und dieser dann über einen Virtuellen Smtpport die E-Mail weiter schickt. Ein PC ist dann der jenige der die E-Mail an den Smtp Server schickt.

Ich hoffe ich habe das so erklärt, dass ihr mich verstanden habt.


Danke schon mal im vorraus.


Hascii

Kommentar von Tyson am 06.05.2005 um 11:03

Wo habt ihr denn alle den "System.Web.Mail"-Namespace her? Ich hab den gar nicht... (liegt es daran, dass ich im Moment nur die VS.NET 2003 Demo hab? Soviel ich weiß, ist das Framework doch allgemein...)

Kommentar von Uwe am 10.04.2005 um 13:31

Falls ihr die Fehlermeldung "Auf das Objekt 'CDO.Message' konnte nicht zugegriffen werden!" erhaltet, dann könnt ihr das relativ einfach lösen:
1. Ihr startet vorher einen Email-Client wie Outlook. Dort wir dann dieses Objekt erzeugt oder
2. Ihr erzeugt es in Eurem Programm einmal:

Try
If m_pCDOObject Is Nothing Then
m_pCDOObject = CreateObject("CDO.Message")
End If

Catch ex As Exception
MsgBox("Das CDO.Message-Objekt konnte nicht erzeugt werden! - Ersatzweise kann" & vbCrLf & _
"jedoch auch nur der Email-Client wie Outlook vorher gestartet werden!")
End Try


Fei mir hat das geholfen.

Kommentar von ch am 29.03.2005 um 10:33

Ich hatte ebenfalls diese Fehlermeldung: "Auf das Objekt 'CDO.Message' konnte nicht zugegriffen werden."

Nun habe ich herausbekommen, daß der Fehler erscheint, wenn in der "An-Adresse" in dem Namen ein Komma "," vorhanden ist.

So sollte z. B. "Name Vorname<a@b.de>" statt "Name, Vorname<a@b.de>" verwendet werden.

Kommentar von Ringelkrat am 27.03.2005 um 18:47

Ich glaub ich hab ne Lösung zum Problem:
Wenn man einen Router benutzt, dann kann es sein dass der Default Port (25) gesperrt ist. Wenn man den Port auf 587 (oder wars 578?) ändert, dann dürfe es wieder funktionieren.
Ich selbst habs aber nicht probiert, da ich nicht weiss, wie man den Port ändernt?

MfG Ringelkrat

Kommentar von David am 19.03.2005 um 21:03

Ich habe mal eine ganz blöde Frage zu den Vorraussetzungen: Man brauch doch dafür einen Server mit Windows 2000 und ASP-Installation, oder?
Gibt es auch eine Möglichkeit, dass ich emails ohne eigenen Windows Server versenden? Z.B. über öffentliche Mail Server, wie Gmail, Freenet, web.de u.s.w?

Kommentar von rboko am 16.03.2005 um 21:34

Habe Lösung zum Fehler: "Auf das Objekt 'CDO.Message' konnte nicht zugegriffen werden." gefunden.

Es ist der Vierenscanner (bei mir McAffee) der alle Netzwerkzugriffe über Port 25 (der Standard SMTP-Port) für die lokalen Prozesse sperrt!

In den Einstellungen des Virenscanners gibt es eine Liste mit Prozessen, bei denen eine Ausnahme gemacht wird. Dort habe ich "w3wp.exe" hinzugefügt und seitdem Funktioniert das Mailen wunderprächtig ;-)

hth

Kommentar von rboko am 16.03.2005 um 17:43

Hi Sencer,

habe genau die gleiche Fehlermeldung - leider noch keine Lösung... Verwendest Du auch den 2k3 Server?

Bisher habe ich herausgefunden, dass es ein Problem mit dem 2k3Server ist (genau der gleiche Code auf XP läuft bei mir). Sieht fast so aus, als hätte der 2k3Server etwas dagegen, dass ich etwas über den SMTP-Port schicken will. Fehlt nur noch die richtige Stelle an der man das einstellen kann...

Kommentar von Sencer Soylu am 20.02.2004 um 17:30

Hallo,
leider funktioniert das senden von Mails mit diesem Quellcode nicht!
Fehler: Auf das Objekt 'CDO.Message' konnte nicht zugegriffen werden.
?????
Was muss ich machen damit es funktioniert?
Danke.

Kommentar von Thomas am 21.09.2003 um 18:11

Hallo,

ich hatte auch die Fehlermeldung beim Versand, dass auf CDO.Message nicht zugegriffen werden kann. Das ist allerdings nur eine generische Fehlermeldung, die eine andere Exception weiterreicht. Also muss der Quelltext folgendermaßen abgeändert werden, um an die "innere" Exception zu kommen (den wahren Grund für den Fehler beim SMTP-Server).

Try
SmtpMail.Send(mailmsg)
MessageBox.Show("Your mail has been successfully sent!")
Catch ex As Exception
MessageBox.Show("The following problem occurred when " & _
"attempting to send your mail: " & ex.InnerException.InnerException.Message)
End Try

Bei mir war z.B. das "From"-Feld leer :o) Es können aber auch fehlende Zugriffsrechte auf das Mailroot-Verzeichnis sein und tausend andere Sachen...

Gruß Thomas

Kommentar von Benjamin Wagner am 15.09.2003 um 08:44

Hi,

den Tipp finde ich auch sehr gut, allerdings kann man dem Tip nicht entnehmen wie man den SMTP-Server einstellt. Nemlich so:

SmtpMail.SmtpServer = "ExchangeServer"


zu Sascha:
Versuch es mal mit einer gültigen Absenderadresse, dann klappt es auch. (z.B. x@y.de)

Kommentar von Sascha am 12.09.2003 um 19:23

Hallo,

der Tipp ist wirklich klasse und die Idee auf diese Art mails zu versenden gefällt mir gut.

Jedoch bekomme ich bei der Ausführung immer folgende Fehlermeldung:

<== SNIP ==>
Auf das Objekt 'CDO.Message' kann nicht zugegriffen werden.
<== End SNIP ==>

Ich hoff hier weiss jemand mehr mit der Fehlermeldung an zu fangen.

Danke im Vorraus
Sascha