You are on page 1of 8

Y TRES DE MAIL1

En el primer ejemplo (Y Una de Mail) hemos visto cómo


enviar un objeto de Access a través del cliente de correo
que tenemos configurado por defecto en nuestro sistema.
En el segundo ejemplo (Y Dos de Mail) hemos visto cómo
enviar un correo (con adjunto y sin adjunto) a través de
Microsoft Outlook.

¿Qué pasa si queremos enviar un correo directamente


desde nuestro servidor de correo, y no tener que pasar por
el cliente de correo instalado en nuestro ordenador?

En este ejemplo vamos a ver cómo acceder directamente a nuestro servidor de correo de
Google (Gmail) o a través de Yahoo (Yahoo Mail).

Se puede extender el ejemplo a otros servidores de correo, pero en este caso nuestro
“problema” será conocer exactamente las características del servidor de correo; es decir,
deberemos conocer la configuración del protocolo smtp (dirección smtp, puertos, tipo de
seguridad, etc.). Y como cada “correo” es un mundo, no os quedará más remedio que
configurarlo con sus características y probar, y probar, y probar...

El método que vamos a utilizar se denomina CDO.

Para hacerlo lo más completo posible vamos a mostrar cómo enviar un simple correo, y
después añadiremos eso de “adjuntar archivos”. Finalmente, y para no perder la “costumbre”,
veremos cómo enviarlo de forma masiva.

 IMPORTANTE: para enviar correos de forma masiva debéis ir con cuidado con las
limitaciones que podría imponer vuestro servidor de correo. No nos gustaría, supongo, que un
envío masivo (a lo salvaje) nos catalogara nuestra cuenta como spam, ¿verdad? ;)

 IMPORTANTE: para poder utilizar los códigos necesitamos registrar la referencia


correspondiente. Para ello, con la BD abierta, abrimos el editor de VB (pulsamos ALT+F11) y
nos vamos a menú → Herramientas → Referencias... y buscamos la referencia “Microsoft CDO
for Windows 2000 Library”, marcamos su check y aceptamos.

Y para aprovechar lo hecho los preparativos iniciales serán los mismos que en supuesto “Y Una
de Mail”. Si ya lo teníamos hecho, pues a aprovecharlo, si no repito aquí todos los preparativos
para poder “entrar en materia”.

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

1 La BD de ejemplo os la podéis bajar aquí. Este ejemplo se ha actualizado a fecha 09/06/14

1
Visítame en http://siliconproject.com.ar/neckkito/
2.- Creamos un informe en blanco. Lo guardamos como RDatos.

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

4.- Copiamos FDatos una vez lo hayamos configurado, cosa


que podréis encontrar en el siguiente epígrafe “Envío de un
solo mail con adjunto”, en los puntos del 1 al 4, y
guardamos una copia como FDatosSimpleMail

ENVÍO DE UN SIMPLE MAIL

Supongamos que estamos revisando las fichas de unos contactos y nos


encontramos uno de ellos al que queremos enviarle un simple mail sin adjuntos. Es decir, un
mail para decirle “Hola, ¿qué tal?” (supongo que pilláis la idea, ¿verdad? ;) )

1.- Abrimos FDatosSimpleMail en vista diseño y añadimos un botón de comando, al que


llamamos cmdEnviaMail2.

2.- En las propiedades del botón de comando, nos vamos a la pestaña Eventos → Al hacer click,
y le generamos el siguiente código3:


Private Sub cmdMailReport_Click()
'Ejemplo para utilizar con Yahoo!!!!!!
On Error GoTo sol_err
'Definimos dos constantes, donde introduciremos la cuenta de correo, el password y el
smtp
Const miMail As String = "usuario@yahoo.es"
Const miPass As String = "contraseña"
Const miSmtp As String = "smtp.mail.yahoo.com"
'Definimos las variables
Dim elAsunto As String, elMsg As String
Dim mailA As String
'Inicializamos las variables
elAsunto = Nz(Me.txtAsunto.Value, "")
elMsg = Nz(Me.txtMsg.Value, "")
mailA = Nz(Me.MailCont.Value, "")
'Si no hay destinatario avisamos y salimos del proceso
If mailA = "" Then
MsgBox "¡Debe existir un destinatario!", vbCritical, "SIN DESTINATARIO"
Exit Sub
End If
'Configuramos el bloque CDO
Dim cdoConfig
Dim msgOne
Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = 465
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = miSmtp
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = miMail

