Abrir outlook para enviar email desde access

Estoy utilizan el siguiente modulo para enviar email desde access, pero solo funciona si outlook esta abierto. ¿Hay alguna forma de abrir por código outlook y después de enviar, cerrarlo?

MODULO:

ublic Sub SendEMail(ByVal aSubject As String, ByVal aRecipients As String, Optional ByVal aBody As String = "", Optional ByVal aAttachments As String = "", Optional ByVal aRootPath As String = "")

Dim myO As Outlook.Application
Dim mobjNewMessage As Outlook.MailItem
Dim sRecipient, sAttachment, sDisplayName As String
Dim iMarker, iMarker2 As Integer
On Error GoTo Error_SendEMail
Set myO = CreateObject("Outlook.Application")
Set mobjNewMessage = myO.CreateItem(olMailItem)
mobjNewMessage.Subject = aSubject
mobjNewMessage.Body = aBody
Do
iMarker = InStr(1, aRecipients, ";", vbTextCompare)
If iMarker = 0 Then
sRecipient = aRecipients
Else
sRecipient = Mid(aRecipients, 1, iMarker - 1)
aRecipients = Mid(aRecipients, iMarker + 1)
End If
If Len(sRecipient) <> 0 Then mobjNewMessage.Recipients.Add sRecipient
Loop While iMarker <> 0
Do
iMarker = InStr(1, aAttachments, ";", vbTextCompare)
If iMarker = 0 Then
sAttachment = aAttachments
Else
sAttachment = Mid(aAttachments, 1, iMarker - 1)
aAttachments = Mid(aAttachments, iMarker + 1)
End If
If Len(sAttachment) <> 0 Then
iMarker2 = InStr(1, sAttachment, "***", vbTextCompare)
If iMarker2 <> 0 Then
sDisplayName = Mid(sAttachment, iMarker2 + 3)
sAttachment = aRootPath + Mid(sAttachment, 1, iMarker2 - 1)
If StrComp(Dir(sAttachment), "", vbTextCompare) <> 0 Then mobjNewMessage.Attachments.Add sAttachment, , , sDisplayName
Else
If StrComp(Dir(aRootPath + sAttachment), "", vbTextCompare) <> 0 Then mobjNewMessage.Attachments.Add aRootPath + sAttachment
End If
End If
Loop While iMarker <> 0
mobjNewMessage.Send
Exit_SendEMail:

Set mobjNewMessage = Nothing
Set myO = Nothing
Exit Sub

Error_SendEMail:
MsgBox Err.Description, , "Send Mail Error"
Resume Exit_SendEMail
End Sub

3 respuestas

Respuesta
2

Puedes utilizar esta función, comprueba si está abierto y si no lo está lo abre:

Function RT_Outlook_ComprobarAbrir() As Boolean
    RT_Outlook_ComprobarAbrir = True
    ' comprobamos si el outlook está abierto
    If IsAppOpen("rctrl_renwnd32") = False Then
        ' si está cerrado lo lanzamos
        Dim hInstance As Long
        hInstance = ShellExecute(0&, vbNullString, "Outlook", vbNullString, "C:\", 1)
        If hInstance < 3 Then
            RT_Outlook_ComprobarAbrir = False
            MsgBox "No se ha encontrado el Outlook en esta máquina", vbCritical, "Aviso..."
        End If
    End If
End Function

ne da error de compilación, no se ha definido sub o función.

soy un poco novato.....que hago mal?

Ops... se me olvidó ponerte algo ...

Hay que incluir la función ShellExecute (yo es que lo doy por instalada en todas mis aplicaciones, es vital para sobrevivir ... xD)

En un módulo dónde pongas tus funciones (o en el mismo que has puesto la anterior) ...

Public Declare Function ShellExecute _
Lib "shell32.dll" _
Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

También te falta esta (que mal andamos los domingos):

Function IsAppOpen(ClassName As String) As Boolean
    If FindWindow(ClassName, vbNullString) Then
        IsAppOpen = True
    End If
End Function
Respuesta
2

En Access puedes usar la instrucción docmd. Send object, por ejemplo

DoCmd.SendObject acSendReport, "Clientes", "PDFFormat(*.pdf)", , , , , , True

En caso de que no vayas a mandar ni un formulario, informe, consulta, tabla

Lo puedes poner como

Docmd. Sendobject acsendnoobject,,,,

Con lo cual se abriría Outlook

Entre las comas vas poniendo a quien va, el asunto, el mensaje, etc y si quieres mandarlo directamente sin verlo, en vez de true pones false

SI, ya he probado eso, pero pide permiso a outlook y tienes que aceptarlo cada vez, además no te deja cambiar el nombre del archivo a enviar, por eso utilizo ese código.

Genero un informe y lo guardo en pdf con un nombre adecuado y después lo mando por email con el modulo.

Por eso necesito saber si se puede abrir y cerrar outlook desde el modulo, seria más cómodo.

¿Alguna idea?

GRACIAS!

Para cambiarle el nombre al informe tienes la instrucción

Docmd. Rename

Mira, tengo un informe llamado alumnos y en el formulario le pongo un botón de comando y le pongo

DoCmd. SendObject acSendReport, "alumnos", "pdfformat(*.pdf)", "[email protected]",,, "Envio ejemplo", "ahí va eso", true

Le pongo True para poder mostrarte la imagen

 y se abre Outlook así

Cuando le cambio el True por false, me lo envía directamente

Por eso no me imagino porque te sale lo del permiso

Respuesta
2

¿Probaste con la función Shell o con Application. FollowHyperlink para arir el ejecutable de Outlook en la ruta que lo tengas?

https://support.office.com/en-us/article/Shell-Function-ff2e4b1b-712d-4e34-aea6-6832eadd3c63 

https://msdn.microsoft.com/es-es/library/office/ff822080.aspx 

Un saludo


voy a probar....... ¿lo incorporo al modulo?

Sí, al principio de todo, después de declarar las variables.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas