Множество отворени имейл елементи в един Item_Send Sub Issue

В момента моят код проверява имейла (на събитието Item_Send), за да види дали има прикачен файл и след това дава условен формуляр за шифроване и изпращане, изпращане нешифровано или отмяна на изпращане. Той също така търси SSN в тялото, като дава на потребителя същия изскачащ формуляр. Всичко работи, както е рекламирано, освен ако потребителят има отворени два имейл прозореца/екземпляра едновременно. Например, ако имейл №1 има прикачен файл, а имейл №2 е на заден план, ако се опитам да изпратя имейл №1 и избера Отказ от изпращането, той се връща към имейл №1 без изпращане (както се рекламира), обаче, когато се върнете към имейл №2 и се опитате да изпратите (което няма нищо общо с имейл №1), той също няма да изпрати. Ще покажа кода по-долу, но използвам командата „Cancel=True“, за да спра имейла, но това спира операцията за изпращане и инспекторът остава отворен, като по този начин не ми позволява да изпращам имейли, които може да са били отворени в този момент време. Има ли някакви идеи около това? Как мога да накарам това събитие Item_Send да обработва само ТЕКУЩИЯ екземпляр на Outlook.MailItem, а не друг, който може да е отворен по същото време. Благодаря! Изпуснах много от кода, това е само част от проблема, който имам. SSNBtnPress=3 за Cancel=True

Public Sub Application_ItemSend(ByVal Item As Object, _
    ByRef Cancel As Boolean) Handles Application.ItemSend
    Dim mailItem As Outlook.MailItem = TryCast(Item, Outlook.MailItem)
    If mailItem IsNot Nothing Then
  frm1.ShowDialog()
        If (SSNbtnPress = 1) Then
            mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/x-PII", "Encryptclicked")
            If RegexObj1.IsMatch(mailItem.Body) Then
                mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 3)
                Cancel = False
            ElseIf RegexObj1.IsMatch(mailItem.Subject) Then
                mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 3)
                Cancel = False
            Else
                mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 3)
                Dim addToBody As String = "Test" + vbNewLine + vbNewLine + mailItem.Body
                Dim addtoSubject As String = "Test " + mailItem.Subject
                mailItem.Subject = addtoSubject
                mailItem.Body = addToBody
                Cancel = False
            End If
        End If
    End If
    If (SSNbtnPress = 2) Then
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/x-PII", "SUclicked")
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 2)
        Cancel = False
        Exit Sub
    ElseIf (SSNbtnPress = 3) Then
        mailItem.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003", 2)
        Cancel = True
        Exit Sub
    End If
End Sub

Край на класа


person user3078575    schedule 11.01.2014    source източник


Отговори (2)


Ако всичко, което желаете, е да проверите дали изпратеният артикул съответства на елемента, отворен в момента на изпращане, трябва да погледнете в ActiveInspector.

Можете да получите достъп до активния инспектор чрез вашата референтна променлива към приложението Outlook и можете да получите достъп до променливата на приложението чрез самия елемент.

След като препратите към ActiveInspector, можете да получите неговия CurrentItem и да го сравните с изпратения елемент, напр.

Dim isItemBeingSentCurrent As Boolean = mailItem.Application.ActiveInspector.CurrentItem Is mailItem
person DanL    schedule 11.01.2014
comment
Простото поставяне на този ред хвърля изключение, но не и във VS дебъгера, което е странно, по-скоро при зареждане на Outlook казва, че не може да бъде намерен. - person user3078575; 11.01.2014
comment
Заредих го, получавам това изключение сега: Операторът „=“ не е дефиниран за тип „MailItem“ и тип „MailItem“. - person user3078575; 11.01.2014
comment
О, обърках VB.NET и VBA в отговора си, тъй като го тествах само във VBA. Редактирах отговора. - person DanL; 11.01.2014
comment
Това и mailItem.Application.ActiveInspector.CurrentItem Is mailItem) работи (мисля хаха). Но все още имам проблем, когато щракна върху отмяна (cancel=True) за този конкретен имейл. Дори и да отворя нов, той все още изпраща тази команда cancel=true в нов прозорец? Трябва ли да поставя израз IF след събитието ITEM_SEND, за да кажа If isItemBeingSendCurrent= True Then - person user3078575; 11.01.2014
comment
Разбрах ли правилно формулировката на публикацията ви, когато предположих, че искате този манипулатор (Item_Send) да избяга, ако не обработва текущо отворения елемент? В такъв случай просто ще трябва да направите нещо подобно в началото на метода: If(isItemBeingSentCurrent) Then Exit Sub - person DanL; 11.01.2014
comment
Правилно, по принцип се появява имейлът и ако открие прикачен файл или SSN в тялото на имейла (или темата), се появява формуляр, който ги моли да шифроват/изпратят, да изпратят нешифровано или да отменят. Бутонът Отказ е това, което създава проблеми. Ако щракна върху отмяна, той се връща към имейла и им позволява да променят каквото и да е, но ако отворя имейл (дори ако изтрия този първи) и щракна върху изпращане, той действа така, сякаш все още е в Cancel=True и не Не изпращам, просто си стои там и единственият начин да изпратя НЕЩО след това е, ако се върна към този оригинален имейл и го изпратя. Много лошо. - person user3078575; 11.01.2014
comment
Току-що направих подобна настройка с формуляр, задействан на Item_Send, който анулира имейла, ако щракна върху определен бутон, и не успях да възпроизведа проблема ви с две отворени имейла. Какъв е обхватът на вашата променлива „SSNbtnPress“? т.е. къде се декларира и кога е достъпен? - person DanL; 11.01.2014
comment
Глобална променлива от персонализирана потребителска форма: Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click SSNbtnPress = 2 Close() End Sub - person user3078575; 11.01.2014
comment
Нямате достатъчно репутация за чат :-) Е, тогава по-скоро подозирам, че има проблем с променливата. Манипулаторът ItemSend се извиква за всеки изпратен отделен елемент и единственият начин да бъде отменен е, ако зададете Cancel = True. Единственият ред, който виждам във вашия код да прави това, е ако „SSNbtnPress“ е зададено на 3. Трябва ли променливата да има глобален обхват? - person DanL; 11.01.2014
comment
може ли да чатим някъде другаде - person user3078575; 11.01.2014
comment
Показах ви код от потребителската форма, който при натискане на бутон задава променливата SSNBtnPress на 1, 2 или 3. След това извиквам тази променлива към основния скрипт на Addin - person user3078575; 11.01.2014

Мисля, че някои свойства се съхраняват от mail1 и не се нулират при изпращане на други елементи. Следователно всички следващи имейли няма да бъдат изпращани

person Max    schedule 12.01.2014
comment
Точно това беше проблемът ми, имах оператор IF, който беше оставен отворен и по този начин беше оставена зададена глобална променлива за бъдещи имейли. лошо! Поставянето на оператор ELSE на Cancel=False Exit Sub свърши работа. Благодарение на потребителя lol. - person user3078575; 13.01.2014
comment
Беше удоволствие, имах точно същия проблем веднъж, затова беше лесно да се досетите. - person Max; 14.01.2014