2 Propiedades del botón → Pestaña Otras → Nombre


3 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/
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = miPass
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Update
End With
'Configuramos el mensaje
Set msgOne = CreateObject("CDO.Message")
Set msgOne.Configuration = cdoConfig
msgOne.To = mailA
msgOne.From = miMail
msgOne.Subject = elAsunto
msgOne.TextBody = elMsg
msgOne.Send
'Avisamos de que el envío ha ido bien
MsgBox "Mensaje enviado con éxito", vbInformation, "CORRECTO"
Salida:
Exit Sub
sol_err:
MsgBox Err.Number & ": " & Err.Description
Resume Salida
End Sub

Lo que debemos modificar en el código son las constantes <miMail> y <miPass>, donde
introduciremos los valores de nuestra cuenta.

¿Y si queremos utilizar una cuenta de Gmail? Pues lo único que debemos cambiar son las
constantes del código, escribiendo lo siguiente:


'Ejemplo para utilizar con GMail!!!!!!
On Error GoTo sol_err
'Definimos dos constantes, donde introduciremos la cuenta de correo, el password y el
smtp
Const miMail As String = "usurario@gmail.com"
Const miPass As String = "contraseña"
Const miSmtp As String = "smtp.googlemail.com"
'Definimos las variables
'...Y aquí el mismo código anterior...

Y eso es todo... ¿fácil, no?

ENVÍO DE UN SOLO MAIL CON ADJUNTO

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
Visítame en http://siliconproject.com.ar/neckkito/
3.- Añadimos un cuadro combinado. Cuando nos salga el asistente lo configuramos de la
siguiente manera:
– 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 4:
...
Private Sub cmdMailReport_Click()
'Ejemplo para utilizar con GMail!!!!!!
On Error GoTo sol_err
'Definimos dos constantes, donde introduciremos la cuenta de correo, el password y el
smtp
Const miMail As String = "usuario@gmail.com"
Const miPass As String = "contraseña"
Const miSmtp As String = "smtp.gmail.com"
'Definimos las variables
Dim elAsunto As String, elMsg As String
Dim mailA As String, mailCC As String, mailCCO As String
'Inicializamos las variables
elAsunto = Nz(Me.txtAsunto.Value, "")
elMsg = Nz(Me.txtMsg.Value, "")

4 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

4
Visítame en http://siliconproject.com.ar/neckkito/
mailA = Nz(Me.MailCont.Value, "")
mailCC = Nz(Me.cboCC.Value, "")
mailCCO = Nz(Me.cboCCO.Value, "")
'Si no hay destinatario avisamos y salimos del proceso
If mailA = "" Then
MsgBox "¡Debe existir un destinatario!", vbCritical,
"SIN DESTINATARIO"
Exit Sub
End If
'Exportamos el informe a la carpeta donde está la BD
en formato snapshot
Dim ruta As String, miInforme As String
ruta = Application.CurrentProject.Path & "\"
miInforme = ruta & "Informe.snp"
DoCmd.OutputTo acOutputReport, "RDatos", acFormatSNP, miInforme, False
'Configuramos el bloque CDO
Dim cdoConfig
Dim msgOne
Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = 465
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = miSmtp
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = miMail
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = miPass
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Update
End With
'Configuramos el mensaje
Set msgOne = CreateObject("CDO.Message")
Set msgOne.Configuration = cdoConfig
msgOne.To = mailA
msgOne.CC = mailCC
msgOne.BCC = mailCCO
msgOne.From = miMail
msgOne.Subject = elAsunto
msgOne.TextBody = elMsg
'Configuramos el adjunto
Dim miAdjunto As String
miAdjunto = "file://" & miInforme
If Not IsMissing(miInforme) Then
msgOne.AddAttachment (miAdjunto)
End If
msgOne.Send
'Avisamos de que el envío ha ido bien
MsgBox "Mensaje enviado con éxito", vbInformation, "CORRECTO"
'Eliminamos el informe de nuestra carpeta
Kill miInforme
Salida:
Exit Sub
sol_err:
MsgBox Err.Number & ": " & Err.Description
Resume Salida
End Sub

5
Visítame en http://siliconproject.com.ar/neckkito/
Como vemos, debemos modificar los valores de las constantes para indicar los datos de
nuestra cuenta.

