2017-07-28 2 views
0

Je dois stocker un modèle pour chaque MailItem utilisé. Pour cela j'ai écrit la méthode suivanteIdentification unique Mailitem

private readonly static Dictionary<string, PermitCustomPaneViewmodel> ViewmodelLookup = new Dictionary<string, PermitCustomPaneViewmodel>(); 

    public static PermitCustomPaneViewmodel CreateOrGet(MailItem c) 
    { 
     if (c.EntryID == null) 
      c.Save(); 
     if (!ViewmodelLookup.ContainsKey(c.EntryID)) 
     { 
      var vm = new PermitCustomPaneViewmodel(c); 
      c.Unload +=() => ViewmodelLookup.Remove(c.EntryID); 
      ViewmodelLookup.Add(c.EntryID, vm); 
     } 
     return ViewmodelLookup[c.EntryID]; 
    } 

Lorsque le modèle existe déjà, je le recherche et le renvoie. S'il n'a pas été créé, je le crée et supprime l'entrée après que le MailItem sera déchargé.

Cependant, j'ai observé que l'objet MailItem ne sera pas toujours valide jusqu'à ce que le déchargement soit appelé. Afin de pouvoir identifier le MailItem, j'ai utilisé le EntryID. Le problème est maintenant que cela ne fonctionne que si l'élément est enregistré.

Donc actuellement j'enregistrer l'article si aucun EntryID n'a été trouvé. Mais cela enregistre automatiquement l'article en cours de brouillon.

Existe-t-il un moyen de distinguer les MailItem qui ne sont pas enregistrés de manière à pouvoir être utilisés dans un Dictionary<,>.

+0

Vous pouvez créer et définir un [UserProperty] (https://www.add-in-express.com/creating-addins-blog/2011/08/19/how-to-add-a-custom-property -to-the-userproperties-collection-of-a-e-mail-item-in-outlook /) pour stocker l'identifiant unique. –

+0

Est-ce que je n'aurai pas besoin d'enregistrer aussi l'élément pour persiter le UserProperty? – lokimidgard

+0

Si l'article de courrier n'est pas stocké et enregistré par l'utilisateur, l'ID reste inutilisé. Mais cela ne devrait pas être un problème. –

Répondre

1

Les nouveaux éléments créés ne possèdent pas l'ensemble de propriétés EntryID. Obtenir l'ID attribué par le fournisseur du magasin, vous devez l'enregistrer. Si vous devez identifier un nouvel objet MailItem, vous pouvez ajouter une propriété utilisateur à l'élément en utilisant la méthode UserProperties.Add qui recrée une nouvelle propriété utilisateur dans la collection UserProperties. Par exemple:

Sub AddUserProperty() 
Dim myItem As Outlook.ContactItem 
Dim myUserProperty As Outlook.UserProperty 

Set myItem = Application.CreateItem(olContactItem) 
Set myUserProperty = myItem.UserProperties _ 
.Add("LastDateSpokenWith", olDateTime) 
myItem.Display 
End Sub 

Soyez au courant, les changements ID d'entrée lorsqu'un élément est déplacé dans un autre magasin, par exemple, à partir de votre boîte de réception vers un dossier public Microsoft Exchange Server, ou à partir d'un fichier de dossiers personnels (.pst) à un autre fichier .pst. Les solutions ne doivent pas dépendre de la propriété EntryID pour être uniques à moins que les éléments ne soient pas déplacés. Fondamentalement cela fonctionne très bien tant que le message reste dans son dossier parent ou il peut être changé si l'élément Outlook est déplacé vers un dossier différent (dépend du fournisseur du magasin).

Vous pouvez également utiliser l'identificateur de message dans l'en-tête MIME du message (PR_INTERNET_MESSAGE_ID et PR_TRANSPORT_MESSAGE_HEADERS). Mais ils ne sont pas définis sur les éléments nouvellement créés. Ces propriétés sont disponibles sur le message reçu d'un serveur SMTP ou via le connecteur SMTP.