2017-11-23 1 views
0

Ich möchte in meinem Outlook 2016-Add-In ein "erneut senden" -Kontextmenü hinzufügen, um eine E-Mail erneut zu senden. Die ursprüngliche E-Mail-Adresse sollte dem Benutzer erneut angezeigt werden, damit er gegebenenfalls Änderungen vornehmen kann. Drücken Sie dann die Taste "Senden". Es scheint, dass ich eine Kopie der E-Mail erstellen muss, da der Aufruf von Display() auf der ursprünglichen Nachricht (oder einer mit MailItem.Copy() erstellten Kopie) nur die Nachricht anzeigt, anstatt sie mit einer Send-Schaltfläche bearbeitbar zu machen.Klonen einer Outlook-E-Mail zum erneuten Senden

habe ich dies so weit - ziemlich geradlinig:

 Outlook.MailItem clone = Globals.ThisAddIn.Application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem; 
     clone.SendUsingAccount = email.SendUsingAccount; 
     clone.To = email.To; 
     clone.CC = email.CC; 
     clone.BCC = email.BCC; 
     clone.Subject = email.Subject; 
     clone.Body = email.Body; 
     clone.HTMLBody = email.HTMLBody; 
     for (int i = 1; i <= email.Attachments.Count; ++i) 
      clone.Attachments.Add(email.Attachments[i], email.Attachments[i].Type, email.Attachments[i].Position, email.Attachments[i].DisplayName); 

Allerdings bin ich ein DISP_E_MEMBERNOTFOUND Fehler bekommen, wenn die Anlagen zu kopieren versuchen. Was mache ich falsch?

Antwort

1

Attachments.Add können Sie nur eine Zeichenfolge übergeben, die auf einen vollständig qualifizierten Pfad zu einer Datei oder einem Outlook-Element (z. B. MailItem) verweist. Beachten Sie außerdem, dass Sie mit dem Code nur die Anzeigenamen des Empfängers kopieren, die möglicherweise erfolgreich aufgelöst wurden.

Das Outlook-Objektmodell macht die MailItem.Copy-Methode verfügbar, erstellt jedoch eine Kopie im selben gesendeten/nicht gesendeten Status wie das Original.

Wenn Redemption eine Option ist, können Sie RDOMail verwenden. CopyTo() Methode - es wird alle Eigenschaften und Unterobjekte (wie Empfänger und Anhänge) kopieren, aber es wird den gesendeten Zustand intakt lassen (da in MAPI es nur eingestellt werden kann, bevor die Nachricht zum ersten Mal gespeichert wird).

Aus der Spitze von meinem Kopf:

 using Redemption; 
     ... 

     RDOSession session - new RDOSession(); 
     session.MAPIOBJECT = Globals.ThisAddIn.Application.Session.MAPIOBJECT; 
     RDOMail clone = session.GetDefaultFolder(rdoDefaultFolders.olFolderDrafts).Items.Add(); 
     RDOMail original = (RDOMail)session.GetRDOObjectFromOutlookObject(email); 
     original.CopyTo(clone); 
     clone.Save(); 
     MailItem OutlookClone = Globals.ThisAddIn.Application.Session.GetItemFromID(clone.EntryID); 
     OutlookClone.Display() 
+0

Es sieht aus wie programmatisch eine Anlage kopiert ein zu einer lokalen (temp) Datei und speichern muß wieder befestigen? Es gibt keine Möglichkeit, die gesendeten Felder/Eigenschaften einer gesendeten E-Mail zurückzusetzen, sodass die E-Mail-Nachricht von MailItem.Copy() gesendet werden kann. – Jimmy

+1

Nein, und selbst wenn Sie den Anhang erneut hinzufügen, müssen andere Anhangseigenschaften kopiert werden. Z.B. Für die HTML-Bildanhänge müssen Sie die Inhalts-ID des Anhangs kopieren, anderenfalls zeigt der HTML-Text das Bild nicht an. –

Verwandte Themen