Sie sind auf Seite 1von 5

Y UNA DE MAIL1

A través de este ejemplo veremos cómo podemos enviar un


mail a través de el cliente de correo electrónico que
tengamos configurado en nuestro sistema operativo.

Este ejemplo se divide en dos opciones: el envío de un solo


mail y el envío de varios mails a la vez

Con la “simple” podremos enviar un mail con un informe


(un informe porque suele ser lo más usual, pero no está
restringido sólo a informes) a un destinatario que tengamos
en pantalla, en un formulario.

La opción “compleja” consistirá en enviar el mail de forma “masiva” a determinados usuarios


que hayamos filtrado previamente a través de una consulta.

Como siempre, vamos primero a preparar nuestro “espacio de trabajo” para poder desarrollar
el ejemplo. Esta preparación es común para ambos sistemas, por lo que así “mataremos dos
pájaros de un tiro”.

PREPARATIVOS INICIALES

Vamos a realizar lo siguiente:

1.- Creamos una nueva tabla, y la guardamos como TDatos. En ella incluimos los siguientes
campos:
– [Id] → Autonumérico y clave principal
– [NomCont] → Texto (nos recogerá el nombre del contacto)
– [MailCont] → Texto (nos recogerá la dirección de correo electrónico del contacto)
– [Dep] → Texto (nos recogerá el departamento del contacto)

Llenamos esa tabla con algunos datos, teniendo en cuenta que, para el ejemplo, yo emplearé
dos departamentos: Producción y Comercial

2.- Creamos un informe en blanco. Lo guardamos como RDatos.

3.- Creamos un formulario sobre la tabla TDatos. Lo guardamos como FDatos.

ENVÍO DE UN SOLO MAIL

Voy a desarrollar el ejemplo con el máximo de opciones posibles. No haría falta “complicarlo”
tanto, pero así podréis ver casi todos los elementos que intervendrán en el código:

1.- Situamos nuestro formulario FDatos en vista diseño y, en la cabecera del mismo (la
agrandamos si no nos cabe) añadimos un cuadro de texto. Este cuadro de texto nos servirá
para introducir el asunto del mensaje. Sacamos las propiedades y nos vamos a la pestaña
Otras → Nombre, y le escribimos txtAsunto

2.- Copiamos y pegamos el cuadro de texto anterior. Este textBox nuevo nos servirá para
escribir un breve cuerpo de mensaje. Sacamos de nuevo sus propiedades y en la pestaña
Otras → Nombre le llamamos txtMsg

3.- Añadimos un cuadro combinado. Cuando nos salga el asistente lo configuramos de la


siguiente manera:

1 La BD de ejemplo os la podéis bajar aquí.

1
Visítame en http://siliconproject.com.ar/neckkito/
– Buscar los valores en una tabla o consulta
– Seleccionamos la tabla TDatos
– Seleccionamos los campos [NomCont] y [MailCont]
– Ordenamos por nombre de contacto
– Ocultamos la columna clave y redimensionamos para
poder ver la información
– Recordamos el valor para utilizarlo más adelante
– Como nombre del combo escribirmos: Con copia a:
– Finalizamos

Vamos a cambiar algunas cosas de ese combo. Para ello sacamos


sus propiedades y...

– Pestaña Otras → Nombre, y escribimos cboCC


– Pestaña Datos → Columna dependiente, y cambiamos el valor que tenemos ahí por un 3

¿Por qué un 3? Porque el combo nos “muestra” tres columnas (aunque no podamos ver la
primera), que son:
• Identificador (columna 1)
• Nombre (columna 2)
• Mail (columna 3)

Como nosotros necesitamos el valor correspondiente al mail, por ello debemos decirle que
realmente el valor que queremos almacenar temporalmente es el que devuelve la columna 3.

4.- Copiamos y pegamos ese combo. Este nuevo combo nos servirá para incluir una copia
oculta. Sacamos sus propiedades y nos vamos a pestaña Otras → Nombre, y le escribimos
cboCCO

5.- Ahora, en nuestro formulario FDatos en vista diseño, insertamos un botón de comando.

6.- Sacamos las propiedades de ese botón de comando y nos vamos a la pestaña Otras →
Nombre, y ahí le escribimos cmdMailReport

