Die Community zu .NET und Classic VB.
Menü

Das Mapi-Control

 von 

Einleitung 

Verwendung

Microsoft bietet unter Windows verschiedene Möglichkeit E-Mails zu verschicken und zu empfangen. Der direkte Empfang und Versand kann z. B. über die Winsock realisiert werden; oftmals ist dieser Weg allerdings für den Laien sehr umständlich und für kleinere Projekte doch mit zu viel Aufwand verbunden, denn es gibt schließlich einfachere Wege. Einer dieser Wege ist die Nutzung des Outlook-Objekts - diese Möglichkeit kann aber nur genutzt werden, wenn Outlook auch installiert ist, Outlook Express läßt sich hierüber nämlich nicht steuern.

Der einfachste Weg e-Mails ohne Outlook zu senden und zu empfangen ist das MAPI Control. Dieses Control wird - gemäß Microsoft-Aussagen - ab Visual Basic 5.0 zu Verfügung gestellt, allerdings erst ab der Professionell Edition.

Mit freundlichen Grüßen
Björn Kirsch

Dieses Tutorial wurde am 09.11.2004 von ergänzt bzw. korrigiert.

Zu Beginn  

Voraussetzungen & Vorbereitungen
Um nun die MAPI Control in eigenen Projekten zu verwenden, muß unter "Projekt|Komponenten" die Einbindung des "Microsoft MAPI Control 6.0" erfolgen. Weiterhin sind die beiden Objekte "MAPISession" und "MAPIMessages" auf der Form unterzubringen.

SessionID, Verbindung & Mails abfragen  

Verbindung herstellen
Im ersten Schritt muß eine Verbindung zum MAPI-Objekt hergestellt werden. Dieser Vorgang wird über

MAPISession1.SignOn

intialisiert.

Die Session-ID
Jede MAPI-Sitzung bekommt eine eigene Session-ID, damit die Sitzungen voneinander unterschieden werden können und die richtigen Mails verschickt und abgefragt werden können. Die Zuordnung der MAPI-ID erfolgt über folgenden Befehl:

MAPIMessages1.SessionID

Mails abfragen
Jeder Linux-User kennt den FetchMailer. Das mag daher kommen, daß Fetch aus dem Englischen kommt und übersetzt "holen" heißt.

Aufgrund der Tatsache, daß wir mit Step two die SessionID zuordnen, können über

MAPIMessages1.Fetch

die Mails abfragen.

Möchte man nun die Anzahl der Mails wissen, so ist diese Anfrage über

MAPIMessages1.MsgCount

realisierbar.

Mails ansteuern und auslesen  

Spezielle Mail ansteuern
Soll nun eine spezielle Mails aus dem Folder angezeigt werden, so müssen wir vorher (ähnlich wie bei der Listbox) den Index dieser Mail setzen.
Der Index beginnt bei 0 und hört bei

MsgCount - 1
wieder auf. Die genaue Zuweisung kann mit wieder auf. Die genaue Zuweisung kann mit:
MAPIMessages1.MsgIndex = (Nummer der Mail - 1)

vorgenommen wurde. Die dritte Mail wird also über:
MAPIMessages1.Msgindex = 2

abgefragt.

Die angesteuerte Mail auslesen
Es genügt nicht, die Mail anzusteuern. Das Ziel ist es schließlich die Mail auch zu lesen. Hierfür stehen folgende Properties zur Verfügung:

Property Beschreibung
MAPIMessages1.RecipDisplayName Empfänger der Nachricht
MAPIMessages1.Subject Nachrichtenbetreff
MAPIMessages1.MsgOrigDisplayName Absender der Nachricht
MAPIMessages1.MsgNoteText Nachrichtentext
MAPIMessages1.MsgNoteText Nachrichtentext
MAPIMessages1.AttachmentCount Anzahl der Attachments
MAPIMessages1.AttachmentIndex Nummer des Attachments
MAPIMessages1.AttachmentName Name des Attachments (per Index gesetzt)
MAPIMessages1.Read Zustand der Mail (true = gelesen)

Mail verfassen & Session beenden  

Eine neue Mail verfassen

MAPIMessages1.Compose

gibt der MAPI die Anweisung eine neue Mail zu verfassen.
Der Empfänger der Mail wird mit
MAPIMessages1.RecipDisplayName = Empfänger (e-Mail-Adresse)

festgelegt, der Nachrichtenbetreff über
MAPIMessages1.MsgSubject = Betreff

gesetzt und der Nachrichtentext kann über
MAPIMessages1.MsgNoteText = Nachrichtentext

