У меня есть надстройка для 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() + " :: ");
}
}