VBA Outlook 2003 - Envie todas as suas mensagens por e-mails como Bcc, automaticamente.


O MS Outlook tem uma regra quando enviamos mensagens para outra pessoa como 'Cc', mas não tem nada equivalente para mensagens enviadas como 'BCC' (ou CCo, Oculta). Utilizaremos o evento Application.ItemSend, que é acionado sempre que um usuário envia uma mensagem.

Esta versão é ideal para o Outlook 2003 ou posterior. Ela usa objetos exclusivamente Outlook e inclui manipulação de erro para evitar problemas com um endereço inválido Bcc.

Ela usa objetos exclusivamente Outlook e inclui manipulação de erro para evitar problemas com um endereço inválido Bcc. 

Coloque esse código VBA no módulo interno de ThisOutlookSession:


1ª Versão:

Private Sub Application_ItemSend (ByVal Item As Object, Cancel As Boolean)
    Dim objRecip As Recipient
    Dim strMsg As String
    Dim res As Integer
    Dim strBcc As String
    On Error Resume Next

    strBcc = "bernardess@gmail.com"

    Set objRecip = Item.Recipients.Add(strBcc)
    objRecip.Type = olBCC

    If Not objRecip.Resolve Then
        strMsg = "Não posso enviar esta mensagem oculta. " & _
                 "Deseja continuar enviando a mensagem?"

        res = MsgBox(strMsg, vbYesNo + vbDefaultButton1, _
                "Não posso enviar esta mensagem oculta.")

        If res = vbNo Then
            Cancel = True
        End If
    End If

    Set objRecip = Nothing
End Sub

A razão pela qual este método não é adequado para as versões anteriores do Outlook 2003 é porque ele dispara um alerta de segurança devido ao uso do Recipients.Add

Você pode evitar avisos de segurança, simplesmente definindo a propriedade Item.Bcc para o endereço desejado, mas terá dois problemas. Primeiro, iria retirar os destinatários Bcc que o usuário já tivesse adicionado. Além disso, em algumas configurações do Outlook, mesmo se você usar um endereço SMTP apropriado, obteria um erro, e o Outlook não enviaria a mensagem.


2ª Versão:

Esta versão utiliza a mesma técnica básica da 1ª versão, apenas adiciona a biblioteca de terceiros Outlook Redemption para evitar avisos de segurança das versões anteriores ao Outlook 2003 e, caso o beneficiário não possa ser resolvido, para mostrar ao usuário uma caixa de diálogo de resolução dos nomes.


Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    ' Requires a reference to
    ' the SafeOutlook library (Redemption.dll)

    Dim objMe As Redemption.SafeRecipient
    Dim sMail As Redemption.SafeMailItem

    On Error Resume Next
    
    Set sMail = CreateObject("Redemption.SafeMailItem")

    Item.Save

    sMail.Item = Item
    Set objMe = sMail.Recipients.Add ("bernardess@gmail.com")
    objMe.Type = olBCC

    If Not objMe.Resolve(True) Then
        Cancel = True
    End If
    
    Set objMe = Nothing
    Set sMail = Nothing
End Sub

Fonte: OutlookCode



Veja também:



Tags: Outlook 2003, send, message, mensagem, Bcc, ThisOutlookSession


André Luiz Bernardes
A&A® - Work smart, not hard.

VBA Outlook - Obtendo o endereço SMTP da um pasta pública do Exchange


Cada pasta na hierarquia do Exchange Server Public pode ter um endereço de e-mail. Caso saiba o endereço do SMTP, pode enviar mensagens, ou mesmo pedidos de reunião (Invites), diretamente desta pasta. 

O código abaixo mostra como obter o endereço da pasta usando a biblioteca Redemption para evitar o desencadeamento solicitado pela segurança do Outlook.

Também pode utilizar a mesma técnica com o objeto AddressEntry CDO, mas obviamente isso provocaria avisos de segurança em muitos ambientes (versões/instalações) do Outlook.

Use esta versão de código com uma biblioteca qualquer de 'Resgate' de terceiros (Por exemplo o SafeOutlookLibrary), para evitar os avisos de segurança geradas por tentativas de acesso aos objetos e as propriedades de endereço quando o Outlook E-mail Security Update estiver instalado.