definiert werden. Ein Attachment kann hinzugefügt werden, in dem folgende Zeilen zum Code hinzugefügt werden:
MAPIMessages1.AttachmentName = Name des Attachments
MAPIMessages1.AttachmentPathName = Pfad + DateinameDesAttachs

Die Empfängeradresse wird über
MAPIMessages1.ResolveName

geprüft und der Mailversand erfolgt über
MAPIMessages1.Send

Session beenden
Ist man nun zufrieden mit seiner Arbeit und möchte die Session wieder beenden, so darf man nicht vergessen, die MAPI-Session über

MAPISession1.SignOff

wieder freigeben.

Einfaches Beispiel  

'-------------------- Anfang Code Form1  --------------------
Option Explicit

Dim Zaehler As Integer

Private Sub Command1_Click()
  If List1.ListCount > 0 Then
    Load Form2
    MAPIMessages1.MsgIndex = List1.ListIndex
    Form2.Text1 = MAPIMessages1.MsgOrigDisplayName
    Form2.Text2 = MAPIMessages1.MsgSubject
    Form2.Text3 = MAPIMessages1.MsgNoteText
    If MAPIMessages1.AttachmentCount > 0 Then
      For Zaehler = 1 To MAPIMessages1.AttachmentCount
        MAPIMessages1.AttachmentIndex = Zaehler - 1
        Form2.Combo1.AddItem MAPIMessages1.AttachmentName
        Form2.Combo1.ListIndex = 0
      Next Zaehler
    Else
      Form2.Combo1.Enabled = False
    End If
    Form2.Show
  End If
End Sub

Private Sub Command2_Click()
  Load Form3
  Form3.Show
End Sub

Private Sub Form_Load()
  MAPISession1.SignOn
  MAPIMessages1.SessionID = MAPISession1.SessionID
  Call MailsAbrufen
End Sub

Private Sub Form_UnLoad(Cancel As Integer)
  MAPISession1.SignOff
  Unload Me
End Sub
'--------------------- Ende Code Form1  ---------------------

'-------------------- Anfang Code Form2  --------------------
Private Sub Form_UnLoad(Cancel As Integer)
  Form2.Hide
  Unload Form2
  Call MailsAbrufen
End Sub
'--------------------- Ende Code Form2  ---------------------

'-------------------- Anfang Code Form3  --------------------
Private Sub Command1_Click()
  Form1.MAPIMessages1.Compose
  Form1.MAPIMessages1.RecipDisplayName = Text1.Text
  Form1.MAPIMessages1.MsgSubject = Text2.Text
  Form1.MAPIMessages1.MsgNoteText = Text3.Text
  Form1.MAPIMessages1.ResolveName
  Form1.MAPIMessages1.Send

  Form3.Hide
  Unload Form3
End Sub

Private Sub form3_unload(Cancel As Integer)
  Call MailsAbrufen
End Sub

'--------------------- Ende Code Form3  ---------------------

'------------------- Anfang Code Module1  -------------------
Sub MailsAbrufen()
  Form1.List1.Clear

  Form1.MAPIMessages1.Fetch
  For Zaehler = 1 To Form1.MAPIMessages1.MsgCount
    Form1.MAPIMessages1.MsgIndex = Zaehler - 1
    If Form1.MAPIMessages1.MsgRead = False Then
      Form1.List1.AddItem UCase(Form1.MAPIMessages1.MsgSubject)
    Else
      Form1.List1.AddItem Form1.MAPIMessages1.MsgSubject
    End If
  Next Zaehler
End Sub

'-------------------- Ende Code Module1  --------------------

Listing 1

Mails mit Anhang - Beispiel  

Das Tutorial wurde am 28.07.2003 um ein Beispiel erweitert. Das folgende Codesnippet zeigt Ihnen das Versenden von Mails mit Anhang (Attachment).

Private Sub Command4_Click()
MAPISession1.SignOn

    With MAPIMessages1
        .SessionID = mapSession.SessionID
        .Compose
        .MsgSubject = "RMA EasyWin"
        
        .RecipDisplayName = "rma@irgendwasa.ch"
        
        ' Space(1) ist als Platzhalter notwendig, da die
        ' Anlage bei der ersten Leerstelle platziert wird.
        .MsgNoteText = _
            Space(1) & vbCrLf & "Hallo Wyscha" & vbCrLf & vbCrLf & _
            "Anbei erhalten Sie meine Reparaturaufträge zur Bearbeitung." & _
            vbCrLf & vbCrLf & _
            "Mit freundlichen Grüssen." & vbCrLf & vbCrLf & _
            GetData(aSql:="select b1 from l") & vbCrLf & _
            GetData(aSql:="select b2 from l")
        
        ' ZIP-Datei als Anhang einfügen
        Sleep 200
        .AttachmentIndex = 0
        .AttachmentPosition = 0
        .AttachmentName = "RMAs.zip"
        .AttachmentPathName = "C:\RMAs.zip"
        
        ' Mail für evt. Ergänzungen anzeigen
        .Send vDialog:=True
    End With
