Несколько открытых элементов электронной почты в одной подзадаче Item_Send

В настоящее время мой код проверяет электронную почту (в событии Item_Send), чтобы узнать, есть ли в ней вложение, а затем дает условную форму для шифрования и отправки, отправки незашифрованного или отмены отправки. Он также ищет SSN в теле, предоставляя пользователю то же самое всплывающее окно формы. Все работает так, как рекламируется, если у пользователя одновременно не открыты два окна/экземпляра электронной почты. Например, если электронное письмо № 1 имеет вложение, а электронное письмо № 2 находится в фоновом режиме, если я попытаюсь отправить электронное письмо № 1 и выберу «Отменить отправку», оно вернется к электронному письму № 1 без отправки (как рекламируется), однако, когда вы вернетесь к электронной почте № 2 и попытаетесь отправить (это не имеет ничего общего с электронной почтой № 1), она также не будет отправлена. Я покажу код ниже, но я использую команду «Отмена = True», чтобы остановить электронное письмо, но это останавливает операцию отправки, и инспектор остается открытым, что не позволяет мне отправлять электронные письма, которые могли быть открыты в это время. время. Есть идеи по этому поводу? Как я могу заставить это событие Item_Send обрабатывать только ТЕКУЩИЙ экземпляр Outlook.MailItem, а не другой, который может быть открыт в то же время. Спасибо! Я многое упустил из кода, это лишь часть проблемы, с которой я столкнулся. SSNBtnPress=3 для отмены=Истина

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 в теле письма (или теме), появляется форма с просьбой зашифровать/отправить, отправить в незашифрованном виде или отменить. Кнопка «Отмена» вызывает проблемы. Если я нажму «Отмена», он вернется к электронной почте и позволит им что-либо изменить, но если я открою электронное письмо (даже если я удалю это первое) и нажму «Отправить», оно будет действовать так, как если бы оно все еще было в состоянии «Отмена = Истина» и не не отправляет, просто сидит там, и единственный способ, которым я могу отправить ЧТО-НИБУДЬ впоследствии, - это вернуться к исходному электронному письму и отправить его. Очень плохо. - 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) Обрабатывает 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. Затем я вызываю эту переменную в основной сценарий надстройки. - person user3078575; 11.01.2014

Я бы подумал, что какое-то свойство сохраняется из mail1 и не сбрасывается при отправке других элементов. Поэтому все дальнейшие письма не будут отправляться

person Max    schedule 12.01.2014
comment
Именно в этом и заключалась моя проблема: у меня был оператор IF, который оставался открытым, и, таким образом, глобальная переменная оставалась заданной для будущих электронных писем. Плохой! Помещение оператора ELSE в Cancel=False Exit Sub помогло. Спасибо пользователю лол. - person user3078575; 13.01.2014
comment
было приятно, у меня была точно такая же проблема однажды, поэтому это было легко догадаться. - person Max; 14.01.2014