У меня есть надстройка Outlook, которая позволяет пользователю сохранять электронную почту в базе данных. Когда пользователь сохраняет электронную почту, я изменяю тему электронной почты, чтобы ее можно было идентифицировать как сохраненную.Outlook MailItem Save/SaveAs
Сохранение электронной почты может происходить двумя способами. Через кнопку на панели инструментов, которая позволяет пользователю сохранять любую электронную почту, которую они хотят, а также через подсказку, которая появляется, когда новое письмо помещается в папку «Отправленные». Оба метода используют одну и ту же форму для сохранения электронной почты!
ОК, теперь к проблеме ....
В процессе сохранения электронной почты я использую метод mailItem.SaveAs
, чтобы поместить его в хранилище файлов. После того, как это успешно завершено, я хочу изменить тему электронной почты, которая все еще существует в Outlook, чтобы сказать, что она была успешно сохранена. Я делаю это, изменяя myItem.Subject
, а затем используя метод mailItem.Save
, чтобы сохранить изменения.
Вышеупомянутое прекрасно работает, когда электронное письмо не сохраняется с помощью метода подсказки. Поэтому, когда пользователь пытается сохранить электронное письмо после отправки, метод mailItem.Save
не работает.
Я сузил его, чтобы он действительно работал, если я положил строку myItem.Save()
до линии myItem.SaveAs()
, но, очевидно, если я это сделаю, я не могу гарантировать, что письмо было действительно сохранено должным образом.
Знаете ли вы, что метод mailItem.Save
не захочет работать после метода mailItem.SaveAs
, который был вызван?
Благодарим вас за любые предложения о том, что может быть проблемой.
EDIT: Код
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() + " :: ");
}
}
Не могли бы вы объяснить в al ittel более подробно ваш «быстрый рабочий процесс». как вы подключаетесь к отправке и т. д., так как существует несколько способов сделать это. – 76mel
«prompt» Я имею в виду, что когда событие addItem запускается в папке отправленных предметов, он спрашивает пользователя, хотят ли они сохранить электронное письмо. Следовательно, электронная почта запускает событие после того, как оно перешло в папку «Исходящие» и в «Отправленные». Если пользователь говорит «да», что они хотели бы сохранить электронную почту, тогда открывается основная форма с ссылкой на письмо, которое в первую очередь инициировало событие. – Stuv
Хорошо, Итак, как на ссылку, указанную в вашей основной форме? ваша «основная» форма, изменяющая электронную почту каким-либо образом, чтобы ее нужно было сохранить.Вы можете проверить свойство isSaved. Возможно, это будет идея опубликовать код. Поскольку это просто звучит как вещь заказа или вы каким-то образом загрязняете электронную почту. – 76mel