End Sub

Listing 2

Korrektur vom 09.11.2004  

Entgegen der ursprünglichen Angabe, hat man nicht MAPIMessages1.RecipDisplayName = Empfänger (e-Mail-Adresse) zu verwenden. Dies würde nur in Verbindung mit MAPIMessages1.ResolveName funktionieren, und auch nur dann, wenn sich im Adressbuch ein Eintrag zu Empfänger (e-Mail-Adresse) befinden würde, da ResolveName die Daten von "Empfänger" aus dem Adressbuch sucht.

Wer E-Mails an Personen verschicken möchte, die nicht im Adressbuch enthalten sind, hat dies wie folgt zu bewerkstelligen:

MAPIMessages1.RecipDisplayName = "Max Muster"
MAPIMessages1.RecipAddress = "Max@Mustermann.de"
MAPIMessages1.RecipType = mapToList

Listing 3

Ergänzung vom 09.11.2004  

Wenn die Nachricht an mehr als eine Person geschickt werden soll, so kann man einen weiteren Empfänger wie folgt angeben:

' Einen neuen Empfänger hinzufügen
MAPIMessages1.RecipIndex = MAPIMessages1.RecipCount
' Daten angeben
MAPIMessages1.RecipDisplayName = "Marina Musterfrau"
MAPIMessages1.RecipAddress = "Marina@Musterfrau.de"
' Empfänger auf normale To-Liste setzen
MAPIMessages1.RecipType = mapToList

Listing 4

Wenn man der Nachricht noch einen Kopieempfänger hinzufügen will, soll geht dies mit folgendem Code:

' Einen neuen Empfänger hinzufügen
MAPIMessages1.RecipIndex = MAPIMessages1.RecipCount
' Daten angeben
MAPIMessages1.RecipDisplayName = "Gott"
MAPIMessages1.RecipAddress = "EsGibtNurEinenGott@AufDieserWelt.de"
' Empfänger auf CC-Liste setzen
MAPIMessages1.RecipType = mapCcList

Listing 5

Und für Blindkopieempfänger wäre da:

' Einen neuen Empfänger hinzufügen
MAPIMessages1.RecipIndex = MAPIMessages1.RecipCount
' Daten angeben
MAPIMessages1.RecipDisplayName = "Spion"
MAPIMessages1.RecipAddress = "Kryptisch@Adresse.de"
' Empfänger auf BCC-Liste setzen
MAPIMessages1.RecipType = mapBccList

Listing 6

Download  

