2009-08-17 15 views
11

Je suis en train d'écrire VSTO Outlook addin en C#, et j'ai besoin de distinguer, que MailItem soit entrante ou sortante (ou non, quand c'est par exemple un brouillon).Outlook MailItem: Comment distinguer si le courrier est entrant ou sortant?

Y a-t-il un moyen infaillible de le faire? La meilleure solution que j'ai maintenant serait d'obtenir une liste de destinataires, cc et bcc, en chargeant des adresses email des comptes actifs, et en vérifiant si ces deux listes se croisent, mais ceci me semble très fragile, et j'espère qu'il y a une meilleure solution . Cas d'utilisation: J'aimerais obtenir une date pertinente pour un e-mail, qui peut être soit ReceivedTime, soit SentOn, mais pour savoir lequel je devrais utiliser, je dois savoir si un e-mail a été envoyé ou reçu.

Nous vous remercions d'idées :)

+0

Avez-vous de vérifier tous les destinataires, cc de, etc ou pouvez-vous regarder juste à l'expéditeur? Si le propriétaire du compte ne l'a pas envoyé, il est entrant. –

+0

Les messages reçus n'ont-ils pas tous été envoyés? – Roland

Répondre

0

Jetez un oeil à la propriété .Parent du MailItem - examiner les propriétés du dossier pour déterminer si elle est la boîte de réception, boîte d'envoi, brouillons, envoyer des articles, etc.

+0

Mais que se passe-t-il si l'utilisateur (ou les règles de filtre de courrier) a déjà déplacé le courrier vers un dossier générique (par exemple, le dossier du projet XYZ) avec les e-mails entrants et sortants? Dans ce cas, entrant/sortant serait une propriété spécifique à l'email, pas au dossier. Bonne idée cependant, cela ne m'est pas venu à l'esprit :). –

+0

C'est une très bonne question. Je n'ai pas de réponse de dieu pour celui-là. –

-3

Est-ce vous essayez la propriété MailItem.Sent?

Son vrai pour entrant, et faux pour sortant.

+0

Non - voir la réponse de David http://stackoverflow.com/questions/1285713/outlook-mailitem-how-to-distinguish-what-mail-is-incoming-or-outgoing/2370543#2370543 –

2

Je suis venu ici avec le même problème. Puisque je suggérerai explicitement que l'utilisateur déplace le courrier vers un dossier dans mon cas, cocher parent n'aiderait pas ...

Concernant MailItem.Sent: êtes-vous sûr que MailItem.Sent fonctionne de cette façon? J'ai juste écrit un code simple pour courir à travers ma boîte de réception et SentItems et pour la presque totalité d'entre eux est vrai. Je suppose que c'est vraiment juste une indication si le courrier a été envoyé (= n'est pas brouillon) ...

1

MailItem.sent est vrai pour les entrants aussi.

Que diriez-vous de vérifier MailItem.ReceivedByEntryID. Mais je suis sûr que cela échouera (ReceivedByEntryID sera nul pour les mails dans la boîte de réception) si vous dites importer depuis outlook express ou peut-être un autre programme de messagerie

Iterating thru mail accounts/senderemail peut aider comme vous l'avez dit, mais ce n'est pas dupe preuve (comme si vous renommez l'adresse e-mail)

+0

Merci! Cela pourrait fonctionner pour la plupart des utilisateurs, car je ne pense pas que beaucoup d'utilisateurs d'entreprise auraient leurs e-mails importés à partir d'Outlook Expres (et même s'ils le faisaient, la plupart des opérations utiles impliqueraient seulement des mails récents qui seraient reçus par Outlook). –

0

Vous pouvez vérifier si c'est dans le Outlook.OlDefaultFolders.olFolderInbox ou olFolderOutbox, alors il devrait y avoir d'autres méthodes que vous pouvez utiliser pour vérifier si c'est dans l'un de ces dossiers!

Outlook.Application _application = new Outlook.Application(); 
Outlook.MAPIFolder folder = _application.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
+0

Je pense que cela ne fonctionnerait pas sur les mails envoyés/reçus qui ont été déplacés vers un autre dossier (par exemple avec un filtre) - n'est-ce pas? –

1

J'ai résolu ce problème en ajoutant un nouvel objet UserProperty après l'envoi de l'e-mail. Donc, quand j'ai besoin de vérifier si un e-mail a été envoyé, je vérifie cette propriété. Cela fonctionne même si le courrier électronique a été déplacé hors du dossier envoyé. Bien sûr, cela ne fonctionne que pour les e-mails nouvellement créés, mais vous pouvez ajouter cette propriété à tous les e-mails du dossier Envoyés lors du premier démarrage. Le seul bogue est que UserProperties est imprimé par défaut, mais cela peut être overridden.

+1

