У меня есть надстройка Outlook, которая позволяет пользователю сохранять электронную почту в базе данных. Когда пользователь сохраняет электронное письмо, я изменяю тему электронного письма, чтобы его можно было определить как сохраненное.
Сохранение электронной почты может происходить двумя способами. С помощью кнопки на панели инструментов, которая позволяет пользователю сохранять любое электронное письмо, которое он хочет, а также с помощью подсказки, которая появляется, когда новое электронное письмо помещается в папку «Отправленные». Оба метода используют одну и ту же форму для сохранения электронной почты!
Ладно, теперь к проблеме....
В процессе сохранения письма я использую метод mailItem.SaveAs
, чтобы поместить его в хранилище файлов. После того, как это успешно завершено, я хочу изменить тему электронного письма, которое все еще существует в Outlook, чтобы сказать, что оно было успешно сохранено. Я делаю это, изменяя myItem.Subject
, а затем используя метод mailItem.Save
для сохранения изменений.
Вышеприведенное отлично работает, когда электронная почта не сохраняется с помощью метода подсказки. Поэтому, когда пользователь пытается сохранить электронное письмо после его отправки, метод mailItem.Save
не работает.
Я сузил его до того, что он действительно работает, если я поставлю строку myItem.Save()
перед строкой myItem.SaveAs()
, но, очевидно, если я сделаю это, я не могу гарантировать, что электронное письмо действительно было сохранено правильно.
Итак, кто-нибудь знает причину, по которой метод mailItem.Save
не хочет работать после вызова метода mailItem.SaveAs
?
Заранее благодарю за любые предложения, в чем может быть проблема.
РЕДАКТИРОВАТЬ: Код
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);
}
}
и функция 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() + " :: ");
}
}