Projekt als Download [4004 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial 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.

Outlook frägt zurück - Baur 31.07.14 16:18 5 Antworten

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 39 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 Klaus-Dieter am 22.03.2010 um 10:31

Hallo,
vielen Dank für die hilfreichen Beispiele und Kommentare.
Mein Problem wurde schon in einigen Anfragen beschrieben, aber ich kann keinen Lösungshinweis hierzu finden.
Mail soll ja laut Beschreibung ohne Outlook funktionieren.
Beim Aufruf von SignOn wird in einer Box der Benutzername, Passwort und Domaine abgefragt. Wie kann ich dies umgehen?
Im weiteren Verlauf wird beim Abrufen von Mails bei der Zuweisung des MsgIndex eine Outlook-Box geöffnet, in der nach einer Bestätigung für den Zugriff auf die in Outlook gespeicherten E-Mail Adressen gefragt wird.
Wie kann dies umgangen werden?
Ich möchte die Verarbeitung von Mails automatisieren, ohne interaktive Eingaben.
Für Hinweise wäre ich dankbar.
Mfg
Weger

Kommentar von André am 23.07.2008 um 15:30

Hallo,

erstmal super Tut, nur hab ich ein kleines Problem das gute Stück ins VS 2005 zu konvertieren, dort gibt es den Load befehl nicht mehr...

Kommentar von Peter Dambrowsky am 30.06.2008 um 18:03

Hallo,
Ich habe folgendes Problem:
Sobald ich eine Mail aus VB6 per MAPI versenden möchte, kommt sinngemäß eine Meldung von Outlook "Ein Programm versucht auf Ihre in Outlook gespeicherten Daten zuzugreifen.... Erlaubnis erteilen / Verweigern". Wenn positiv bestätigt wird, wird die Mail auch verschickt, nur die Meldung ist störend. Kann ich diese Meldung irgendwie per Programm umgehen?
MfG
Peter Dambrowsky

Kommentar von Khyal am 06.03.2008 um 08:06

Hallo Kollegen,

Ich finde Ihre Seite hervorragend.

Mfg
Khyal

Kommentar von Wilfried Wabnitz am 21.02.2008 um 09:45

Das Mapi-Control:
Wie können Unterordner des Posteingangs angesprungen werden?

MfG
Wilfried

Kommentar von Verena am 31.10.2007 um 17:49

Hallo zusammen!
Das mit dem versenden würde bei mir vermutlich schon klappen! nur wird hierfür Outlook Express verwendet. Ich greife jedoch über Citrix (Terminal Server) auf Microsoft Outlook zu. Wie kann ich das noch handeln?
Kann mir hier vielleicht jemand helfen?!

Generell würde es funktionieren weil ich testweise eben ein Konto in Outlook Express angelegt habe, nur soll meine Anwandung dann eben für diese Terminal Server Outlook Clients gelten.

Wäre super wenn ihr ne Lösung hättet.

Dankeschön

Kommentar von Eberhard Wiethoff am 23.08.2007 um 13:30

Hier eine Lösung für manche Probleme

Voraussetzungen & Vorbereitungen
Um nun die MAPI Control in eigenen Projekten zu verwenden,
muß unter "Projekt|Komponenten" die Einbindung des "Microsoft MAPI Control 6.0" erfolgen.
Weiterhin sind die beiden Objekte "MAPISession" und "MAPIMessages" auf der Form unterzubringen.







Function Mail_senden_MAPI(strAn As String, strCC As String, strBetr As String, strInhalt As String, ByVal strSendedateien As String) As Boolean
'bei strAn können mehrere E-Mail Adressen angegeben werden -- immer getrennt durch ";"
'bei strCC können mehrere E-Mail Adressen angegeben werden -- immer getrennt durch ";"
'bei strSendedateien können mehrere Dateien angegeben werden -- immer getrennt durch ";"
'Startform ist hier das Formular auf dem sich die Objekte "MAPI Session" und MAPIMessages befinden -- muss bei anderem Formularnamen getauscht werden
Dim i As Integer
Dim j As Integer
Dim strPfad As String
Dim strDatei As String
Dim strExtension As String
On Error GoTo errorhandler
If strAn <> "" And Right(strAn, 1) <> ";" Then strAn = strAn & ";"
If strCC <> "" And Right(strCC, 1) <> ";" Then strCC = strCC & ";"
If strSendedateien <> "" And Right(strSendedateien, 1) <> ";" Then strSendedateien = strSendedateien & ";"
Mail_senden_MAPI = True
With Startform
.MAPISession1.SignOn
With .MAPIMessages1
.SessionID = Startform.MAPISession1.SessionID
.Compose
.MsgSubject = strBetr
'Anzahl der Anlagen
j = 1
i = 0
Do While j > 0
j = InStr(j + 1, strSendedateien, ";")
If j > 0 Then i = i + 1
Loop
.MsgNoteText = Space(i) & vbCrLf & strInhalt ' entsprechend der Anzahl der Anlagen werde Leerzeichen am Anfang des Textes eingefügt
.MsgIndex = -1
Do While strAn <> ""
If InStr(1, strAn, ";") > 0 Then
.RecipIndex = .RecipCount
.RecipAddress = Left(strAn, InStr(1, strAn, ";") - 1)
strAn = Right(strAn, Len(strAn) - InStr(1, strAn, ";"))
.RecipType = mapToList
.ResolveName
End If
Loop
Do While strCC <> ""
If InStr(1, strCC, ";") > 0 Then
.RecipIndex = .RecipCount
.RecipAddress = Left(strCC, InStr(1, strCC, ";") - 1)
strCC = Right(strCC, Len(strCC) - InStr(1, strCC, ";"))
.RecipType = mapCcList
.ResolveName
End If
Loop
' Anlagen anfügen
i = 0
Do While strSendedateien <> ""
If InStr(1, strSendedateien, ";") > 0 Then
.AttachmentIndex = i
.AttachmentPosition = i
.AttachmentPathName = Left(strSendedateien, InStr(1, strSendedateien, ";") - 1)
FileSplit Left(strSendedateien, InStr(1, strSendedateien, ";") - 1), strPfad, strDatei, strExtension
.AttachmentName = strDatei & "." & strExtension
.AttachmentType = 0
strSendedateien = Right(strSendedateien, Len(strSendedateien) - InStr(1, strSendedateien, ";"))
i = i + 1
End If
Loop
.Send (True)
End With
End With
Ende:
Startform.MAPISession1.SignOff
Exit Function
errorhandler:
Mail_senden_MAPI = False
Select Case Err.Number
Case Is = 32001
MsgBox Err.Description, vbOKOnly, "Abbruch des E-Mail Versands"
Case Else
MsgBox Err.Description, vbOKOnly, "Fehler beim E-Mail Versand"
End Select
Resume Ende
End Function

Kommentar von Jochen Schuster am 05.07.2007 um 12:06

Ergaenzung: Im folgenden Abschnitt des Beispiels steht dieser Code: .Send vDialog:=True.
Wenn man jetzt nach dem Anzeigen der Mail einfach abbricht (also nicht auf 'Abschicken' drueckt), generiert VB einen Fehlerkode '32001'. Den kann man mit folgender Ergaenzung unterdruecken:

Am Anfang des Kodes:

On Error Goto err_fehler


Am Ende:

err_fehler:
If Err = 32001 Then Resume Next


Gruss aus Norwegen, JS

Kommentar von herbert lang am 18.06.2007 um 17:54

verwendung des mapi-controls zeigt der ausführungspfad auf jenen des jeweil verwendeten Mailprogrammes (z.b. Outlook Express)
dateien auf welche in anwenderprogramm ohne explicite Pfadangabe verwiesen wird (z.b. .\daten.mdb) werden nach der Mapi-Verwendung nicht mehr gefunden.

darauf könnte man den autor hinweisen

lg
herbert lang

Kommentar von Andreas am 24.05.2007 um 23:14

Hi,
kann man irgendwie das Absendekonto angeben.
Angenommen, man hat im Mailprogramm (hier SeaMonkey) mehrere Konten konfiguriert, zB

1)  Konto_1@EinProvider.de
2) Konto_2@AndererProvider.de

