martes, 18 de junio de 2019

VBA: Enviar email desde cuenta específica de Outlook

Aprenderemos en el post de hoy a elegir una de nuestras cuentas de Outlook desde la que enviar nuestros emails...

[...] en mi outlook tengo configurada más de una cuenta, 
con que código especifico de cual quiero que se envíe el correo?[...]


La propiedad buscada en .SendUsingAccount.
Fundamental para el correcto funcionamiento asignar la propiedad como una variable declarada con Set:
Set .SendUsingAccount = xxxxx
Importante (y obvio) emplear la propiedad antes de llamar al método Send.


Supongamos los siguiente valores A2:D2 en nuestra hoja:

VBA: Enviar email desde cuenta específica de Outlook



Insertamos en la ventana de código de un módulo estándar el siguiente código:
No olvides activar la librería de Microsoft Outlook...!!

Sub EnvioCuentaEspecificaOutlook()
'OJOOO.. activar referencia/librería Microsoft Outlook 16.0 Object Library o superior !!!
Dim olApp As Object
Dim olMailItm As Object

'Creamos 'la aplicación de MS Outlook'
'que será la que voy a utilizar
Set olApp = CreateObject("Outlook.Application")
'y genero un email vacío... de momento
Set olMailItm = olApp.CreateItem(0)
'completamos elementos del email
With olMailItm
    .to = Range("A2").Value     'el destinatario
    '.bcc = Range("A3").Value   'si quisiéramos enviar con copia oculta
    .Subject = Range("B2").Value    'el asunto del correo
    .Body = Range("C2").Value       'el cuerpo del email
    .Attachments.Add Range("D2").Value  'si queremos adjuntar algún fichero
    Set .SendUsingAccount = olApp.Session.Accounts.Item(2)        'elegimos la cuenta desde donde enviar el email..
    .Display 'mostramos el email completo
    '.Send      'y lo enviamos... (si queremos)
End With

'Dejamos limpias las variables empleadas
Set olMailItm = Nothing
Set olApp = Nothing
End Sub



Y listo... enviando emails desde la cuenta de Outlook deseada.

Un paso previo interesante para conocer qué cuentas tenemos en nuestro Outlook y sobre todo a qué orden/numeración corresponde, sería lanzar la siguiente macro...

Sub testCuenta()
Dim olApp As Object

Set olApp = CreateObject("Outlook.Application")

For i = 1 To olApp.Session.Accounts.Count
    MsgBox "La cuenta " & olApp.Session.Accounts.Item(i) & " tiene el orden " & i
Next i
End Sub


De esta forma identificamos el número de cuenta a elegir...

Un método alternativo es enviar correos en nombre de otra persona o cuenta (.SentOnBehalfOfName).
Por supuesto podremos hacer uso de esta propiedad si tenemos acceso a esa cuenta ;-)

Insertamos en la ventana de código de un módulo estándar el siguiente código:
No olvides activar la librería de Microsoft Outlook...!!

Sub SendEmailOnBehalf()
Dim olMailItm As Outlook.MailItem

Set olMailItm = Outlook.CreateItem(olMailItem)
With olMailItm
  .SentOnBehalfOfName = "consultoria@excelforo.com"     'indicamos la cuenta desde donde enviar el email (en nombre de...)
  .To = "excelforo@gmail.com"
  .Subject = "Email en nombre de otra cuenta"
  .Body = "Hola!!" & vbNewLine & "Saludos cordiales"
  .Display
  .Send
End With
End Sub

5 comentarios:

  1. Lo que necesito es que cuando ponga en la Celda B11(Mexico X) me sume toda la columna donde se encuente Mexico X pero que esta sumas este clasificada de acuerdo la clase columna A como mi ejemplo Pongo Mexico 4 Celda B11 y me suma toda la fila F pero las suma son deacerdo a los clase de G Admon, G Venta y G Fijo, solo que esta formula tiene que considera que esta tabla nunca esta ordenada ya que Mexico 4 pude estar en la columna( C, D, E, F, h, I)



    ResponderEliminar
    Respuestas
    1. Hola Otero,
      cómo estás?, un placer saludarte igualmente.

      Lo siento pero no comprendo..¿podrías ampliar la explicación?

      Gracias y saludos cordiales

      Eliminar
  2. Hola Ismael, antes que nada gracias por la publicación sobre este tema!
    Estoy intentando usar la propiedad .SendUsingAccount. pero me arroja error "438:el objeto no admite esta propiedad o metodo".
    Aclaro que no tengo mucha experiencia con macros.

    Copio parte del código donde creo y envío el correo, y donde debo especificar con que cuenta enviarlo: (espero se entienda y puedas ayudarme)

    'genero el mail y envio el mismo (PARA MANDAR RANGO DE CELDAS EN EL CUERPO DEL MAIL)
    Dim objOL As New Outlook.Application
    Dim Destinatario As String
    Dim Destinatario2 As String
    Dim Asunto As String
    Dim Adjunto As String
    Set objMail = objOL.CreateItem(olMailItem)

    With objMail
    ThisWorkbook.Activate
    Destinatario = Hoja1.Cells(13, 13) & "; " & Hoja1.Cells(14, 13) & "; " & Hoja1.Cells(18, 13)
    Destinatario2 = Hoja1.Cells(15, 13) & "; " & Hoja1.Cells(17, 13) & "; " & Hoja1.Cells(20, 13)
    Asunto = Hoja1.Cells(23, 12) & " al " & Hoja1.Cells(22, 12)
    ActiveSheet.Range(Hoja1.Cells(22, 14)).Select 'rango que se muestra en el cuerpo del mail. Éste figura en la hoja1 selda (22,14)
    ActiveWorkbook.EnvelopeVisible = True

    With ActiveSheet.MailEnvelope
    .Item.To = Destinatario
    If nivel = 2 Then 'si hay nivel superior a 3 copiamos a Gerente de área-Alberto
    .Item.CC = Destinatario2 & "; " & Hoja1.Cells(19, 13)
    Else 'si solo hay nivel 3 copiamos solo a coordinador
    .Item.CC = Destinatario2
    End If

    .Item.Subject = Asunto
    .Introduction = Hoja1.Cells(24, 12) + Hoja1.Cells(24, 13) 'introducimos el texto en el cuerpo del mail

    Set .SendUsingAccount = objOL.Session.Accounts.Item(2) 'Elegimos la cuenta con la que se envía el correo (2)

    .Item.Send
    End With
    End With
    Set objMail = Nothing
    Set objOL = Nothing

    Muchas Gracias!
    saludos

    ResponderEliminar
    Respuestas
    1. Hola,
      por desgracia, hasta donde yo se, no es posible compatibilizar la opción de enviar email .Mailenvelope con la elección de cuenta...

      :'(

      Si solo quieres enviar una celda como rango adjunto (cells(22,14)), yo añadiría como valor en el cuerpo (.body) del email 'normal'

      Saludos

      Eliminar
    2. Muchas Gracias igualmente Ismael!!
      saludos!

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.