Y si utilizamos el correo de Yahoo debemos cambiar las


constantes del anterior código por estas:


Private Sub cmdMailReport_Click()
'Ejemplo para utilizar con GMail!!!!!!
On Error GoTo sol_err
'Definimos dos constantes, donde introduciremos la cuenta de
correo, el password y el smtp
Const miMail As String = "usuario@yahoo.es"
Const miPass As String = "contraseña"
Const miSmtp As String = "smtp.mail.yahoo.com"
'Definimos las variables
'...Y aquí el resto de código...

En el ejemplo hemos exportado el informe en snapshot para hacerlo compatible con Access
2003. Si queremos utilizar un pdf (sólo para Access 2007 y superior) debemos instalarnos el
complemento de Microsoft (http://www.microsoft.com/downloads/es-es/details.aspx?
displaylang=es&FamilyID=4D951911-3E7E-4AE6-B059-A2E79ED87041).

En este caso las modificaciones en el código deberían ser las siguientes:


– Redefinir la variable miInforme, así: miInforme = ruta & "Informe.pdf"
– Redefinir la línea de exportación, así:
DoCmd.OutputTo acOutputReport, "RDatos", "PDF", miInforme, False

ENVÍO DE VARIOS MAILS A LA VEZ

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

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

3.- 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

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


Private Sub cmdEnvioMasivo_Click()
'Ejemplo para utilizar con GMail!!!!!!
On Error GoTo sol_err
'Definimos dos constantes, donde introduciremos la cuenta de correo, el password y el
smtp
Const miMail As String = "usuario@gmail.com"
Const miPass As String = "contraseña"
Const miSmtp As String = "smtp.googlemail.com"
'Definimos las variables
5 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.
6 Si no sabemos cómo se hace eso revisad lo especificado en la nota 2 de este mismo documento

6
Visítame en http://siliconproject.com.ar/neckkito/
Dim elAsunto As String, elMsg As String
Dim mailA As String
'Inicializamos las variables
'Pedimos al usuario que especifique el asunto
elAsunto = InputBox("Indique el asunto", "ASUNTO")
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(elAsunto) = 0 Then GoTo Salida
'Pedimos al usuario que especifique el cuerpo del mensaje
elMsg = InputBox("Indique el cuerpo del mensaje", "CUERPO")
'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 a la carpeta donde está la BD en formato snapshot
Dim ruta As String, miInforme As String
ruta = Application.CurrentProject.Path & "\"
miInforme = ruta & "Informe.snp"
DoCmd.OutputTo acOutputReport, "RDatos", acFormatSNP, miInforme, False
'Creamos el recordset sobre la consulta
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("CComercial")
'Nos movemos al primer registro
rst.MoveFirst
'Iniciamos el proceso
Do Until rst.EOF
'Cogemos el mail del destinatario
mailA = rst.Fields("MailCont").Value
'Configuramos el bloque CDO
Dim cdoConfig
Dim msgOne
Set cdoConfig = CreateObject("CDO.Configuration")
With cdoConfig.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = 465
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = miSmtp
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = miMail
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = miPass
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Update
End With
'Configuramos el mensaje
Set msgOne = CreateObject("CDO.Message")
Set msgOne.Configuration = cdoConfig
msgOne.To = mailA
msgOne.From = miMail
msgOne.Subject = elAsunto
msgOne.TextBody = elMsg
'Configuramos el adjunto
Dim miAdjunto As String
miAdjunto = "file://" & miInforme
If Not IsMissing(miInforme) Then
msgOne.AddAttachment (miAdjunto)
End If

7
Visítame en http://siliconproject.com.ar/neckkito/
msgOne.Send
'Nos movemos al siguiente registro
rst.MoveNext
Loop
'Avisamos de que el envío ha ido bien
MsgBox "Mensaje masivo enviado con éxito",
vbInformation, "CORRECTO"
'Eliminamos el informe de nuestra carpeta
Kill miInforme
Salida:
Exit Sub
sol_err:
MsgBox Err.Number & ": " & Err.Description
Resume Salida
End Sub

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

– 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” 7, 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

No hace falta que os diga que hay que cambiar los valores de las constantes por nuestros
datos para que la cosa funcione. Y para usuarios de Yahoo ya sabéis que tenéis que cambiar
también los datos de las constantes (ved los dos epígrafes anteriores).

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

Espero que os sea útil

¡Suerte!

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

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

You might also like