Mit der im Tutorial beschriebenen Vorgehensweise gehen standardmäßig alle Mails via dem Konto (1) raus.

Kann man das irgendwie vor dem Senden auswählen?

Kommentar von jogi am 24.05.2007 um 12:44

Hallo,
wie kann ich eine E-Mail an Outlook übergeben die dann auch noch zeitversetzt versendet wird? Also das Makro soll einen Wert (Datum mit Uhrzeit) an Outlook übergeben und Outlook diese Mail dann zu dieser Zeit versenden?
DAnke

gruß Jogi

Kommentar von Ulrich Distel am 07.03.2007 um 10:23

Zuerst: das Tutorial ist super!
Folgende Fragen:
Ich will aus meiner Datenbank heraus auf die E-Mails zugreifen und anschließend in der Datenbank speichern.
Wenn Outlook noch nicht geöffnet ist, kommt die Meldung: "Microsoft Office Outlook: Der Profilname ist ungültig, geben Sie einen gültigen Namen an". Wenn der angegeben wird ("Outlook") geht es ganz normal weiter. Kann ich diese Meldung umgehen?

Sobald aber auf die Mails tatsächlich zugegriffen wird, kommt eine Meldung von Outlook "Ein Programm versucht auf Ihre in Outlook gespeicherten Daten zuzugreifen.... Erlaubnis erteilen / Verweigern". Kann ich diese Meldung umgehen?

Wie kann ich Mails löschen?

Herzlichen Dank für Ihre Mühen

Ulrich Distel

Kommentar von wolfgang am 16.12.2006 um 01:22

Form1.MAPISession1.SignOn
Form1.MAPIMessages1.SessionID = Form1.MAPISession1.SessionID

Form1.MAPIMessages1.Compose
Form1.MAPIMessages1.RecipDisplayName = Text1.Text
Form1.MAPIMessages1.MsgSubject = Text2.Text
Form1.MAPIMessages1.MsgNoteText = Text3.Text
Form1.MAPIMessages1.ResolveName

'MAPIMessages1.AttachmentName = Name des Attachments
'MAPIMessages1.AttachmentPathName = Pfad + Dateiname_Des_Attachs

' MAPIMessages1.AttachmentName = "readme.txt"
'MAPIMessages1.AttachmentPathName = "C:\readme.txt"

Form1.MAPIMessages1.AttachmentIndex = 0
Form1.MAPIMessages1.AttachmentPosition = 0
Form1.MAPIMessages1.AttachmentName = "readme.txt"
Form1.MAPIMessages1.AttachmentPathName = "C:\readme.txt"

Form1.MAPIMessages1.AttachmentIndex = 1
Form1.MAPIMessages1.AttachmentPosition = 1
Form1.MAPIMessages1.AttachmentName = "readme1.txt"
Form1.MAPIMessages1.AttachmentPathName = "C:\readme1.txt"

Form1.MAPIMessages1.Send

Form3.Hide
Unload Form3
End Sub

alls gut

Kommentar von Damian am 25.09.2006 um 19:20

