|  | 
  
        |                                 Paul Forrester                				   
 
 
 Posts: 11
 Joined: 2017-08-11
 
 | 
                | I have a problem with an app that saves emails, the issue is that I cannot seem to pass the Item to the save form. 
 This is the code, firstly I watch the SentItems folder (code to do that elsewhere), this work fine:
 
 
 
    Public Overrides Sub ItemAdd(ByVal Item As Object, ByVal SourceFolder As Object)
        Dim oForm As Form2
        oForm = New Form2
        oForm.MyInitialise(Item)
        oForm.Show()
        oForm = Nothing
    End Sub
 
 The Form2 has this which works:
 
 
 
    Public Sub MyInitialise(EmailItem As Object)
        NarrativeText.Text = "Would you like to save the email entitled: " + EmailItem.subject
    End Sub
 
 My issue is on the Save Email button code, where I cannot reference the EmailItem as an object?
 
 This code is for testing as a full save routine exists but I needed to know if it was working at the most basic level:
 
 
 
    Public Sub SaveSentEmail_Click(sender As Object, e As EventArgs) Handles Save_Sent_Email.Click
        Dim Msg$
        Msg = "The path is: " & EmailItem.Subject & vbCrLf
        MsgBox(Msg)
    End Sub
 
 How can I reference the email?
 
 
 Thank you
 | 
 | 
  
        | 
                
                  
						| Posted 14 Aug, 2017 08:05:36 |  | Top |  | 
    
        |                                 Dmitry Kostochko                				   
 Add-in Express team
 
 
 Posts: 2887
 Joined: 2004-04-05
 
 | 
                | Hi Paul, 
 You can store the EmailItem object in a private field of your form, e.g.:
 
 
Private _emailItem as Object = Nothing
Public Sub MyInitialise(EmailItem As Object) 
    NarrativeText.Text = "Would you like to save the email entitled: " + EmailItem.subject 
    Me._emailItem = EmailItem
 
End Sub
 
 Another possible solution is to store the EntryID property of the mail item instead of its reference and get the mail item when needed by using the https://msdn.microsoft.com/VBA/Outlook-VBA/articles/namespace-getitemfromid-method-outlook method.
 | 
 | 
  
        | 
                
                  
						| Posted 14 Aug, 2017 09:49:45 |  | Top |  | 
    
        |                                 Paul Forrester                				   
 
 
 Posts: 11
 Joined: 2017-08-11
 
 | 
                | Hi Dmitry, 
 I tried as suggested and get this error:
 
 
   
 
 Any thoughts?
 | 
 | 
  
        | 
                
                  
						| Posted 15 Aug, 2017 04:18:59 |  | Top |  | 
    
        |                                 Dmitry Kostochko                				   
 Add-in Express team
 
 
 Posts: 2887
 Joined: 2004-04-05
 
 | 
                | Hi Paul, 
 The "COM object has been separated..." error occurs because the Add-in Express code releases the Item argument of the ItemAdd method after executing it. So, the reference to a mail item in your form is really "has been separated". You can use the ShowDialog method instead of Show to show your form. Or, as I mentioned in my previous post, you can pass the EntryID property of the mail item instead of its reference to your form and get the mail item when needed by using the Namespace.GetItemFromID() method:
 
 
 
Public Overrides Sub ItemAdd(ByVal Item As Object, ByVal SourceFolder As Object) 
 
    Dim oForm As Form2 
    oForm = New Form2 
    oForm.MyInitialise(Item.EntryID) 
 
    oForm.Show() 
End Sub
 
 
 
Private _emailID as String = String.Empty
 
Public Sub MyInitialise(EmailID As String)  
    Me._emailID = EmailID 
    Dim mail as Outlook._MailItem = GetMailItem(Me._emailID)
    NarrativeText.Text = "Would you like to save the email entitled: " + mail.Subject  
    Runtime.InteropServices.Marshal.ReleaseComObject(mail)
  
End Sub 
Private Function GetMailItem(EmailID As String) as Outlook._MailItem
    Dim result As Outlook._MailItem = Nothing
    Dim ns As Outlook._NameSpace = AddinModule.CurrentInstance.OutlookApp.GetNamespace("MAPI")
    If (ns IsNot Nothing) Then
        result = ns.GetItemFromID(EmailID)
        Runtime.InteropServices.Marshal.ReleaseComObject(ns)
    End If
    Return result
End Function
 | 
 | 
  
        | 
                
                  
						| Posted 15 Aug, 2017 05:40:38 |  | Top |  | 
    
        |                                 Paul Forrester                				   
 
 
 Posts: 11
 Joined: 2017-08-11
 
 | 
                | Thanks for this, I may have solved it in the meantime with: 
 
 
    Private _xemailItem As Object = Nothing
    Public Sub MyInitialise(EmailItem As Object)
        NarrativeText.Text = "Would you like to save the email entitled: " + EmailItem.Subject
        Me._xemailItem = EmailItem.EntryID
    End Sub
 
 And as a test:
 
 
Private Sub SaveSentEmail_Click(sender As Object, e As EventArgs) Handles Save_Sent_Email.Click
        Dim Msg$
        Msg = "The path is: " & Me._xemailItem & vbCrLf
        MsgBox(Msg)
        Dim App As Outlook.Application
        Dim NS As Outlook.NameSpace
        Dim MailItem As Outlook.MailItem
        App = CreateObject("Outlook.Application")
        NS = App.GetNamespace("MAPI")
        NS.Logon()
        MailItem = NS.GetItemFromID(Me._xemailItem)
        MailItem.Display()
    End Sub
 | 
 | 
  
        | 
                
                  
						| Posted 15 Aug, 2017 05:47:59 |  | Top |  | 
    
        |                                 Paul Forrester                				   
 
 
 Posts: 11
 Joined: 2017-08-11
 
 | 
                | My code does indeed work now, thank you for the assitance with this Dmitry. | 
 | 
  
        | 
                
                  
						| Posted 15 Aug, 2017 05:57:38 |  | Top |  | 
    
        |                                 Dmitry Kostochko                				   
 Add-in Express team
 
 
 Posts: 2887
 Joined: 2004-04-05
 
 |  | 
  
        | 
                
                  
						| Posted 15 Aug, 2017 06:00:25 |  | Top |  |