C'est une solution assez lourde, mais probablement une seule qui pourrait fonctionner. Cependant, le complément devrait fonctionner tout le temps - sinon nous aurions un e-mails reçus non marqués - et au premier démarrage. nous ne serions pas en mesure de marquer les e-mails envoyés qui ont été déplacés vers un autre dossier. Peut-être qu'il serait possible de balayer tous les messages et de voir si le destinataire est l'une des adresses e-mail de l'utilisateur, mais cela pourrait prendre des heures sur un grand compte Exchange/IMAP ... –

1

Voici comment je vérifie le type de courrier et cela fonctionne même si le courrier est déplacé vers n'importe quel dossier. Cette solution utilise les biens ACCESSOR qui est disponible dans les perspectives 2007. Voici le code

string PR_MAIL_HEADER_TAG = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"; 

Outlook.PropertyAccessor oPropAccessor = mItemProp.PropertyAccessor; 

string strHeader = (string)oPropAccessor.GetProperty(PR_MAIL_HEADER_TAG); 

if (strHeader == "") 
{ 
    // MAIL IS OF TYPE SENTBOX 
} 
else 
{ 
    // MAIL IS OF TYPE INBOX 
} 
+1

ne fonctionne pas en 2010 atleast – Kumar

+0

fonctionne avec échangez les comptes de messagerie mais pas avec imap/smtp - testé avec ol 2016 – Lakedaimon

17

cette page à Came parce que j'avais même problème dans VBA. La vérification des dossiers parents est fastidieuse, car un dossier peut contenir plusieurs dossiers (et donc vous devez parcourir plusieurs dossiers) ou l'utilisateur peut avoir changé le dossier. Un exemple extrême: le dossier des éléments supprimés contient à la fois des éléments de courrier entrant et sortant.

J'ai choisi une solution similaire à une autre personne (Adi Kini) ci-dessus où je vérifie le ReceivedByName (je pense qu'il a choisi ReceivedEntryID). La propriété ReceivedByName est toujours Null ("") pour un message envoyé, où qu'il se trouve actuellement. Cette méthode peut trouver un élément envoyé qui a été déplacé dans la boîte de réception! Cela semble être une méthode de vérification assez fiable.

Il semble étrange qu'une chose apparemment simple comme vérifier si le courrier est entrant ou sortant peut nous trébucher!

+0

Notez que ni ReceivedByName ni ReceivedEntryID n'auront de valeur si l'élément de courrier a été reçu par un dossier public auquel une adresse a été affectée. – cremor

0

Pour un contrôle simple émis/reçu par l'adresse SMTP, je suggère une approche de vérification d'adresse. Il peut se faire de cette façon:

'Get mail address sender 
     Dim mailSender As String = GetSenderSMTPAddress(outMailItem) 

'Get current user mail address 
     Dim mailUser As String = OutlookMail2DocScriba.GetUserSMTPAddress(oNameSpace.CurrentUser.AddressEntry) 

     'If sender and current user matches is a sended mail, otherwise received 
     If String.Compare(mailSender, mailUser, True) = 0 Then 
      Return "Sended" 
     Else 
      Return "Received" 
     End If 





    Public Shared Function GetSenderSMTPAddress(ByVal mail As Outlook.MailItem) As String 
      'http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.oladdresslisttype.aspx 

      If mail Is Nothing Then 
       Throw New ArgumentNullException() 
      End If 
      If mail.SenderEmailType = "EX" Then 
       Dim sender As Outlook.AddressEntry = Nothing 

       Try 
        sender = mail.Sender 
       Catch ex As Exception 
        'Se non è stato in grado di reperire il sender (Outlook 2007), 
        'ignoro l'eccezione e procedo. 
       End Try 

       If sender IsNot Nothing Then 
        Return GetUserSMTPAddress(sender) 
       Else 
        Return Nothing 
       End If 
      Else 
       Return mail.SenderEmailAddress 
      End If 
     End Function 

     Public Shared Function GetUserSMTPAddress(ByVal sender As Outlook.AddressEntry) As String 
      'Now we have an AddressEntry representing the Sender 
      'http://msdn.microsoft.com/en-us/library/office/ff868214(v=office.15).aspx 
      Const EXCHANGE_USER_ADDRESS_ENTRY As Int32 = 0 
      Const EXCHANGE_REMOTE_USER_ADDRESS_ENTRY As Int32 = 5 
      Dim PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" 

      If sender.AddressEntryUserType = EXCHANGE_USER_ADDRESS_ENTRY OrElse _ 
       sender.AddressEntryUserType = EXCHANGE_REMOTE_USER_ADDRESS_ENTRY Then 
       'Use the ExchangeUser object PrimarySMTPAddress 
       Dim exchUser As Object = sender.GetExchangeUser() 
       If exchUser IsNot Nothing Then 
        Return exchUser.PrimarySmtpAddress 
       Else 
        Return Nothing 
       End If 
      Else 
       Return TryCast(sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS), String) 
      End If 
     End Function