Hallo ich habe auf ein system eine Outlook laufen, ich habe in den telefon buch sehr viele empfänger ca so um die 100 stück. Nun Habe ich eure geilen mail system gefunden. Ich dachte so ich benutze die für newsleters. Nun wollte ich fragen, wäre es nicht möglich dass das Programm die email adressen aus den bereits bestehenden WAB.exe holen tue? Wäre sehr dankbar, auf ein antwort. PS. Ich könnte das wohl im code rein programieren, aber die leute ändern sich immer, manche tragen sich aus, manche wieder nicht.

MFG Damian

Kommentar von cristian am 31.08.2006 um 23:36

Hola, tengo una gran curiosidad de como poder hacer de ke con VB6.0 se conecte a otra bandeja dentro de lo ke es outlook o como dar la opcion. ya ke necesito concectarme para poder hacer esto en MAPI y poder trabajar con otra bandeja.


y lo otro como puedo hacer para ke me contabilice ke tengo correo nuevos, para diferenciar los antiguas de los nuevos, ami solo me falta hacer ke me cuente los correos no mas para enmarcarlos.

Kommentar von Bernd Gudd am 02.05.2006 um 05:44

Attachments:
Wie kann man mehr als ein Attachment anhängen?
Bekomme mit

With MAPIMessages1
' Neue Nachricht
.Compose

' 1. Anlage hinzufügen
.AttachmentIndex = 0
.AttachmentPathName = "d:\anlage1.txt"

' 2. Anlage hinzufügen
.AttachmentIndex = 1
.AttachmentPathName = "d:\anlage2.txt"

' 3. Anlage hinzufügen
.AttachmentIndex = 2
.AttachmentPathName = "d:\anlage3.txt"

' Nachricht versenden
.Send


von VB -> unbekannter Fehler.

Vielen Dank im Voraus für die Hilfe.

Bernd

Kommentar von Matthias am 13.01.2006 um 16:30

Hallo,

kann mir jemand erklären wie ich das mit den Objekte "MAPISession" und "MAPIMessages" (s.u.) machen muß, wenn ich ich Word heraus eine Formular per mail versenden möchte?

...Zu Beginn
Voraussetzungen & Vorbereitungen
Um nun die MAPI Control in eigenen Projekten zu verwenden, muß unter "Projekt|Komponenten" die Einbindung des "Microsoft MAPI Control 6.0" erfolgen. Weiterhin sind die beiden Objekte "MAPISession" und "MAPIMessages" auf der Form unterzubringen.


Kommentar von Lars Künzelmann am 12.01.2006 um 17:06

Hallo,
ich habe ein ähnliches Problem wie Joachim.
Ich habe in Outlook 3 verschieden E-Mail Konten, möchte aber via VB von einem bestimmten Konto aus die E-mail versenden.
Ist das möglich und wenn ja wie ?
Vielen Dank !
Super Seite.

Kommentar von Joachim Ochs am 20.12.2005 um 17:11

Hallo, die Seite hat mir schon sehr geholfen.
Mein Problem ist aber:
Ich habe in Outlook mehrere Konten und möchte, dass über das Mapi-Objekt nur ein bestimmtes Konto abgefragt wird. Ist das über VB möglich?

Viele Grüße

Joachim Ochs

Kommentar von Markus Gerhard am 20.12.2005 um 14:50

Hi,

