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() + " :: ");
}
}
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
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
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