2016-11-28 1 views
-1

Ich ist die Schaffung MailItem:Wie MailItem zu speichern, nachdem das Senden

Application outlook = new Application(); 
    _mailItem = outlook.CreateItem(OIItemType.olMailItem);     
    Inspector inspector = _mailItem .GetInspector; 
    inspector.Activate();  

Set Empfänger, Körper, etc ... zu einem Sendeereignis Abonnieren:

((ItemEvents_10_Event)_mailItem).Send += MailItemSendHandler; 

    void MailItemSendHandler(ref bool isSended) { 
     _mailItem.SaveAs(filePath); 
    } 

Wenn ein Benutzer der gesendeten E-Mail, ich speichere es. Aber meine E-Mail gespeichert in komponieren Modus. Wenn ich es in OutLook öffne, kann ich alle Informationen ändern und ich kann es erneut senden.

Wenn ich an den MailItem Inspector schließen Ereignis abonnieren:

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

und Speichern MailItem in CloseEventHandler, ich habe einen Fehler:

"Item has been moved or deleted".

Wie kann ich meine MailItem speichern, nachdem wird es sended und im Ordner "Gesendete Objekte" verschoben? (Außer im Modus lesen)

EDIT

Ich bin Items.AddItem Ereignis mit meiner geschickt _mailItem speichern. Erhalten Sie Ordner:

_sentFolderItems = _mailItem.SaveSentMessageFolder; 

subscribe mit etwas Logik in _addEventHandler:

_sentFolderItems.Items.ItemAdd += _addEventHandler; 

Gut:

  1. Outlook Hauptfenster ausgeführt wird.
  2. Der Outlook-Prozess wird im Task-Manager angezeigt.
  3. Ich erzeuge MailItem, zeige es für den Benutzer. Der Benutzer kann einige Änderungen vornehmen, wenn er möchte, und die Senden-Taste drücken.
    4. Items.ItemAdd wird ausgelöst und _addEventHandler wird ausgeführt.
  4. Das Outlook-E-Mail-Fenster wird noch ausgeführt und der Outlook-Prozess wird im Task-Manager angezeigt.

Bad:

Outlook-Hauptfenster wird nicht ausgeführt, und es gibt keinen Prozess im Task-Manager. Ich erzeuge MailItem, zeige es für Benutzer. Es gibt nur ein Fenster zum Senden einer E-Mail, die dem Benutzer angezeigt wird. Der Outlook-Prozess wird im Task-Manager angezeigt. Der Benutzer kann einige Änderungen vornehmen, wenn er möchte, und die Senden-Taste drücken. Mail wird gesendet und Task-Manager hat keinen OutLook-Prozess. Items.ItemAdd wird NICHT ausgelöst und _addEventHandler wird NICHT ausgeführt. Aber corse gesendet Artikel befindet sich in gesendeten Ordner.

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

Keine direkte Antwort, daher der Kommentar. Aber wenn Sie MS-SQL Server bereits verwenden, können Sie in DBMail nachsehen. Wenn Sie DBMail verwenden, werden alle E-Mails automatisch in der Datenbank gespeichert. –

+0

@RyanMann, ich speichere E-Mails im Windows Temp-Ordner (auf der Client-Seite) und lade sie dann auf den Server hoch. Ich denke, dass die Verwendung von Outlook-E-Mails direkt Speicher ist keine gute Idee. –

+0

Ja, ich habe nicht erkannt, dass dies eine Outlook-API-Frage war. Ich dachte, es wäre eine Web-App-bezogene Frage. –

Antwort

0

Verwenden Sie Items.ItemAdd Ereignis im Ordner Gesendete Objekte.

+0

Danke für die Antwort, @ DmitryStreblechenko. Danach habe ich ein Problem mit einem ähnlichen Problem gefunden: http://stackoverflow.com/questions/12515612/event-on-item-sent-in-outlook –

+0

Ich benutze MailItem.SaveSentMessageFolder zum Abonnieren. Aber dieses Ereignis feuert nicht, wenn der Ausblick geschlossen ist. –

+0

Ich bin mir nicht sicher, was du meinst. Bitte zeigen Sie Ihren Code. –

Verwandte Themen