Announcement

Collapse
No announcement yet.

Outlook Format für Datum

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Outlook Format für Datum

    Hi,

    in einem Programm möchte ich nach Mails suchen, die eben gerade abgesendet wurden (ich versuche sie durch Subject und CreationTime zu identifizieren, EntryID bleibt beim Wechsel von Draft zu SentItems ja nicht erhalten. Hierzu möchte ich die Find-Methode des SentItems-Ordners nutzen.

    Die Funktionsbeschreibung sagt mir, ich müsse den Timestamp so formatieren, wie Outlook es erwartet, da ich die Anfrage als String übergeben muss, also

    [highlight=vb.Net]
    m_send (Event-Handler für das Send-Event):
    Dim CreationTimeWhenSent as Date = m.CreationTime
    Dim SubjectWhenSent As String = m.Subject

    m_Close (Event Handler für das Close-Ereignis):
    Dim o As Outlook.Application = GetObject(, "Outlook.Application")
    Dim DatumFormat as String = ???
    Dim FilterString As String = "[Subject]='" & SubjectWhenSent & "' And [CreationTime]='" & Format(CreationTimeWhenSent, DatumFormat) & "'"

    Dim ret As MailItem= o.Application.Session.GetDefaultFolder(Outlook.OlD efaultFolders.olFolderSentMail).Items.Find(FilterS tring)
    [/highlight]

    Die Frage ist nun, was setze ich bei den drei Fragezeichen rein? ein festes Format wäre schlecht, dann hat jemand sein Outlook oder das System anders eingestellt, und schon geht's schief. Kann ich das aktuell eingestellte Format beim System nachfragen? Oder kann ich hier einfach CreationTimeWhenSent.ToString() setzen, und darauf vertrauen, dass Outlook und die VisualBasic-Umgebung zu diesem Zeitpunkt auf die gleiche Formatierung (weil in den Systemeigenschaften eingetragen) zugreifen?

    Ich hoffe es kann mir jemand helfen.
    Martin Dietz

    ---------------------
    Ich musste gerade feststellen, dass es mir anscheinend nicht einmal gelingt, vom noch nicht abgesendeten MailItem die CreationTime zu erfragen. Ich erhalte den 1.1.4501. Gibt es eine Möglichkeit dieses Query so zu formulieren, dass ich grundsätzlich nach der neuesten Mail mit dem angegebenen Subject suchen kann, oder muss ich mit FindNext alle durchgehen und nur den neuesten behalten?
    Zuletzt editiert von M.Dietz; 23.02.2009, 09:35. Reason: Erweiterung der Frage

  • #2
    Hi,

    Kleines Update zu dieser Frage: ich habe es jetzt so umgestrickt, dass ich per Find() und FindNext() den Sent-Ordner durchsuche, das MailItem mit dem größten Erstellungszeitstempel behalte, und wenn dieser Zeitstempel älter als 5 Minuten ist die Mail als nicht gefunden behandele. Dabei ist mir etwas aufgefallen:

    [highlight=vb.net]
    Dim o As Outlook.Application = GetObject(, "Outlook.Application")
    Dim Filter As String = "[Subject]='" & SubjectForSent & "'"
    Dim mailfolder As Outlook.MAPIFolder = o.Application.Session.GetDefaultFolder(Outlook.OlD efaultFolders.olFolderSentMail)
    Dim MItems As Object = mailfolder.Items
    Dim ret As Outlook.MailItem = MItems.Find(Filter)
    If ret Is Nothing Then
    ShowError("Die Mail konnte in Ihrem Sent-Ordner nicht gefunden werden, bitte speichern Sie die gesendete Mail selbst aus dem Sent-Ordner ins Dokumentenverzeichnis.")
    Else
    Dim mailToSave As Outlook.MailItem = ret
    While ret IsNot Nothing 'suche das neueste MailItem mit angegebenem Subject
    Dim dummy As Object = MItems.FindNext()
    If dummy IsNot Nothing Then
    ret = TryCast(dummy, Outlook.MailItem)
    If ret Is Nothing Then Exit While
    If ret.CreationTime > mailToSave.CreationTime Then mailToSave = ret
    End If
    ret = dummy
    End While
    [...]
    [/highlight]

    Wenn ich dummy und MItems nicht als Object deklariere, sondern als Outlook.MailItem und Outlook.Items liefert mir FindNext() Nothing zurück, wenn ich aber den "unsicheren" Datentyp Object nehme und damit ein Late Binding provoziere funktioniert es.

    Stimmt da die Microsoft-Beschreibung nicht, und ich kriege gar nicht ein Objekt des Typs MAPIFolder.Items zurück (sondern z.B. einen Erben der Klasse spezifisch der entsprechenden Outlook-Version), und ich rufe deshalb die Funktion FindNext() in einer Klasse auf, in der sie nicht oder leer implementiert ist (käme mir seltsam vor, laut Objekt-Paradigma wird doch immer die Funktion des Erben aufgerufen)? Liefert mir FindNext schon etwas zurück, ab er etwas was das System nicht einem Outlook.MailItem zuweisen kann (und warum kriege ich dann keine Exception)?

    Im Endeffekt kann es mir zwar jetzt egal sein, jetzt klappt es aber verwirrend ist es schon...

    Gruß
    Martin

    Comment

    Working...
    X