2009-12-08 15 views
0

J'ai un add-in Outlook qui permet à l'utilisateur d'enregistrer un email dans une base de données. Lorsque l'utilisateur enregistre l'e-mail, je modifie l'objet de l'e-mail afin qu'il puisse être identifié comme étant enregistré.Outlook MailItem Save/SaveAs

L'enregistrement du courriel peut se faire de deux façons. Via un bouton sur la barre d'outils qui permet à l'utilisateur d'enregistrer tout e-mail qu'ils veulent, et également via une invite qui apparaît lorsqu'un nouvel email est placé dans le dossier Éléments envoyés. Les deux méthodes utilisent le même formulaire pour enregistrer l'e-mail!

OK, maintenant au problème ....

Dans le processus d'enregistrement des e-mail que j'utilise la méthode mailItem.SaveAs pour le mettre dans le magasin de fichiers. Après que cela s'est terminé avec succès, je veux changer le sujet de l'e-mail qui existe encore dans Outlook pour dire qu'il a été enregistré avec succès. Je fais cela en changeant myItem.Subject puis en utilisant la méthode mailItem.Save pour enregistrer la modification.

Ce qui précède fonctionne parfaitement lorsque l'e-mail n'est pas enregistré via la méthode d'invite. Ainsi, lorsque l'utilisateur tente de sauvegarder l'e-mail après l'envoi, la méthode mailItem.Save ne fonctionne pas.

Je l'ai réduit à ce qu'il fonctionne réellement si je mets la ligne myItem.Save() avant la ligne myItem.SaveAs(), mais évidemment, si je le fais, je ne peux pas garantir que l'e-mail a été réellement enregistré correctement.

Alors est-ce que quelqu'un sait d'une raison que la méthode mailItem.Save voudrait ne pas fonctionner après que la méthode mailItem.SaveAs ait été appelée?

Nous vous remercions d'avance de vos suggestions sur ce qui pourrait être le problème.

EDIT: Code

if (_item is Outlook.MailItem) { // if the incoming item is an Outlook mail Item 
    // cast as a mail item 
    Outlook.MailItem myItem = (Outlook.MailItem)_item; 
    if (directoryExists(directoryTemp)) { // if the temporary directory exists 
     bool _profiled = true; 
     // copy the item as type .msg in the temporary location 
     myItem.SaveAs(saveTemp, Outlook.OlSaveAsType.olMSG); 
     // setup impersonation to copy the file to a secure location 
     PImpersonateUser _iU = new PImpersonateUser(); 
     // do impersonation 
     try { 
      _iU.Impersonate("******", "******", "******"); 
      if (File.Exists(savefile)) { // if file already exists in the location 
       // delete existing file 
       File.Delete(savefile); 
      } 
      // move the temporary file to the secure location with the proper name 
      File.Move(saveTemp, savefile); 
      string year = ""; 
      if (ipt_year.SelectedItem != null) { // else if year has been selected 
       year = ipt_year.SelectedItem.ToString(); 
      } 
      _profile.profileEmail(folderString(_subject_), _fileName, year); 
     } catch (Exception e) { 
      _profiled = false; 
      // if impersonation fails cancel the impersonation 
      _iU.Undo(); 
      // show error 
      MessageBox.Show(e.Source + "\n\n" + e.Message + "\n\n" + e.StackTrace, "SaveAs() Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } finally { 
      _iU.Undo(); 
     } 
     if (_profiled) { // if the email was profiled successfully 
      // mark the original email as being profiled 
      markAsProfiled(); 
     } 
    } else { 
     // if temporary file save fails throw error 
     MessageBox.Show("Temporary Directory (" + directoryTemp + ") Does Not Exist!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

et la fonction markAsProfiled ...


private void markAsProfiled() { 
    if (_item is Outlook.MailItem) { // if the incoming item is an Outlook mail Item 
     // cast as a mail item 
     Outlook.MailItem myItem = (Outlook.MailItem)_item; 
     // make sure subject doesnt already have a profiled flag in the subject 
     _subject_ = _subject_.Replace("[PROFILED] - ", ""); 
     // add a profiled flag in the subject of the email 
     myItem.Subject = "[PROFILED] - " + _subject_; 
     // add a yellow flag to the email 
     myItem.FlagIcon = Microsoft.Office.Interop.Outlook.OlFlagIcon.olYellowFlagIcon; 
     // save email with changes made 
     myItem.Save(); 
     //MessageBox.Show("Mark as Profiled :: " + myItem.Subject + " :: " + myItem.Saved.ToString() + " :: "); 
    } 
} 
+0

Pouvez-vous expliquer dans plus de détails votre "workflow prompt". comment allez-vous accrocher dans l'envoi etc. car il y a un certain nombre de façons de le faire. – 76mel

+0

par "prompt" Je veux dire que lorsque l'événement addItem est déclenché sur le dossier des éléments envoyés, il demande à l'utilisateur s'il souhaite enregistrer l'email. Par conséquent, l'e-mail déclenche l'événement après qu'il a traversé la boîte d'envoi et dans les éléments envoyés. Si l'utilisateur dit «oui», qu'il souhaite enregistrer l'e-mail, le formulaire principal s'ouvre avec la référence à l'e-mail qui a déclenché l'événement en premier lieu. – Stuv

+0

Ok, Alors, comment est l'email référencé dans votre formulaire principal? Votre formulaire "Principal" est-il en train de modifier l'e-mail de quelque façon que ce soit, ce qui nécessite d'être sauvegardé.Vous pouvez vérifier la propriété isSaved. Ce pourrait être une idée de publier le code. Comme cela ressemble à une commande ou vous salissez l'email d'une manière ou d'une autre. – 76mel

Répondre

1

si cela est encore pertinent pour vous: Vous pouvez utiliser une colonne auto-défini dans lequel vous pourriez écrire si l'épargne était réussie ou pas.

code Exemple:

mail.UserProperties.Add("Profiled", Outlook.OlUserPropertyType.olText, true); 
mail.UserProperties["Profiled"].Value = "Yes"; 
mail.Save(); 

Le seul inconvénient est que vous avez à ajouter le champ aux colonnes affichées dans Outlook. (peut-être que cela peut être fait par programme)

Pourquoi votre méthode ne fonctionne pas: J'imagine qu'Outlook ne l'aime pas lorsque vous modifiez le sujet d'un message électronique après son envoi.

Questions connexes