Function R_GetPFAddress(objFolder)
    Dim oSafeFolder 'As New Redemption.MAPIFolder
    Dim objUtils 'As Redemption.MAPIUtils
    Dim arrBytes
    Dim strAddress, strEntryID 'As String
    Dim oAE 'As Redemption.AddressEntry

    Const PR_ADDRESS_BOOK_ENTRYID = & H663B0102
    Const PR_EMAIL = & H39FE001E

    On Error Resume Next

    Set objUtils = CreateObject ("Redemption.MAPIUtils")
    Set oSafeFolder = CreateObject ("Redemption.MAPIFolder")

    oSafeFolder.Item = objFolder
    arrBytes = oSafeFolder.Fields (PR_ADDRESS_BOOK_ENTRYID)
    strEntryID = objUtils.HrArrayToString (arrBytes)

    Set oAE = objUtils.GetAddressEntryFromID (strEntryID)

    R_GetPFAddress = oAE.Fields (PR_EMAIL)
 End Function

Fonte: OutlookCode



Tags: Outlook, SMTP, exchange, server, public, addressentry


André Luiz Bernardes
A&A® - Work smart, not hard.

VBA OutLook - Enviando lembretes por e-Mail.

Programe o seu Outlook para que sempre que dispare um lembrete (remind), também envie uma mensagem por e-mail. Este exemplo de código VBA Outlook envia as informações do 'Remind' para o e-mail que especificarmos. 

Coloque esse código no módulo ThisOutlookSession.

Private Sub Application_Reminder(ByVal Item As Object)
  Dim objMsg As MailItem

  ' create new outgoing message
  Set objMsg = Application.CreateItem(olMailItem)

   ' your reminder notification address
  objMsg.To = "bernardess@gmail.com"
  objMsg.Subject = "Reminder: " & Item.Subject

  ' must handle all 4 types of items that can generate reminders

  Select Case Item.Class

     Case olAppointment '26
        objMsg.Body = _
          "Start: " & Item.Start & vbCrLf & _
          "End: " & Item.End & vbCrLf & _
          "Location: " & Item.Location & vbCrLf & _
          "Details: " & vbCrLf & Item.Body

     Case olContact '40
        objMsg.Body = _
          "Contact: " & Item.FullName & vbCrLf & _
          "Phone: " & Item.BusinessTelephoneNumber & vbCrLf & _
          "Contact Details: " & vbCrLf & Item.Body

      Case olMail '43
        objMsg.Body = _
          "Due: " & Item.FlagDueBy & vbCrLf & _
          "Details: " & vbCrLf & Item.Body

      Case olTask '48
        objMsg.Body = _
          "Start: " & Item.StartDate & vbCrLf & _
          "End: " & Item.DueDate & vbCrLf & _
          "Details: " & vbCrLf & Item.Body
  End Select

  ' send the message 
  objMsg.Send
  Set objMsg = Nothing
End Sub

Fonte: OutlookCode


Tags: Outlook, send, reminder, lembrete





André Luiz Bernardes
A&A® - Work smart, not hard.

VBA Access - Documentando os objetos da aplicação

VBA Access - Documentando Objetos da Aplicação MS Access - Code Documenter


ACESSE AO CÓDIGO ATUALIZADO PARA TODAS AS VERSÕES AQUI.



Envie seus comentários e sugestões e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com

✔ Brazil SFE®✔ Brazil SFE®´s Facebook´s Profile  Google+   Author´s Professional Profile  ✔ Brazil SFE®´s Pinterest       ✔ Brazil SFE®´s Tweets

VBA Excel - Ordena worksheets da planilha - Sort All Sheets in a Workbook


Podemos ordenar todas as planilhas numa seqüência alfabética, enquanto os ícones por worksheet não vem.

Sub SrtShs()
Dim iSheet As Long, iBefore As Long 

For iSheet = 1 To ActiveWorkbook.Sheets.Count     
    Let Sheets(iSheet).Visible = True 

    For iBefore = 1 To iSheet - 1       
        If UCase(Sheets(iBefore).Name) & UCase(Sheets(iSheet).Name) Then  
                    ActiveWorkbook.Sheets(iSheet).Move 

          Before:=ActiveWorkbook.Sheets(iBefore)         

          Exit For       
        End If     

    Next iBefore   
Next iSheet 

End Sub

Tags: Excel, worksheets, sheets, ws, insert, inserindo, sort, ordena


André Luiz Bernardes
A&A® - Work smart, not hard.

VBA Excel - Loop por todas as worksheets

Ok, isso é o básico, mas é válido, especialmente para iniciantes.

  Sub SheetsWrap()
    Dim iSheet as Long

    Let Application.ScreenUpdating = False

    For iSheet = 1 To ActiveWorkbook.WorkSheets.Count
     Let WorkSheets(iSheet).cells(1,1) = "'" & WorkSheets(iSheet).name
    Next iSheet

    Let Application.ScreenUpdating = True
  End Sub



Tags: Excel, loop, wrap, worksheets, sheets, ws


André Luiz Bernardes
A&A® - Work smart, not hard.

diHITT - Notícias