Outlook - erro de item estranho.Attachments

0

Eu tenho o seguinte código, que deve salvar um arquivo específico do Excel anexado a um email. O código é combinado com uma regra, que aciona esse script quando um email com um assunto específico é recebido. O código é acionado, mas aqui vem o erro mais estranho que eu vi ultimamente: itm.Attachments.Count parece ser zero e, obviamente, o arquivo não é salvo! Mas ... se eu colocar um ponto de interrupção na linha "Para cada ..." e adicionar itm.Attachments.Count para ver a janela, ele é mostrado como zero. Se eu adicionar apenas itm, então navegue para a propriedade Attachments e, em seguida, para a propriedade Count, ele mostrará 1 para Count (como deveria) e o código será executado corretamente. Passei meio dia tentando entender o que está acontecendo, mas não consigo entender.

O comportamento é o mesmo em um Outlook 2010 x64 em um Windows 7 x64 e em um Outlook 2010 x86 em um Windows 7 x86. As macros estão habilitadas no Trust Center. Anexei algumas screenshots com as configurações de código e regra e também um filme mostrando a estranheza das janelas de relógio.

O script foi criado há algum tempo, funcionou bem em alguns PCs e foi baseado nas etapas a seguir: iterrors.com/outlook-automatically-save-an-outlook-attachment-to-disk/. Alguma idéia?

Adrian

Tela de regras aqui: link

1 min. filme aqui: link

Public Sub Kona(itm As Outlook.MailItem)
    Dim objAtt As Outlook.Attachment
    Dim saveFolder As String
    saveFolder = "C:\test"
    For Each objAtt In itm.Attachments
        If InStr(objAtt.DisplayName, "Kona Preferred Fixed Price Matrix (ALL)") Then
            objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
        End If
        Set objAtt = Nothing
    Next
End Sub
    
por user2285985 28.03.2015 / 01:38

1 resposta

1

Eu busquei na internet uma solução para esse problema, e ninguém parece ter proposto uma solução ainda. Aqui está o que eu fiz:

O problema: Contas de Email do Outlook do tipo IMAP não baixam o Corpo e os Anexos quando chegam pela primeira vez. Especialistas do Outlook em todos os lugares dirão que você pode ajustar isso nas Configurações Avançadas do Outlook, mas, eles estão errados, isso não terá efeito.

Solução 1: Mude para o POP3. Do ponto de vista da programação, isso resolve o problema, mas minha opinião é que, se você não pode fazer isso com o IMAP, você está fazendo errado, certo?

Solução 2: Note que isso é força bruta, mas faz o trabalho. Em ThisOutlookSession:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
  Dim objOutlook As Object
  Dim objNameSpace As Object

  Set objOutlook = Outlook.Application
  Set objNameSpace = objOutlook.GetNamespace("MAPI")

  'I am using this code on my gmail
  Set Items = objNameSpace.Folders("[email protected]").Folders("Inbox").Items
End Sub
Private Sub Items_ItemAdd(ByVal objItem As Object)
    Dim objExcel As Object
    Dim objMsg As Object
    Dim Atmt As Outlook.Attachment
    Dim Atmts As Outlook.Attachments
    Dim objFSO As Object
    Dim objFile As Object
    Dim strFilePath As String
    Dim strBody As String

    On Error GoTo ErrorHandler
    If TypeName(objItem) = "MailItem" Then
        Set objMsg = objItem
        If objMsg.DownloadState <> 1 Then
            objMsg.Display
            objMsg.Close (1)
            Set objMsg = Nothing
            DoEvents
            Sleep (1000) 'Need a pause or the loop runs to fast and kills Outlook
            RetryMailEvent objItem
        Else
            strBody = objMsg.Body

            Set Atmts = objMsg.Attachments

            For Each Atmt In Atmts
                If Right$(Atmt.FileName, 3) = "txt" Then
                    Set objFSO = CreateObject("Scripting.FileSystemObject")
                    strFilePath = "C:\temp\" & Format(objItem.CreationTime, "yyyymmdd_hhnnss_") & Atmt.FileName
                    Atmt.SaveAsFile strFilePath
                    Set objFile = objFSO.OpenTextFile(strFilePath, 1)
                    strBody = strBody & "[Attatchment] " & objFile.ReadAll & " [/Attatchment]"

                    objFile.Close
                    Kill strFilePath
                End If
            Next Atmt

            'Any additional Code you want to run goes here

        End If
    End If
ProgramExit:
    Set objMsg = Nothing
    Set objExcel = Nothing
    Exit Sub
ErrorHandler:
    MsgBox Err.Number & " - " & Err.Description
    Resume ProgramExit
End Sub

Em um módulo separado:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub RetryMailEvent(ByVal objItem As Object)
    Dim objExcel As Object
    Dim objMsg As Object
    Dim Atmt As Outlook.Attachment
    Dim Atmts As Outlook.Attachments
    Dim objFSO As Object
    Dim objFile As Object
    Dim strFilePath As String
    Dim strBody As String

    On Error GoTo ErrorHandler
    If TypeName(objItem) = "MailItem" Then
        Set objMsg = objItem
        If objMsg.DownloadState <> 1 Then
            Set objMsg = Nothing
            DoEvents
            Sleep (1000) 'Need a pause or the loop runs to fast and kills Outlook
            RetryMailEvent objItem
        Else
            strBody = objMsg.Body

            Set Atmts = objMsg.Attachments

            For Each Atmt In Atmts
                If Right$(Atmt.FileName, 3) = "txt" Then
                    Set objFSO = CreateObject("Scripting.FileSystemObject")
                    strFilePath = "C:\temp\" & Format(objItem.CreationTime, "yyyymmdd_hhnnss_") & Atmt.FileName
                    Atmt.SaveAsFile strFilePath
                    Set objFile = objFSO.OpenTextFile(strFilePath, 1)
                    strBody = strBody & "[Attatchment] " & objFile.ReadAll & " [/Attatchment]"

                    objFile.Close
                    Kill strFilePath
                End If
            Next Atmt

            'Any additional Code you want to run goes here

        End If
    End If
ProgramExit:
    Set objMsg = Nothing
    Set objExcel = Nothing
    Exit Sub
ErrorHandler:
    MsgBox Err.Number & " - " & Err.Description
    Resume ProgramExit
End Sub

Observação: tornei-me um usuário do StackExchange apenas para compartilhar essas descobertas com você. Eu gosto disso, por favor, vá em frente e ligue outras almas com problemas semelhantes para aqui:).

    
por 23.10.2015 / 20:47