2016-11-28 52 views
-1

我'创造的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督察关闭事件:

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

和CloseEventHandler节省的MailItem,我有一个错误:

"Item has been moved or deleted".

我怎么能救我的MailItem将sended后并在“已发送邮件”Outlook文件夹中移动?使用Items.AddItem事件救了我送_mailItem(保存在阅读模式)

编辑

我'。获取文件夹:

_sentFolderItems = _mailItem.SaveSentMessageFolder; 

在_addEventHandler一些逻辑订阅:

_sentFolderItems.Items.ItemAdd += _addEventHandler; 

好:

  1. 的Outlook主窗口中运行。
  2. Outlook进程显示在任务管理器中。
  3. 我生成MailItem,显示给用户。用户可以根据需要进行一些更改,然后按发送按钮。
    4. Items.ItemAdd被触发,_addEventHandler被执行。
  4. 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); 
    } 
} 
+0

不是一个直接的答案,因此评论。但是,如果您已经使用MS-SQL Server,则可以查看DBMail。如果您使用DBMail,则所有电子邮件都会自动保存在数据库中。 –

+0

@RyanMann,我将电子邮件保存在Windows临时文件夹(在客户端),然后将它们上传到服务器。我认为,直接使用Outlook电子邮件存储不是一个好主意。 –

+0

是的,我没有意识到这是一个Outlook API的问题。我认为这是一个网络应用程序相关的问题。 –

回答

0

在已发送邮件文件夹中使用Items.ItemAdd事件。

+0

感谢您的回答,@DmitryStreblechenko。之后,我发现了一个类似的问题:http://stackoverflow.com/questions/12515612/event-on-item-sent-in-outlook –

+0

我使用MailItem.SaveSentMessageFolder进行订阅。但是,当展望结束时,这个事件并没有发生。 –

+0

我不确定你的意思。请显示你的代码。 –