2017-04-13 10 views
0

私は送信された電子メールのいくつかのタイプを処理するOutlookアドインを持っています。いくつかの種類の電子メールの場合は、フォームに情報を入力してから、ファイルシステムのディレクトリツリーにMSGとして電子メールをエクスポートする必要があります。VSTO Outlookアドイン - 送信されたアイテムへのハンドラが常に機能しない

私は、送信された電子メールにフラグ(userproperty)そのアドインは、電子メールを保存しなければならないかを知っている:アドインのスタートアップで

Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click 
    Dim oProperties As Outlook.UserProperties 
    Dim oProperty As Outlook.UserProperty 


    oMail = Globals.ThisAddIn.Application.ActiveInspector.CurrentItem 


    If Not oMail Is Nothing Then 

     oProperties = oMail.UserProperties 
     oProperty = oProperties.Add("SALVARAPIGES", Microsoft.Office.Interop.Outlook.OlUserPropertyType.olYesNo) 
     oProperty.Value = True 
     oMail.Save() 
     oMail.Send() 
    Else 
     MsgBox("Err") 
     Exit Sub 
    End If 
End Sub 

、私が持っている(抜粋):

Private Sub ThisAddIn_Startup() Handles Me.Startup 
    Dim sentItems As Outlook.Items 
    Dim sentFolder As Outlook.Folder 
    Dim paisapiges As String 
    Dim aux As String() 
    Dim ns As Microsoft.Office.Interop.Outlook.NameSpace 

    apigesIsLoaded = True 

    'adiciono um trigger para que sempre que for enviado um email e for do tipo SALVARAPIGES, ele fará o tratamento de salvar o email. 
    sentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) 
    sentItems = sentFolder.Items 
    AddHandler sentItems.ItemAdd, AddressOf itemadd 

と私のitemaddルーチン:

Sub itemadd(ByVal NewEmailItem As Object) 
    Dim oProperties As Outlook.UserProperties 
    Dim salvaApiges As Boolean 
    Dim sentMessageItem As Outlook.MailItem = CType(NewEmailItem, Outlook.MailItem) 
    Dim mainForm As New formSalvarApiges() 

    salvaApiges = False 
    If Not sentMessageItem Is Nothing Then 
     oProperties = sentMessageItem.UserProperties 
     For Each pr As Outlook.UserProperty In oProperties 
      If pr.Name = "SALVARAPIGES" Then 
       salvaApiges = True 
       Exit For 
      End If 
     Next 

     If salvaApiges Then 
      mainForm.txtAssunto.Text = sentMessageItem.Subject 
      mainForm.sAction = "Acao01" 
      mainForm.sEntryId = sentMessageItem.EntryID 
      mainForm.ShowDialog() 
      mainForm.Close() 
     End If 
    End If 
End Sub 

メールにこの「SALVARAPIGES」ユーザプロパティがある場合は、ディレクトリツリーのMSGに保存する必要があります。しかし、半分のユーザーはこれが機能しないと言っています(フォームはポップされません)が、テストするたびに動作します。私はVSTOとその背後にあるすべてのコンセプトに非常に慣れています...誰でも私の方向性を指摘できますか?

私はNameSpace.SendAndReceiveメソッドを使用しようとしましたが、彼らは不平を続けています。

ありがとうございます!

答えて

1

イベント(sentItems)を発生させるオブジェクトは、ローカル変数として宣言されます。 GCが起動すると、すぐに解放され、イベントは発生しなくなります。変数がクラスレベルで宣言し、生きていることを確認します。

1

あなたはガベージコレクタによってスワイプからそれを防ぐために、クラスレベルでソースオブジェクトを宣言する必要があります。

Dim sentItems As Outlook.Items 

Private Sub ThisAddIn_Startup() Handles Me.Startup 
Dim sentFolder As Outlook.Folder 
Dim paisapiges As String 
Dim aux As String() 
Dim ns As Microsoft.Office.Interop.Outlook.NameSpace 

apigesIsLoaded = True 

'adiciono um trigger para que sempre que for enviado um email e for do tipo SALVARAPIGES, ele fará o tratamento de salvar o email. 
sentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail) 
sentItems = sentFolder.Items 
AddHandler sentItems.ItemAdd, AddressOf itemadd 
+0

があなたのより完全な答えをありがとうございましたが、最初の答えはまだ問題を解決するのに十分です私は彼に信用を与えるでしょう。しかし、ありがとうございました! – fferrandini

関連する問題