2016-06-04 1 views
0

Voici comment je l'utilise aujourd'huiUtiliser mimekit.mimemessage pour charger des fichiers eml à partir du disque dur hwo puis-je charger uniquement du texte?

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      int counter = 0; 
      MimekitallLoadedMessages = new List<MimeKit.MimeMessage>(); 
      MimeKit.MimeMessage loadedMessage = null; 
      DirectoryInfo di = new DirectoryInfo(emailsDirectory); 
      FileInfo[] files = di.GetFiles(); 
      for (int i = 0; i < files.Length; i++) 
      { 
       string uid = seenUids[0]; 
       loadedMessage = MimeKit.MimeMessage.Load(files[i].FullName); 
       MimekitallLoadedMessages.Add(loadedMessage); 
       downloaded.Add(seenUids[i]); 
       counter += 1; 
       int nProgress = counter * 100/files.Length; 
       backgroundWorker2.ReportProgress(nProgress); 
      } 
     } 

La méthode Load suffit de charger le message entier. Mais je errer si je peux charger pour exmaple sur le sujet de chaque message et l'ajouter à un listView par exemple pour que l'utilisateur puisse sélectionner plus tard un email spécifique pour charger tout son contenu comme le html ou tout le contenu du corps .

Ainsi, charger uniquement le sujet et faire une liste de tous les e-mails dans la liste affichera les messages plus rapidement. J'ai comme 6000 fichiers eml sur le disque dur.

Chargement de tous les fichiers et ajout de tous les messages à la listeLa visualisation peut prendre un certain temps. A la place, peut-être que charger/analyser uniquement le texte pourrait être plus rapide?

Est-ce possible? Et la logique? Peut-être quand je télécharge les messages la première fois que je devrais créer un fichier texte avec tous les sujets de chaque email et puis en exécutant mon programme juste pour lire les lignes du fichier texte, chaque ligne est un sujet?

MISE À JOUR

C'est l'événement DoWork maintenant:

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) 
     { 
      MimeKit.HeaderList loaded = new MimeKit.HeaderList(); 
      int counter = 0; 
      MimekitallLoadedMessages = new List<MimeKit.MimeMessage>(); 
      MimeKit.MimeMessage loadedMessage = null; 
      DirectoryInfo di = new DirectoryInfo(emailsDirectory); 
      FileInfo[] files = di.GetFiles(); 
      for (int i = 0; i < files.Length; i++) 
      { 
       string uid = seenUids[0]; 
       loaded = MimeKit.HeaderList.Load(files[i].FullName); 
       var subject = loaded[MimeKit.HeaderId.Subject]; 
       downloaded.Add(seenUids[i]); 
       counter += 1; 
       int nProgress = counter * 100/files.Length; 
       backgroundWorker2.ReportProgress(nProgress, subject); 
      } 
     } 

Et l'événement ProgressChanged comment je suis mise à jour du contrôle ListView:

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      pbt1.Value = e.ProgressPercentage; 
      pbt1.Text = e.ProgressPercentage.ToString() + "%"; 
      pbt1.Invalidate(); 
      if (e.UserState != null) 
      { 

       ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[] 
      { 
       e.UserState.ToString() 
      })); 
      } 
     } 
+0

Vous voulez juste lire le sujet de ces messages? –

+0

Vous avez raison et votre idée de code Yacoub est bon et rapide le problème est la mise à jour de l'interface utilisateur dans l'événement progresschanged. J'essaye d'ajouter le sujet en tant qu'éléments de chaîne à un listView en temps réel mais la mise à jour de la liste rend le tout lent et pas lisse. –

+0

Je viens de mettre en ligne et mis à jour ma question avec ce que j'ai essayé jusqu'à présent. –

Répondre

3

Vous pouvez analyser les en-têtes que si vous voulez via HeaderList.Load. Ce sera plus rapide que l'analyse du message entier. Voici un exemple:

string filename = ... 

var headerList = HeaderList.Load(filename); 

var subject = headerList[HeaderId.Subject];