2017-11-08 3 views
1

Ich bin neu in Outlook VBA. Ich möchte den Status einer E-Mail verfolgen, während sie die Phasen und Ordner ihres Lebenszyklus über "Entwürfe", "Ausgang" und "Gesendet" durchläuft. Von ähnlichem Interesse ist die Fähigkeit, vorhandene E-Mails zu finden und auf diese zuzugreifen, um Immobilieninformationen zu sammeln, z. B. Sendezeit. Ich habe mit dem enthaltenen Code begonnen, aber es funktioniert nicht ganz.VBA zum Erstellen und Senden von Outlook-E-Mail, und verfolgen Sie es über den Entwurf/Senden/Senden-Prozess ..?

Wie ich schnell festgestellt habe, schlägt der Do Loop in dem Moment fehl, in dem die E-Mail gesendet wird, da die Variable die Verbindung zur E-Mail trennt. Dies verursacht den Laufzeitfehler "Das Objekt wurde verschoben oder gelöscht". Außerdem gibt es ein seltsames Detail: Die Fehlernummer (Err.Number) ist jedes Mal anders, und ich frage mich, was der Designzweck ist.

Wie kann ich mit dem Versenden von E-Mails verbunden bleiben, während sie sich durch Entwürfe, Postausgang und Versendung bewegen? Ich sehe viele Erwähnungen der Variablen, die vom Mail-Element getrennt wird, aber keine Lösungen, die sich auf die Objekthierarchie verlassen und spätes Binden vermeiden, um das Problem anzugehen. Ich dachte, dass es vielleicht eine GUID oder UUID geben würde, die die Nachricht identifiziert, aber wie in der Dokumentation angegeben, können sich alle Eigenschaften wie EntryID ändern, wenn das Element verschoben wird, und solche Eigenschaften sollten nicht verlässlich sein.

Ich nehme an, mit einer tieferen Untersuchung macht dies Sinn, weil eine E-Mail nur ein Datensatz in einer Datenbanktabelle ist. Und wenn Sie Datensätze zwischen Tabellen duplizieren/löschen, können die Informationen identisch oder ähnlich sein, aber die Datensatznummer wird wahrscheinlich nicht sein. Das trifft auch andere Nägel: die gleiche E-Mail kann mehrmals gesendet werden, und kann auch in verschiedene Ordner und sogar verschiedene Konten kopiert/eingefügt werden. Nun, was ist einzigartig oder nicht ..? Wie Scifi Klone sagen, wer ist echt, und wer ist die Kopie ..?

Also, neben "bleiben" "verbunden" zu einer E-Mail, welche Eigenschaften oder Techniken können ID verwendet werden ..? Wenn es keinen "richtigen" Weg gibt, ein Mail-Element wie beschrieben zu identifizieren, ist das einzige, was mir einfällt, ein existierendes oder benutzerdefiniertes Feld, wie die "Tag" -Eigenschaft von OCX-Steuerelementen, um eine UUID einzufügen. Einige Unternehmen verwenden diese Art von Technik, indem sie eine Anruf-/Bestell-/Supportnummer in die Betreffzeile setzen, um sie dann leichter zu verfolgen.

+0

Erstellen Sie eine Klasse, und fügen Sie "MailItem" als die ereignisaktivierte Eigenschaft dieser Klasse hinzu. Behandeln Sie Ereignisse wie Öffnen/Schreiben/Senden/Speichern usw., um eine benutzerdefinierte Steuerung für den E-Mail-Lebenszyklus zu erhalten. 'EntryID' ist die eindeutige Eigenschaft für jede Postsendung. – cyboashu

Antwort

2

Erstellen Sie eine Klasse, und fügen Sie MailItem als die ereignisaktivierte Eigenschaft dieser Klasse hinzu. Behandeln Sie Ereignisse wie Öffnen/Schreiben/Senden/Speichern usw., um eine benutzerdefinierte Steuerung für den E-Mail-Lebenszyklus zu erhalten. EntryID ist die eindeutige Eigenschaft für jede Postsendung.


Seien Sie die Tatsache, vorsichtig, dass die Beitrags-ID erst nach den ersten implizit Speichern der Artikel und Änderungen erzeugt wird, wenn der Benutzer manuell das Element zwischen Ordnern bewegt.


Nach einem ist ein Beispiel für den Einstieg:

Fügen Sie eine Klasse Class1 wie diese

Option Explicit 

Public WithEvents mItem As MailItem 
Public id    As String 

Private Sub mItem_Open(Cancel As Boolean) 
    MsgBox "Mail item will be displayed." 
    id = mItem.EntryID 
End Sub 

ein Modul hinzufügen mit folgenden Code:

Option Explicit 

Sub test() 

    Dim cls As New Class1 
    Dim id As String 

    Dim outlobj As Outlook.Application 
    Dim mailobj As Outlook.MailItem 
    Set outlobj = Outlook.Application 
    Set mailobj = outlobj.CreateItem(olMailItem) 

    Set cls.mItem = mailobj 

    With mailobj 
    .Recipients.Add "[email protected]" 
    .Subject = "Test" 
    .Body = "Test Content of the e-mail." 
    .Save 
    .Display 
    id = cls.id '/ Store ID for later use. 
    Debug.Print id 
    End With 


    '/ Search that e-mail and display its body contents 
    Call Retrieve(id) 


End Sub 


Sub Retrieve(sEntryId As String) 
    Dim mailobj As Outlook.MailItem 
    Dim ns As NameSpace 

    Set ns = GetNamespace("MAPI") 
    Set mailobj = ns.GetItemFromID(sEntryId) 
    MsgBox mailobj.Body 

End Sub 

Führen Sie die s ub test

+0

Keine Notwendigkeit für "Dim outlobj als Outlook.Application" einfach verwenden Sie "Set mailobj = Application.CreateItem (olMailItem)" – 0m3r

+1

ja, nur faul sein. :) Kopieren Sie den eingefügten OP-Code. – cyboashu

+0

Ist die "Dim Outlobj als Outlook.Application" der Grund, warum es versucht, Outlook zu starten, und wirft Fehler wie "462: Remote-Server nicht verfügbar." wenn Outlook nicht schnell genug startet ..? Ich gehe davon aus, dass es eine Möglichkeit gibt, die E-Mail zu erstellen/senden, ohne Outlook zu starten, aber ich habe es noch nicht erforscht. – spinjector

Verwandte Themen