Cómo personalizar el mensaje de un correo enviado desde access?

En mi trabajo debo estar enviando correos cuando nos llegan los resultados de los pacientes, generalmente debemos recibir un reporte y un CD, en la mayoría de las ocasiones un día llega el reporte a los días siguientes llega el CD o ambos llegan el mismo día.

Al inicio era fácil enviar uno a uno cada correo porque eran muy pocos resultados los que nos llegaban, pero esta tarea se ha vuelto complicada por la gran cantidad que nos ingresan.

Por tal motivo me di a la tarea de investigar si desde mi access podía enviar los correos de forma masiva y me he encontrado un ejemplo muy bueno de NECKKITO nombrado como Y DOS DE MAIL, lo adapte a mi access y funciona muy bien.

Me gustaría personalizar un poco el mensaje que le está llegando a cada paciente y se indique si nos llegó el reporte, el CD o llegaron ambos, pero no sé cómo hacerlo, aquí es donde necesito de la valiosa ayuda de ustedes los expertos

Este es el código que tome del ejemplo de NECKKITO, lo único que modifiqué fue que no se solicite el asunto, el mensaje que lleva el correo y que el reporte adjunto este en formato PDF.

Private Sub cmdEnvioMasivo_Click()
On Error GoTo sol_err
'Definimos las variables
Dim mailA As String
Dim mailCC As String
Dim mailCCO As String
Dim elAsunto As String, elMsg As String
'Esta parte la modifique para que no solicite el asunto, ya que es el mismo para todos los correos
elAsunto = "Notificación de Resultados"
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(elAsunto) = 0 Then GoTo Salida
'Esta parte la modifique para que no solicite el MENSAJE, ya que es el mismo para todos los correos
'Me falta que se indique en el mensaje que llego, el reporte, el CD o ambos
elMsg = "Nos complace informarle que hemos recibido el reporte y el CD de su estudio realizado"
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(elMsg) = 0 Then GoTo Salida
'Si no se especifica nada los valores se convierten a cadena de texto vacía
If IsNull(elAsunto) Then elAsunto = ""
If IsNull(elMsg) Then elMsg = ""
'Exportamos el informe en formato snapshot a la carpeta donde tenemos la BD
Dim ruta As String, miInforme As String
ruta = Application.CurrentProject.Path & "\"
miInforme = ruta & "Informe.pdf"
DoCmd.OutputTo acOutputReport, "RDatos", acFormatPDF, miInforme, False
'Creamos el recordset
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("CComercial")
'Nos movemos al primer registro
rst.MoveFirst
'Iniciamos el proceso
Do Until rst.EOF
'Creamos una instancia de Outlook
Dim Olk As Outlook.Application
Set Olk = CreateObject("Outlook.Application")
'Creamos un nuevo mensaje de Outlook
Dim OlkMsg As Outlook.MailItem
Set OlkMsg = Olk.CreateItem(olMailItem)
'Creamos la información del mail
With OlkMsg
'Definimos los elementos del mail
Dim OlkDestinatario As Outlook.Recipient
Dim OlkAdjunto As Outlook.Attachment
'Inicializamos los elementos del mail
Set OlkDestinatario = .Recipients.Add(rst.Fields("MailCont").Value)
OlkDestinatario.Type = olTo
'Comprobamos que exista el archivo que vamos a adjuntar
If Not IsMissing(miInforme) Then
Set OlkAdjunto = .Attachments.Add(miInforme)
End If
'Añadimos los elementos Asunto y Mensaje
.Subject = elAsunto
.Body = elMsg
'Enviamos el mail
.Send
End With
'Nos movemos al siguiente registro
rst.MoveNext
Loop
'Lanzamos un mensaje de OK
MsgBox "El mensaje masivo se ha enviado correctamente", vbInformation, "CORRECTO"
'Eliminamos el archivo Informe.snp de la carpeta
Kill miInforme
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
'Eliminamos la instancia
Set Olk = Nothing
Set OlkMsg = Nothing
Set OlkDestinatario = Nothing
Set OlkAdjunto = Nothing
Salida:
Exit Sub
sol_err:
MsgBox Err.Number & ": " & Err.Description
Resume Salida
End Sub


        

