Как сохранить MailItem после отправки
Я создаю MailItem:
Application outlook = new Application();
_mailItem = outlook.CreateItem(OIItemType.olMailItem);
Inspector inspector = _mailItem .GetInspector;
inspector.Activate();
установить получателя, тело и т. д. Подписаться на событие отправки:
((ItemEvents_10_Event)_mailItem).Send += MailItemSendHandler;
void MailItemSendHandler(ref bool isSended) {
_mailItem.SaveAs(filePath);
}
Когда пользователь отправил письмо, я сохраняю его. Но мой адрес электронной почты сохранен в режиме создания. Если я открою его в OutLook, я могу изменить всю информацию и переслать его.
Если я подпишусь на событие закрытия MailItem Inspector:
((InsPectorsEvents_10_Event)inspector).Close += CloseEventHandler;
и сохраняя MailItem в CloseEventHandler, у меня есть ошибка:
Msgstr "Элемент был перемещён или удалён".
Как сохранить свой MailItem после его отправки и перемещения в папку Outlook "Отправленные"? (сохранить в режиме чтения)
РЕДАКТИРОВАТЬ
Я использую событие Items.AddItem для сохранения отправленного _mailItem. Получить папку:
_sentFolderItems = _mailItem.SaveSentMessageFolder;
подпишитесь с некоторой логикой в _addEventHandler:
_sentFolderItems.Items.ItemAdd += _addEventHandler;
Хорошо:
- Главное окно Outlook работает.
- Процесс Outlook отображается в диспетчере задач.
- Я создаю MailItem, показываю его пользователю. Пользователь может внести некоторые изменения, если он пожелает, и нажать кнопку отправки.
4. Items.ItemAdd запускается и выполняется _addEventHandler. - Окно почты Outlook все еще работает, и процесс outlook отображается в диспетчере задач.
Плохой:
Главное окно Outlook не запущено, и в диспетчере задач нет процесса. Я создаю MailItem, покажи его пользователю. Для пользователя отображается только окно для отправки электронной почты. Процесс Outlook отображается в диспетчере задач. Пользователь может внести некоторые изменения, если он пожелает, и нажать кнопку отправки. Почта отправлена, а в диспетчере задач нет процесса OutLook. Items.ItemAdd НЕ запускается и _addEventHandler НЕ выполняется. Но, разумеется, отправленный элемент находится в отправленной папке.
public class MailItemWrapper {
public MailItemWrapper(MailItem mailItem, ComposeEmailWrapper composeEmailWrapper, bool isCompose) {
_mailItem = mailItem;
_identifyProperty = Guid.NewGuid();
_mailItem.AddUserProperty(_identifyProperty.ToString(), _identifyProperty.ToString());
_sentFolderItems = _mailItem.SaveSentMessageFolder;
_inspector = _mailItem.GetInspector;
_composeEmailWrapper = composeEmailWrapper;
InComposeMode = isCompose;
SetEventHandlers();
Subscribe();
_isSending = false;
}
private MailItem _mailItem;
private Inspector _inspector;
private MAPIFolder _sentFolderItems;
private InspectorEvents_10_CloseEventHandler _closeEventHandler;
private ItemEvents_10_SendEventHandler _sendEventHandler;
private ItemsEvents_ItemAddEventHandler _addEventHandler;
private readonly ComposeEmailWrapper _composeEmailWrapper;
private string _path;
private bool _isSending;
private Guid _identifyProperty;
public bool InComposeMode {
get; set;
}
public MailItem MailItem {
get {
return _mailItem;
}
}
public void Subscribe() {
((ItemEvents_10_Event) _mailItem).Send += _sendEventHandler;
((InspectorEvents_10_Event) _inspector).Close += _closeEventHandler;
_sentFolderItems.Items.ItemAdd += _addEventHandler;
}
public void UnsubscribeAndRelease() {
if(InComposeMode) {
((ItemEvents_10_Event) _mailItem).Send -= _sendEventHandler;
((InspectorEvents_10_Event) _inspector).Close -= _closeEventHandler;
_sentFolderItems.Items.ItemAdd -= _addEventHandler;
Marshal.ReleaseComObject(_sentFolderItems);
Marshal.ReleaseComObject(_mailItem);
Marshal.ReleaseComObject(_inspector);
_sentFolderItems = null;
_mailItem = null;
_inspector = null;
InComposeMode = false;
_isSending = false;
}
}
private void SetEventHandlers() {
_sendEventHandler = (ref bool cancel) =>{
_isSending = true;
};
_addEventHandler = delegate (object item) {
var mailItem = item as MailItem;
if(mailItem != null) {
var identityer = mailItem.UserProperties.Find(_identifyProperty.ToString());
if(identityer != null && _identifyProperty.ToString() == identityer.Value) {
_path = mailItem.SaveAsInTempFolder(); // extension
if(_composeEmailWrapper != null && _composeEmailWrapper.Callback != null) {
System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (System.Action) ExecuteCallBack);
UnsubscribeAndRelease();
}
}
Marshal.ReleaseComObject(mailItem);
}
};
_closeEventHandler = () => {
// if user close dialog without sending => unsibscribe
if(!_isSending) {
UnsubscribeAndRelease();
}
};
}
private void ExecuteCallBack() {
_composeEmailWrapper.Callback(_path, _composeEmailWrapper.SessionId);
}
}