2009-08-17 13 views
11

Sto scrivendo l'add-in per Outlook di VSTO in C#, e devo distinguere, se MailItem è dato in entrata o in uscita (o nessuno dei due, quando è ad esempio una bozza).Outlook MailItem: come distinguere se la posta è in entrata o in uscita?

Esiste un modo infallibile per farlo? La soluzione migliore che ho ora sarebbe ottenere un elenco di destinatari, cc e bcc, caricamento degli indirizzi e-mail dagli account attivi e controllo se questi due elenchi si intersecano, ma questo mi sembra abbastanza fragile, e spero che ci sia una soluzione migliore .

Caso di utilizzo: mi piacerebbe ottenere una data rilevante per un messaggio di posta elettronica, che potrebbe essere ReceivedTime o SentOn, ma per sapere quale devo usare, sono stato informato se è stata inviata o ricevuta una mail.

Grazie per le idee :)

+0

Avete controllare tutti i destinatari, cc di, ecc o si può solo guardare il mittente? Se il proprietario dell'account non l'ha inviato, è in arrivo. –

+0

Non è stata inviata anche tutta la posta ricevuta? – Roland

risposta

0

Date un'occhiata alla proprietà .parent del MailItem - esaminare le proprietà della cartella per determinare se è la posta in arrivo, in uscita, bozze, articoli, ecc inviato

+0

Ma cosa succede se l'utente (o le regole del filtro della posta) ha già spostato la posta in una cartella generica (ad esempio, la cartella per il progetto XYZ) con entrambe le e-mail in entrata e in uscita? In tal caso, in entrata/in uscita sarebbe una proprietà specifica per e-mail, non per la cartella. Bella idea però, questo non mi è venuto in mente :). –

+0

Questa è una bella domanda. Non ho una risposta da dio per quello. –

-3

Did si prova la proprietà MailItem.Sent?

È vero per l'ingresso e falso per l'uscita.

+0

No: vedere la risposta di David http://stackoverflow.com/questions/1285713/outlook-mailitem-how-to-distinguish-whether-mail-is-incoming-or-going/2370543#2370543 –

2

Sono venuto qui con lo stesso problema. Dal momento che suggerirò esplicitamente che l'utente sposta la posta in una cartella nel mio caso, controllare Parent non sarebbe d'aiuto ...

Per quanto riguarda MailItem.Sent: sei sicuro che MailItem.Sent funzioni in questo modo? Ho appena scritto un codice semplice per eseguire sia la mia Posta in arrivo che i SentItem e quasi tutti sono inviati. Presumo che questa sia solo un'indicazione se la posta è stata inviata (= non è una bozza) ...

1

MailItem.sent è true anche per l'entrata.

Come controllare MailItem.ReceivedByEntryID. Ma sono sicuro che questo non riuscirà (ReceivedByEntryID sarà nullo per posta in arrivo) se dici importazione da Outlook Express o forse qualche altro programma di posta elettronica

Iterare attraverso i conti di posta/senderemail può aiutare come hai detto, ma non è sciocco prova (come se si rinomina l'indirizzo e-mail)

+0

Grazie! Questo potrebbe funzionare per la maggior parte degli utenti, poiché non penso che molti utenti aziendali possano importare le loro e-mail da Outlook Expres (e anche se lo facessero, la maggior parte delle operazioni utili coinvolgerebbe solo i messaggi recenti che potrebbero essere ricevuti da Outlook). –

0

È possibile verificare se è all'interno dello Outlook.OlDefaultFolders.olFolderInbox o olFolderOutbox, quindi ci dovrebbero essere altri metodi che è possibile utilizzare per verificare se è all'interno di una di queste cartelle!

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

Penso che questo non funzionerebbe su messaggi inviati/ricevuti che sono stati spostati in un'altra cartella (ad esempio con un filtro) - vero? –

1

Ho risolto questo problema aggiungendo una nuova UserProperty dopo l'invio dell'e-mail. Quindi, quando ho bisogno di controllare se è stata inviata un'e-mail, controllo questa proprietà. Funziona anche se la posta elettronica è stata spostata dalla cartella Inviati. Naturalmente, questo funziona solo per le e-mail appena create, ma è possibile aggiungere questa proprietà a tutte le e-mail nella cartella Posta inviata al primo avvio. L'unico bug è che UserProperties viene stampato per impostazione predefinita, ma questo può essere overridden.

+1

Questa è una soluzione piuttosto pesante, ma probabilmente solo una che potrebbe funzionare. Tuttavia, il componente aggiuntivo dovrebbe essere eseguito ininterrottamente, altrimenti avremmo ricevuto e-mail ricevute non marcate e al primo avvio. non saremmo in grado di contrassegnare le e-mail inviate che sono state spostate in un'altra cartella. Forse sarebbe possibile scansionare tutta la posta e vedere se il destinatario è uno degli indirizzi e-mail dell'utente, ma questo potrebbe richiedere ore su un grande account di scambio/IMAP ... –

1

Ecco come controllo il tipo di posta e funziona anche se la posta viene spostata in qualsiasi cartella. Questa soluzione utilizza proprietà accessor che è disponibile in Outlook 2007. Di seguito è riportato il codice

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

non funziona nel 2010 atleast – Kumar

+0

scambiare account di posta ma non con imap/smtp - testato con il 2016 – Lakedaimon

17

arrivato a questa pagina perché ho avuto lo stesso problema in VBA. Il controllo delle cartelle madri è complicato, poiché un messaggio può contenere più cartelle (e quindi è necessario scorrere più cartelle) o l'utente potrebbe aver cambiato la cartella. Un esempio estremo: la cartella degli elementi eliminati contiene elementi di posta sia in entrata che in uscita.

Ho scelto una soluzione simile a un'altra persona (Adi Kini) sopra dove controllo il ReceivedByName (penso che abbia scelto ReceivedEntryID). La proprietà ReceivedByName è sempre Null ("") per un messaggio inviato, ovunque si trovi attualmente. Questo metodo può trovare un oggetto inviato che è stato trascinato nella Posta in arrivo !. Sembra un metodo abbastanza affidabile di controllo.

Sembra strano che una cosa così apparentemente semplice come controllare se la posta sia in arrivo o in uscita può farci inciampare!

+0

Nota che né "ReceivedByName" né "ReceivedEntryID" avranno un valore se l'elemento di posta è stato ricevuto da una cartella pubblica a cui è assegnato un indirizzo. – cremor

0

Per un semplice controllo inviato/inviato tramite indirizzo SMTP, suggerisco un approccio di verifica indirizzo. Si può fare in questo modo:

'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 
Problemi correlati