7.- Nos vamos a la pestaña Eventos → Al hacer click, y le generamos el siguiente código 2:

...
Private Sub cmdMailReport_Click()
On error goto sol_err
Dim vDest As String, vCC As String, vCCO As String
Dim miAsunto As String, miMsg As String
'Cogemos el valor del destinatario
vDest = Nz(Me.MailCont.Value, "")
'Cogemos el valor de la copia
vCC = Nz(Me.cboCC.Value, "")
'Cogemos el valor de la copia oculta
vCCO = Nz(Me.cboCCO.Value, "")
'Cogemos el valor del asunto
miAsunto = Nz(Me.txtAsunto.Value, "")
'Cogemos el valor del cuerpo del mensaje
miMsg = Nz(Me.txtMsg.Value, "")
'Si no existe mail para el destinatario lanza un mensaje de aviso y sale del proceso
2 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos
aparece un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le
decimos que queremos generar código.
Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben
tocarse. El código lo escribimos entre dichas líneas

2
Visítame en http://siliconproject.com.ar/neckkito/
If vDest = "" Then
MsgBox "No existe mail donde enviar el informe", vbCritical, "AVISO"
Exit Sub
End If
'Realizamos el envío
DoCmd.SendObject acSendReport, "RDatos", , vDest,
vCC, vCCO, miAsunto, miMsg, 0
sol_err:
Exit Sub
End Sub

Un par de puntualizaciones a las últimas líneas de código:

– Como el ejemplo está pensado para enviar un informe, y por ello hemos utilizado la
constante de VB acSendReport. Podríamos haber utilizado otra constante de VB para enviar un
formulario, una tabla, etc. Sólo hay que elegir la constante de VB adecuada.
– Entre “Rdatos” y vDest hay un espacio “en blanco” delimitado por dos comas. Eso nos
permite que Access nos solicite qué formato de archivo queremos enviar. Si quisiéramos un
formato preestablecido deberíamos indicárselo ahí, de manera que, si queremos enviar el
informe siempre en formato snapshot, deberíamos haber escrito:

DoCmd.SendObject acSendReport, "RDatos", acFormatSNP, vDest, vCC, vCCO, miAsunto,


miMsg, 0

 Truco: si nos situamos, con el cursor, sobre la palabra SendObject, y pulsamos F1, la ayuda
nos mostrará información adicional de cómo podemos enviar un objeto en diferentes formatos,
entre otras cosas.

- El último argumento, el cero (0), significa que no queremos editar el mensaje de mail. Si, por
lo que fuera, quisiéramos modificar el mensaje a través del cliente de correo electronico,
deberíamos cambiar ese cero por el valor -1, de manera que la línea de código quedaría escrita
de la siguiente manera:

DoCmd.SendObject acSendReport, "RDatos", , vDest, vCC, vCCO, miAsunto, miMsg, -1

– He puesto un control de errores muy básico para evitarnos “sustos”. No se explicará


nada sobre el control de errores porque no es el objetivo de este ejemplo.

ENVÍO DE VARIOS MAILS A LA VEZ

8.- Creamos una consulta que, para nuestro ejemplo, nos va a filtrar los destinatarios en
función de su departamento. Los enviaremos al departamento comercial 3. Guardamos esa
consulta como CComercial.

9.- Creamos un nuevo formulario un blanco, que guardaremos con el nombre de FEnvio.

10.- Con ese formulario en vista diseño añadimos un botón de comando. Sacamos sus
propiedades y nos vamos a la pestaña Otras → Nombre, y le escribimos cmdEnvioMasivo

11.- Nos vamos ahora la pestaña Eventos → Al hacer click, y le generamos el siguiente código 4:


Private Sub cmdEnvioMasivo_Click()
3 Doy por supuesto que sabéis cómo realizar este tipo de consulta de selección con filtros. De todas maneras, si
tenéis alguna duda, podéis visitar el siguiente enlace y buscar los artículos dedicados a las Consultas.
4 Si no sabemos cómo se hace eso revisad lo especificado en la nota 2 de este mismo documento