schönes tutorial - hilfreich für alle, die die mapi einbinden möchten. was muss man ändern, wenn man über latebindings arbeitet? ich habe die mapi-controls nicht eingebunden, sondern verweise mittels CreateObject("mapi.session") darauf. leider scheinen dann einige befehle nicht mehr zu funzen. zz kämpfe ich damit anhänge zu versenden. ein einfaches ersetzen des controlnamens durch das objekt reicht da nämlich nicht :-(

Kommentar von Markus Franz am 11.10.2005 um 16:01

Hallo!

Als Erstes einmal vielen Dank für dieses schöne Tutorial! Nun habe ich aber noch eine Frage. Ich möchte einen Newsletter versenden. Den html Quellcode für den Newsletter habe ich. Gibt es die Möglichkeit die Emails mit den MAPI Controls zu erstellen und zu verschicken?

Ich bin am Zweifeln, ob das klappt, denn mit diesem Tutorial habe ich folgende Methode kennengelernt:
MAPIMessages1.MsgNoteText = Nachrichtentext

Mit der ich, wenn ich das richtig verstanden habe Text Emails erstellen / versenden kann. Ich stelle mir das so vor: Eine Lösung, mit der ich der zu versendenden email "sagen" kann: "Hier ist dein html Quellcode!"

Die Empfänger der Emails sollen keine Änderungen an der Mail vornehmen dürfen.

Alles in Allem: Wie kann ich Emails mit HTML Inhalt erstellen / versenden?

Vielen Dank für Eure Hilfe!

Kommentar von Klaus-Peter Schwarz am 09.09.2005 um 16:33

Habe leider auch das Problem mit dem Auslesen aus Unterordner. Ist es mit der Mapi möglich und hat schon einer so eine Möglichkeit gefunden?

Gruss Peter

Kommentar von Heinz Wienhoven am 01.09.2005 um 09:29

Hallo Zusammen,
ich habe den Code mit VB5 ausprobiert. Unter Win98 klappt das einwandfrei. Unter WinXP oder Win2000 bekomme ich folgende Fenster:
Microsoft Mail Solange Sie offline sind, können .... keine senden.
Mit OK bedstätigt kommt ein Eingabefenster "Choose Profile" und man soll den Profil Namen eingeben.
Danach wird man aufgefordert, Postoffice, Postfach und Kennwort einzugeben.

Mit Outlook werden auf den Rechnern Mails bearbeitet.

Kann mir hier jemand raten, wie ich unter WinXP und Win2000 das zum laufen bringe?
Danke
Heinz Wienhoven

Kommentar von Gabi am 05.07.2005 um 10:35

Super Tutorial!
Ich möchte eine Mail an mehrere Empfänger schicken. Allerdings erhalte ich immer eine Fehlermeldung. Woran liegt das?

Private Sub Command1_Click()

MAPISession1.SignOn
MAPIMessages1.SessionID = MAPISession1.SessionID

MAPIMessages1.Compose

MAPIMessages1.RecipIndex = 0
MAPIMessages1.RecipAddress = "empfänger1@test.com"
MAPIMessages1.RecipType = mapToList

MAPIMessages1.RecipIndex = 1
MAPIMessages1.RecipAddress = "empfänger2@test.com"
MAPIMessages1.RecipType = mapToList

MAPIMessages1.MsgSubject = Text2.Text
MAPIMessages1.MsgNoteText = Text3.Text
MAPIMessages1.ResolveName
MAPIMessages1.Send
Hide
Unload Form3
End Sub

Kommentar von Christian Stepper am 06.06.2005 um 10:05

Wie kann man eine Mail zeitversetzt senden?

Kommentar von Hanky am 27.05.2005 um 17:32

>> Welche Möglichkeiten gibt es um eine eMail
>> unbeaufsichtigt d.h. ohne Benutzerrückfrage
>> zu versenden?

Versuche:
send False
(anstatt:
send True
Der recipient etc. muss dann natürlich vorher definiert werden ...)


HTH, Hanky
http://www.voip-sip.de

Kommentar von Hanky am 27.05.2005 um 17:28

>> Ich versuche verzweifelt einen Anhang an eine Mails
>> zu binden.

Möglicherweise weil Du
AttachmentName
nicht deklarierst?

AttachmentName = Dateiname ohne Pfad
AttachmentPathName = kompletter Pfad incl.(!) Dateiname

Grüße, Hanky
http://www.voip-sip.de

Kommentar von Maxe am 27.04.2005 um 10:26

Hallo erst mal zusammen.

Ich versuche verzweifelt einen Anhang an eine Mails zu binden. Solang ich keinen Anhang definiere funktioniert alles SUPER, nur sobald ich die Befehle

.AttachmentIndex = 0
.AttachmentPosition = 0
.AttachmentPathName = "C:\temp\Test__2005_Feb_21.Q001"

mit einbinde, und dann senden will kommt immer eine Fehlermeldung.
"Ein nicht näher angegebener Fehler ist aufgetreten"
Err.Number=32002

Die Datei ist definitiv vorhanden
Ich hoffe ihr könnt mir helfen, bin schon am verzweifeln.

Gruß

Maxe

Kommentar von Anfaenger_michael am 18.02.2005 um 14:01

Moin moin,
mein Problem ist eigentlich, das obwohl ich in der
ListView mehrere Dateien angewählt habe immer nur
eine als Attachement in der Mail angezeigt wird.
Ich habe schon mit
.AttachmentIndex = 0
.AttachmentPosition = 0
expermimentiert (jeweils um 1 erhöht).
Leider ohne Erfolg !

Wo bitte mache ich den Fehler ??

Danke.

Gruss
Michael

Den Tip habe ich von hier:
http://www.activevb.de/tutorials/tut_mapi/mapi.html#anchor1

Private Sub Command1_Click()
MAPIMessages1.Compose

With MAPIMessages1
.SessionID = MAPISession1.SessionID
.Compose
.MsgSubject = "RMA EasyWin"

.RecipDisplayName = "rma@irgendwasa.ch"

' Space(1) ist als Platzhalter notwendig, da die
' Anlage bei der ersten Leerstelle platziert wird.
.MsgNoteText = _
Space(1) & vbCrLf & "Hallo Wyscha" & vbCrLf & vbCrLf & _
"Anbei erhalten Sie meine Reparaturaufträge zur Bearbeitung." & _
vbCrLf & vbCrLf '& _

For Each Item In ListView1.ListItems '11.02.2003
If Item.Checked Then
ProTabDatei$ = Item.Text 'Item.SubItems(3)
AttaIndex = AttaIndex + 1
End If
.AttachmentIndex = 0
.AttachmentPosition = 0
.AttachmentName = ProTabDatei$ '"RMAs"
.AttachmentPathName = ProTabDatei$ '"C:\assets.gif"
Next



' Mail für evt. Ergänzungen anzeigen
.Send vDialog:=True
.Save
End With

End Sub

Kommentar von JUKOM am 10.02.2005 um 09:41

Hallo,

gute Erklärung des MAPI! Danke.

Welche Möglichkeiten gibt es um eine eMail unbeaufsichtigt d.h. ohne Benutzerrückfrage zu versenden?

Für Hilfe wäre ich sehr dankbar

mfG
JUKOM

Kommentar von Otto Färber am 29.12.2004 um 17:41

Guten Tag,

erstmal meinen Respekt, tolles Forum.

Das E-Mailprojekt kann ich sehr gut gebrauchen.
Nur noch ein Problem.
Auf meinem PC ist Outlook installiert.
Ihr Projekt greift auf mein bestehendes Outlook konto zu.
Neue Mails werde im VB Projekt erst geladen wenn sie
zuvor im Outlook empfangen wurden.
Im VB Projekt steht ja auch nirgendwo wo der Mailserver sitzt.
Oben ist beschrieben mann kann mit mapi auch ohne outlook
mails senden und empfangen.

Was mache ich falsch ?

Für Hilfe wäre ich sehr dankbar

mfg
Otto

Kommentar von Martin am 23.12.2004 um 12:01

Hi!

Ich hätte eine Frage:
Dieses Beispiel greift auf den Posteingang zu, wie kann ich das selbe mit anderen Ordnern machen?

Ich wünsch euch allen frohe Weihnachten!

lg, Martin

Kommentar von Michael. am 11.11.2004 um 18:58

Gibt es einen guten MAPI Ersatz ohne Steuerelement/DLL in VB?

Kommentar von Holger Jürgensen am 01.09.2004 um 07:31

Hallo Leute,
kann man eigendlich auch den Ordner ändern aus dem die Mails via VB6 geholt werden sollen? Oder ist das in VB6 hart kodiert als INBOX.

Kommentar von Michael am 14.08.2004 um 19:08

Hi, also bei mir gibt es die Steuerelementklasse nicht! Woran kann das liegen?

Kommentar von Elmar am 15.03.2004 um 23:06

hallo,
bin auch gerade beim ausprobieren von MAPI. und auch bei mir kommt auf meinem produktionsrechner beim senden mit anhang der fehler 32002. auf dem entwicklungsrechner passiert das nicht, obwohl auf den produktionsrechner auch VB installiert ist.

was ich festgestellt habe, daß es genau beim senden zum fehler kommt, sobald ein anhang dran ist.

kann jemand weiterhelfen?

Kommentar von Jan - Hendrik M. am 22.02.2004 um 17:08

Hallo !!

schönes Tutorial aber leider läuft bei mir die Beispielanwendung nicht. Es kommt zu einem Fehler Nr 32002 'Ein nicht näher angegebener Fehler ist aufgetreten' bei der Fetch Methode und bei der ResolveName Methode. Woran könnte das liegen ??? Muss ISS installiert sein ???

Kommentar von TomDraeger am 11.12.2003 um 21:12

Ich habe die Attachment-Funktion wie oben in Benutzung.
Wenn mann jetzt mehrere Atts anhängt gelingt dies erfolgreich, jedoch wird in der Mail nur vom letzten Anhang das richtige Icon angezeigt (alle anderen haben dieses "ich-weiß-nicht-was-du-bist" Icon.
Weiß jemand eine Lösung ???

Kommentar von Bürgermeier am 03.12.2003 um 13:02

Gute Seite, eine Frage:

wie speicher ich einen Anhang ab, den ich wie oben von einer Mail erhalten habe ?
Ziel:
Datenbankanwendung, Abfrage nach neuen Mails, wenn neue Mail dann:

Texte auslesen in eine Datei schreiben und in Datenbank verwalten.
Anhänge auf ein festes Laufwerk sichern.
sprich :

save AttachmentName as x:\Mail1.zip

Ist das möglich ?