发送后如何保存MailItem



i'am创建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);
    }

用户发送电子邮件时,我将其保存。但是我的电子邮件保存在 Compose 模式下。如果我要在Outlook中打开它,我可以更改所有信息并可以重新发送。

如果我订阅了MailItem Inspector关闭事件:

 ((InsPectorsEvents_10_Event)inspector).Close += CloseEventHandler;

和在CloseEventHandler中保存MailItem,我有一个错误:

"项目已移动或删除"。

将其发送并在"发送" Outlook文件夹中发送并移动后,我该如何保存邮件?(保存在读取模式中)

编辑

我使用items.additem事件保存我的已发送_mailitem。获取文件夹:

_sentFolderItems = _mailItem.SaveSentMessageFolder;

在_addeventhandler中订阅一些逻辑:

_sentFolderItems.Items.ItemAdd += _addEventHandler;

好:

  1. Outlook主窗口正在运行。
  2. Outlook过程显示在任务管理器中。
  3. I'AM生成MailItem,向用户展示它。用户愿意,请按下发送按钮。
    4。items.itemadd被触发并执行_addeventhandler。
  4. Outlook Mail窗口仍在运行,并且在任务管理器中显示Outlook过程。

坏:

Outlook主窗口未运行,任务管理器中没有进程。 我正在生成MailItem,向用户显示它。只有向用户显示的电子邮件发送的窗口。Outlook过程显示在任务管理器中。用户如果愿意进行一些更改,然后按发送按钮。发送邮件,任务管理器确实没有Outlook流程。 items.itemadd未被解雇,_addeventhandler未执行。但是corse send项目位于已发送文件夹中。

 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);
    }
}

在发送项目文件夹上使用Items.ItemAdd事件。

最新更新