2013-12-18 14 views
11

Desidero recuperare tutte le e-mail nella cartella Posta in arrivo utilizzando l'API gestita EWS e memorizzarle come .eml. Il problema è nel recupero (1) tutti i mail con (2) tutte le intestazioni (come da, verso, soggetto) (sto mantenendo le informazioni di quei valori di from, to e altre proprietà da qualche altra parte, così ho bisogno di loro troppo) e (3)byte[] EmailMessage.MimeContent.Content. In realtà mi manca la comprensione diRecupero di tutte le e-mail in Posta in arrivo dai servizi Web di Exchange API gestita e memorizzazione come file .eml

  • Microsoft.Exchange.WebServices.Data.ItemView,
  • Microsoft.Exchange.WebServices.Data.BasePropertySet e
  • Microsoft.Exchange.WebServices.Data.ItemSchema

ecco perché mi sto trovando difficile.

Il mio codice primario è:

Quando creo PropertySet come segue:

PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent); 

ottengo seguente eccezione:

The property MimeContent can't be used in FindItem requests. 

Non capisco

(1) Che cosa questi ItemSchema e BasePropertySet sono

(2) E come dovremmo usarli

Così ho rimosso ItemSchema.MimeContent:

PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties); 

Ho scritto semplice codice seguente per avere tutte le mail in posta in arrivo:

ItemView view = new ItemView(50); 
view.PropertySet = properties; 
FindItemsResults<Item> findResults; 
List<EmailMessage> emails = new List<EmailMessage>(); 

do 
{  
    findResults = service.FindItems(WellKnownFolderName.Inbox, view); 
    foreach (var item in findResults.Items) 
    { 
     emails.Add((EmailMessage)item); 
    } 
    Console.WriteLine("Loop"); 
    view.Offset = 50; 
} 
while (findResults.MoreAvailable); 

Sopra ho tenuto la dimensione della pagina di ItemView a 50, per retr non avere più di 50 mail alla volta, e poi compensare per 50 per ottenere le 50 mail successive se ce ne sono. Tuttavia va in loop infinito e stampa continuamente Loop sulla console. Quindi devo capire male pagesize e offset. Voglio capire

(3) quello pagesize, offset e offsetbasepoint in ItemView costruttore significa

(4) come si comportano e

(5) come usarli per recupera tutte le mail nella posta in arrivo

Non ho trovato nessun articolo online che spieghi bene questi, ma solo dando il codice s amples. Apprezzerà la spiegazione a livello di domanda, nonostante possa girare a lungo.

+0

Ha lavorato a lungo sul retro. Se ricordo che è corretto, possiamo salvarlo solo come eml. Immagino tu voglia sapere se possiamo salvarlo come messaggio. Ho ragione? Se sì, possiamo ottenere msg solo quando lavoriamo da Outlook interno. Non ho trovato lavoro in giro per recuperare msg con EWS. Ma non c'è niente di sbagliato in eml, è lo standard. – Mahesha999

+0

'Come lo si salva solo come eml?' Frammento di codice sorgente su di esso ?. Giusto, comunque, tu dici che posso ottenere *** *** SOLO *** dentro * Outlook * (usando l'automazione di Outlook.Application). – Kiquenet

+0

non ti ha preso completamente. Estratti da salvare come eml possono essere trovati qui: [1] (https://social.msdn.microsoft.com/Forums/en-US/ba30ebb2-f1c9-4963-9451-932f2710db73/how-to-save-email- to-disk-as-eml-o-msg-while-using-exchange-web-services-to-read-inbox-mail-in # ae7564c8-ee17-40c9-bfe7-7071bdb411ed), [2] (https://stackoverflow.com/a/6610727/1317018) – Mahesha999

risposta

19

EWS è un po 'incoerente con le proprietà restituite da varie operazioni. Un ItemBind non restituirà le stesse identiche proprietà di FindItem. Stai utilizzando correttamente i PropertySet per definire ciò che vuoi dal server, ma devi usarli nel posto giusto. Quello che devi fare è trovare gli oggetti, quindi caricare le proprietà in essi. Non è l'ideale, ma è così che funziona EWS. Con il vostro ciclo, siete costantemente l'assegnazione di 50 al di offset quando è necessario incrementarlo per 50. Fuori della parte superiore della mia testa, qualcosa di simile avrebbe fatto:

int offset = 0; 
int pageSize = 50; 
bool more = true; 
ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning); 

view.PropertySet = PropertySet.IdOnly; 
FindItemsResults<Item> findResults; 
List<EmailMessage> emails = new List<EmailMessage>(); 

while(more){ 
    findResults = service.FindItems(WellKnownFolderName.Inbox, view); 
    foreach (var item in findResults.Items){ 
     emails.Add((EmailMessage)item); 
    } 
    more = findResults.MoreAvailable; 
    if (more){ 
     view.Offset += pageSize; 
    } 
} 
PropertySet properties = (BasePropertySet.FirstClassProperties); //A PropertySet with the explicit properties you want goes here 
service.LoadPropertiesForItems(emails, properties); 

ora avete tutti gli elementi con tutte le proprietà che hai richiesto. FindItems spesso non restituisce tutte le proprietà che desideri anche se le chiedi, quindi caricare inizialmente solo l'Id e poi caricare le proprietà che vuoi è generalmente la strada da percorrere. Potresti anche voler eseguire il caricamento in batch delle proprietà in qualche modo, a seconda del numero di e-mail che stai recuperando, forse nel ciclo precedente ad aggiungerle all'Elenco di EmailMessage. Potresti anche prendere in considerazione altri metodi per ottenere elementi, come un servizio. Azione Sincronizza cartella.

+0

Esegue 'service.LoadPropertiesForItems (findResults, properties);'? – kamaci

+0

'EmailMessage' *** salvato come EML ***? – Kiquenet