A regra "Executar script" do Outlook não aciona o script VBA para mensagens recebidas
Estou criando este novo tópico seguindo o conselho de outro membro. Para uma história adicional sobre como as coisas chegaram a esse ponto, consulteessa questão.
Eu tenho esse script VBA, que eu sei que funcionaE se é acionado. Se eu usar a sub-rotina TestLaunch com uma mensagem já na minha caixa de entrada que atenda aos critérios da regra (mas, é claro, não está sendo lançada pela regra), ela ativará o link que eu quero que ele ative perfeitamente. Se, quando eu criar a regra, digo para aplicá-la a todas as mensagens existentes na minha caixa de entrada, ela funcionará perfeitamente. No entanto, onde é necessário,quando novas mensagens chegarem isso não.
Eu sei que o script não está sendo acionado, porque se eu tiver uma regra como esta:
Regra de "Nova mensagem" do Outlook com "reproduzir som" habilitado
com "Tocar um som" como parte dele, o som sempre é reproduzido quando uma mensagem chega de um dos dois remetentes especificados, portanto, a regra está sendo acionada. Eu removi a parte de reprodução de som da regra e a integrei ao código VBA para fins de teste:
Option Explicit
Private Declare Function ShellExecute _
Lib "shell32.dll" Alias "ShellExecuteA" ( _
ByVal hWnd As Long, _
ByVal Operation As String, _
ByVal Filename As String, _
Optional ByVal Parameters As String, _
Optional ByVal Directory As String, _
Optional ByVal WindowStyle As Long = vbMinimizedFocus _
) As Long
Private Declare Function sndPlaySound32 _
Lib "winmm.dll" _
Alias "sndPlaySoundA" ( _
ByVal lpszSoundName As String, _
ByVal uFlags As Long) As Long
Sub PlayTheSound(ByVal WhatSound As String)
If Dir(WhatSound, vbNormal) = "" Then
' WhatSound is not a file. Get the file named by
' WhatSound from the Windows\Media directory.
WhatSound = Environ("SystemRoot") & "\Media\" & WhatSound
If InStr(1, WhatSound, ".") = 0 Then
' if WhatSound does not have a .wav extension,
' add one.
WhatSound = WhatSound & ".wav"
End If
If Dir(WhatSound, vbNormal) = vbNullString Then
Beep ' Can't find the file. Do a simple Beep.
Exit Sub
End If
Else
' WhatSound is a file. Use it.
End If
sndPlaySound32 WhatSound, 0& ' Finally, play the sound.
End Sub
Public Sub OpenLinksMessage(olMail As Outlook.MailItem)
Dim Reg1 As RegExp
Dim AllMatches As MatchCollection
Dim M As Match
Dim strURL As String
Dim RetCode As Long
Set Reg1 = New RegExp
With Reg1
.Pattern = "(https?[:]//([0-9a-z=\?:/\.&-^!#$;_])*)"
.Global = True
.IgnoreCase = True
End With
PlayTheSound "chimes.wav"
' If the regular expression test for URLs in the message body finds one or more
If Reg1.test(olMail.Body) Then
' Use the RegEx to return all instances that match it to the AllMatches group
Set AllMatches = Reg1.Execute(olMail.Body)
For Each M In AllMatches
strURL = M.SubMatches(0)
' Don't activate any URLs that are for unsubscribing; skip them
If InStr(1, strURL, "unsubscribe") Then GoTo NextURL
' If the URL ends with a > from being enclosed in darts, strip that > off
If Right(strURL, 1) = ">" Then strURL = Left(strURL, Len(strURL) - 1)
' The URL to activate to accept must contain both of the substrings in the IF statement
If InStr(1, strURL, ".com") Then
PlayTheSound "TrainWhistle.wav"
' Activate that link to accept the job
RetCode = ShellExecute(0, "Open", "http://nytimes.com")
Set Reg1 = Nothing
Exit Sub
End If
NextURL:
Next
End If
Set Reg1 = Nothing
End Sub
Private Sub TestLaunchURL()
Dim currItem As MailItem
Set currItem = ActiveExplorer.Selection(1)
OpenLinksMessage currItem
End Sub
que deve reproduzir "chimes.wav" se o script VBA for acionado em todos os casos e reproduzir "TrainWhistle.wav" se ocorrer o processamento real da ativação do link. Quando novas mensagens chegam, isso não acontece, mas se houver um "som de reprodução" na regra do Outlook que deve executar esse script, esse som é reproduzido.
No momento, tenho as configurações da Central de Confiabilidade para macros para permitir tudo, pois o Outlook estava sendo irritadiço quanto à assinatura do que usava o selfcert.exe no início do processo de teste. Eu realmente gostaria de poder elevar as proteções de macro novamente, em vez de deixá-las em "executar tudo" quando tudo estiver pronto.
Mas, acima de tudo, não consigo descobrir por que esse script será executado perfeitamente via depurador ou se aplicado a mensagens existentes, mas não é acionado pela mesma regra do Outlook aplicada a mensagens existentes quando uma nova mensagem real chega. Isso é verdade no Outlook 2010, onde estou desenvolvendo esse script, e também no Outlook 2016, na máquina de um amigo em que está sendo implantado.
Qualquer orientação sobre como resolver esse problema seria muito apreciada.