3
Visítame en http://siliconproject.com.ar/neckkito/
On Error GoTo sol_err
'El informe lo enviaremos en formato snapshot
Dim vMail As Variant
Dim vAsunto As Variant
Dim vMensaje As Variant
Dim rst As Recordset
'Creamos el recordset
Set rst = CurrentDb.OpenRecordset("CComercial")
'Si la consulta no devuelve ningun registro nos sale un
mesaje de advertencia
'y sale del proceso
If rst.RecordCount = 0 Then
MsgBox "No existen destinatarios en la consulta",
vbCritical, "AVISO"
GoTo Salida
End If
'Pedimos al usuario que especifique el asunto
vAsunto = InputBox("Indique el asunto", "ASUNTO")
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(vAsunto) = 0 Then GoTo Salida
'Pedimos al usuario que especifique el cuerpo del mensaje
vMensaje = InputBox("Indique el cuerpo del mensaje", "CUERPO")
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(vMensaje) = 0 Then GoTo Salida
'Si no se especifica nada los valores se convierten a cadena de texto vacía
If IsNull(vAsunto) Then vAsunto = ""
If IsNull(vMensaje) Then vMensaje = ""
'Nos movemos al primer registro
rst.MoveFirst
'Iniciamos el recorrido de registros
Do Until rst.EOF
'Cogemos el valor del destinatario
vMail = rst.Fields("MailCont").Value
'Si no existiera el mail pasamos al siguiente registro
If IsNull(vMail) Then GoTo Siguiente
'Lanzamos el mail
DoCmd.SendObject acSendReport, "RDatos", acFormatSNP, vMail, , , vAsunto, vMensaje,
0
Siguiente:
'Nos movemos al registro siguiente
rst.MoveNext
Loop
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
Exit Sub
sol_err:
Resume Salida:
End Sub

Pues... un par de comentarios sobre el código:

– En el envío masivo sería un “latazo” que nos pidiera cada vez que formato de archivo
queremos utilizar para convertir el informe. Es por ello por lo que lo mejor es establecer

4
Visítame en http://siliconproject.com.ar/neckkito/
un formato de archivo predeterminado.
– También sería muy incómodo que cada vez tuviéramos que
editar el mensaje en el cliente de correo. Por ello la opción
que hemos establecido es “no editar el mensaje”, a través
del cero (0) de la línea del Docmd.SendObject...
– He establecido un control de errores muy básico. No lo
complicaremos más porque no es el objetivo del ejemplo.
– Para usuarios de Access 2003 y anteriores, si el código
anterior nos da error en el recordset, tendremos que utilizar
un DAO recordset. Para ello:
● Deberemos registrar la biblioteca “Microsoft DAO 3.6 Objet
Library”5, si no la tenemos ya registrada
● Deberemos definir el recordset de la siguiente manera:
◦ Añadir la línea: Dim dbs As DAO.Database
◦ Añadir la línea: Set dbs = CurrentDb
Estas dos líneas las debemos añadir antes del “Set rst...”
◦ Modificar la línea Dim rst As Recordset por Dim rst As DAO.Recordset
◦ Modificar la línea Set rst = CurrentDb.OpenRecordset("CComercial") por
Set rst = dbs.OpenRecordset(“CComercial”)
◦ Cambiar el contenido de la etiqueta Salida por lo siguiente:
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
dbs.Close
Set rst = Nothing
Set dbs = Nothing
Exit Sub

Y un par de comentarios para usuarios de Outlook: este cliente de correo nos da el


“inconveniente” de que nos lanza un aviso cada vez que intenta enviarse un correo electrónico
desde una aplicación externa (en este caso, Access). Si queréis visitar la siguiente página se
explica un sistema (para determinadas versiones de Outlook) para evitar la aparición de este
warning. Como yo no utilizo este cliente de correo no he probado la solución ofrecida, por lo
que no sé si funciona bien. Si alguien quiere probarla lo tendrá que hacer “bajo su
responsabilidad”.

Y dicho esto, creo que el ejemplo está acabado.

Espero que os sea útil

¡Suerte!

5 Para ello, en el editor de VB, nos vamos a menú Herramientas → Referencias... Ahí deberemos buscar esa
referencia, marcar su check y aceptar

5
Visítame en http://siliconproject.com.ar/neckkito/

Das könnte Ihnen auch gefallen