1 Respuesta

Respuesta
2

Y ¿cómo sabes si has de enviar un mensaje u otro?

La solución, a nivel teórico, es tan simple como tener 3 mensajes "pregrabados" y usar un If o un select case para escoger uno u otro al enviar el correo.

Por ejemplo:

Creas los mensajes "predefinidos":

Const Msg1 As String="Nos complace informarle que hemos recibido el reporte y el CD de su estudio realizado"
Const Msg2 As String="Nos complace informarle que hemos recibido el reporte de su estudio realizado"
Const Msg3 As String="Nos complace informarle que hemos recibido el CD de su estudio realizado"

Si tienes un campo (un combinado, por ejemplo) en el que marcas si te llegó uno, otro o los dos elementos, en vez de la linea:

ElMsg = "Nos complace informarle que hemos recibido el reporte y el CD de su estudio realizado"

Haces:

Select Case Me.cboEstado
 Case "Reporte"
    elMsg=Msg2
 Case "CD"
    elMsg=Msg3
 Case "Todo"
    elMsg=Msg1
End Select

Solo has de adaptarlo a lo que tengas

¡Gracias! por tu pronta respuesta!!!

Hice lo que me sugeriste y funciona perfecto si el correo lo quisiera enviar uno a uno. 

El ejemplo envía el correo masiva mente a todos los pacientes y me esta presentando el siguiente inconveniente:

A todos los pacientes les llega un correo informando que llego el CD(que fue lo que seleccione), pero a unos les pudo haber llegado el CD a otros solo el reporte y a otros les llego ambos.

En mi tabla tengo dos campos tipo Sí/No, en una queda registrado si ya llego el CD y en el otro campo si ya llego el reporte de cada paciente.

Ahora para saber cuales resultados me llegaron el día de hoy, tengo en una consulta y como criterio le he indicado que me filtre la fecha seleccionada que se obtiene de un cuadro de texto(txt_fecha ingreso)del formulario.

la consulta me muestra los datos del paciente, el correo, si llego el CD o reporte y la fecha de llegada del resultado que se obtienen de la tabla.

Lo quiero de forma masiva y que sea posterior al haber marcado los check de llegada, porque algunos reportes o CD nos llegan rotulados con el numero de identificación incorrecto y no quiero enviarle un correo a un paciente que no le ha llegado su resultado.

La siguiente captura es una parte del formulario donde se busca al paciente por identificación para indicar que resultado nos llego y la fecha que lo ingresamos al sistema:

Mete el bloque If (o los que necesites para personalizar tus mensajes) dentro del bucle que recorre el recordset, y en vez de hacer referencia a los campos del formulario hazlo a los campos del recordset...

¡Gracias! por tu ayuda, pero sinceramente no se como hacer eso.

Ese es el problema de copiar códigos sin pararse a entenderlos, que luego se es incapaz de adaptarlos a lo que uno quiere... En la web de Neckkito tienes todas las herramientas que necesitas, con un poco de esfuerzo de tu parte, aprender a hacer estas modificaciones básicas que necesitas.

Dicho esto, te pongo cómo sería el código (sobre el tuyo original):

...
'Añadimos los elementos Asunto y Mensaje
.Subject = elAsunto
If rst("reporte")=True AND rst("CD") =True Then
  .Body="Hemos recibido el reporte y el CD"
ElseIf rst("reporte")=True AND rst("CD") =False Then
  .Body="Hemos recibido solo el reporte"
ElseIf rst("reporte")=False AND rst("CD") =True Then
  .Body="Hemos recibido el CD"
Else
  .Body =" No hemos recibido nada"
End If
'Enviamos el mail
.Send
...

Y elimina esto, porque no lo usarás:

'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(elAsunto) = 0 Then GoTo Salida
'Esta parte la modifique para que no solicite el MENSAJE, ya que es el mismo para todos los correos
'Me falta que se indique en el mensaje que llego, el reporte, el CD o ambos
elMsg = "Nos complace informarle que hemos recibido el reporte y el CD de su estudio realizado"
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(elMsg) = 0 Then GoTo Salida

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas