Enviar un mail con el objeto CDONTS NewMail


Los correos con ASP se suelen enviar con el objeto CDONTS, que esta presente en la mayoría de los servidores Microsoft.

Este objeto es realmente sencillo aunque puede dar problemas si lo queremos utilizar de una forma relativamente profesional, debido a los problemas que tiene al introducir archivos dentro del cuerpo del mensaje. Como se verá a continuación.

para utilizarlo, primero se debe crear el objeto correo:
Set ObjetoCorreo = CreateObject("CDONTS.NewMail")

Luego se establecen sus propiedades y métodos, que vemos abajo, se envía (método Send) y después se debe destruir la variable de la siguiente forma:
Set ObjetoCorreo = Nothing

Propiedades:

FromEste campo se debe rellenar para que el mensaje sea enviado correctamente.
Se pone quién esta enviando el mensaje, por ejemplo:

ObjetoCorreo.From = "mcanam@mcanam.com"

Recordar la sintaxis para que aparezca el nombre en vez de la dirección de correo:

ObjetoCorreo.From = "Webmaster de McAnam<webmaster@mcanam.com>"
ToA quién se le envía el correo, ejemplos:

ObjetoCorreo.To = "Webmaster de McAnam<webmaster@mcanam.com>"
ó
ObjetoCorreo.To = "mcanam@mcanam.com"

También se puede enviar a varias personas separándolas por punto y coma:

ObjetoCorreo.To = "Webmaster de McAnam<webmaster@mcanam.com>;mcanam@mcanam.com"
CcPara enviar una copia a otra dirección de correo, ejemplos:

ObjetoCorreo.Cc = "Pedro García<pgarcia@mcanam.com>"
ó
ObjetoCorreo.Cc = "mcanam@mcanam.com;pgarcia@mcanam.com;Juan López<jlopez@mcanam.com>"
BccIgual que el anterior, pero las personas a las que envias el correo, no sabrán a quien mas le has enviado el mensaje, ejemplo:

ObjetoCorreo.Bcc = "mcanam@mcanam.com;pgarcia@mcanam.com;Juan López<jlopez@mcanam.com>"
SubjectEl asunto sobre el que trata el e-mail
ContentBaseEstablece una dirección como la predefinida como raíz para un texto en HTML. Por ejemplo si ponemos:
ObjetoCorreo.ContentBase = "http://www.mcanam.com/imagenes/"
y después en el cuerpo del body en HTML ponemos:
<img src="logo2.gif">

Mostraría la imagen:
ContentLocationHace la misma función que ContentBase.
Teóricamente si ponemos algo como esto:

ObjetoCorreo.ContentBase = "http://www.mcanam.com/"
ObjetoCorreo.ContentLocation = "imagenes/"

En el HTML del body seria como si estuviésemos en la carpeta 'imagenes' cogiendo de raíz mcanam.com; así para mostrar la imagen del logo tendríamos dos formas:

<img src="logo2.gif">
ó
<img src="/imagenes/logo2.gif">

También puede ir solo, entonces funcionaría como ContentBase, ejemplo:

ObjetoCorreo.ContentLocation = "http://www.mcanam.com/imagenes/"

NOTA: Esta propiedad no ha funcionado correctamente en nuestras pruebas con diferentes aplicaciones de correo
ImportanceLa importancia que tiene el correo mandado, tiene tres posibles valores:
0 Poco importante
1 Importancia normal (por defecto)
2 Urgente
MailFormatComo irá encriptado el correo. Tiene dos opciones:
0 El correo va encriptado en el formato mime
1 El correo va en texto plano
Para poder enviar correos con HTML esta propiedad debe tener como valor 0
BodyFormatEl formato del cuerpo del mensaje. También tiene dos opciones:
0 El texto va en formato HTML y se presenta como una página web (MailFormat debe estar a 0)
1 El correo va en texto plano
ValueSe utiliza para insertar una cabecera cualquiera. Su sintaxis es la siguiente:

ObjetoCorreo.Value("Reply-To") = "Webmaster McAnam<webmaster@mcanam.com>"

Esto añadiría la cabecera Reply-To(dirección a la que responder) y le pondría el valor Webmaster McAnam<webmaster@mcanam.com>

Para ver las posibles cabeceras a insertar, pincha aquí
BodyEl contenido del Body del e-mail.
Esto es lo que al final verá el usuario, si se ha establecido MailFormat y BodyFormat a 0, será HTML, sino texto plano.
VersionEs la única propiedad solo de lectura (no puede ser modificada).
Da la versión instalada en el servidor del objeto CDONTS NewMail


Métodos:
AttachFileAñade un archivo adjunto al correo. Su sintaxis es la siguiente:

ObjetoCorreo.AttachFile Dirección, Nombre_fichero, Encriptación

Dirección:
La dirección donde se encuentra el archivo a adjuntar, este archivo debe estar en el servidor, no en el ordenador cliente y la dirección se debe poner en términos absolutos, del tipo:

"D:\wwwroot\imagen.gif"

Si no sabemos la dirección absoluta, podemos usar el Server.MapPath para usar una ruta relativa, así si tuviéramos imagen.gif en la misma carpeta que la página donde ejecutamos este ASP, deberíamos poner:

Server.MapPath("imagen.gif")
Nombre_fichero:
(opcional), el nombre que queramos dar al fichero.
Para luego usarlo en el BODY como HTML (MailFormat y BodyFormat deben tener el valor 0 y la propiedad Encriptación de AttachFile 1), sería algo así:

<img src=Nombre_fichero>
Encriptación:
(opcional), el tipo de encriptación que queramos usar para enviar el archivo:
0: (Por defecto) Se adjuntará con el formato UUEncode
1: Se adjuntará en base 64

Si MailFormat tiene el valor 0 (Para poder enviar HTML), el método AttachFile enviará el archivo por defecto en base64 (1) en vez del formato UUEncode.
Este ejemplo inserta una imagen situada en el directorio raíz del servidor llamándola "imagen.gif" en el formato por defecto UUEncode:

ObjetoCorreo.AttachFile Server.MapPath("/imagen.gif"), "imagen.gif", 0

NOTA: Algunas aplicaciones de correo en los que se ha probado no reconocían los archivos cuando eran introducidos en el HTML, si bien todas recibían el archivo adjunto correctamente.
AttachURLAñade un archivo al correo, la diferencia con AttachFile es que con este se envía adjunto, mientras que con AttachURL se envía dentro de mensaje.

ObjetoCorreo.AttachURL Dirección, ContentLocation , ContentBase, Encriptación

Dirección y Encriptación igual que en AttachFile.

ContentLocation (al menos en nuestras pruebas) debe contener el nombre del archivo que queramos ponerle para que pueda ser llamado desde un HTML en el Body, puede contener subdirecciones antes, ejemplo: imagenes/imagen.gif.

ContentBase realiza la misma función que la propiedad del mismo nombre y su funcionamiento es igual.

El siguiente ejemplo inserta una imagen desde el directorio raíz del servidor llamada imagen.gif que para llamarla se debería poner: <img src=http://:www.nose.com/imagenes/imagen.gif> La encriptación se ha puesto en base64, ya que de lo contrario no la reconocería.

ObjetoCorreo.AttachURL Server.MapPath("/imagen.gif"), "imagenes/imagen.gif" , "http://:www.nose.com", 1

NOTA: Las pruebas realizadas con este método (al igual que con AttachFile) han dado numeroso problemas en diferentes aplicaciones de correo al intentar insertar este en un texto HTML del cuerpo del mensaje, esto se debe a que Microsoft se ha vuelto a saltar los estándares y solo unos pocos servidores han contemplado esta posibilidad
SetLocaleIDsSirve para decirle que 'páginas de códigos' se usarán, esto es un numero que le indicará el juego de caracteres que usará. Por lo general se usa el 1252 pero hay otros muchos (1250, 1251, 1253, 1254, 1255, 1256, 1257, 1258, 65000, 65001, 862, 936, 950, ...).
Una buena forma de saber que código elegir, es coger directamente el que usa el servidor. Para saberlo, pon:

Response.Write Session.CodePage

Ejemplo de SetLocaleIDs para establecer el código a 1252:

ObjetoCorreo.SetLocaleIDs 1257
SendEnvía el correo.

ObjetoCorreo.Send From, To, Subject, Body, Importance

Todos estos parámetros son opcionales y funcionan igual que las propiedades del mismo nombre.
Si se repite uno de estos parámetros en las propiedades, se impondrá el método Send excepto en el To, que cogerá los valores de la propiedad y los añadirá a los del método.

Hemos comprobado que en 'To' y 'Subject', si se repiten, no es que anule la propiedad, sino que simplemente pone antes los parámetros del Send (en el caso del To ya con los valores de la propiedad añadidos) y las aplicaciones de correo las cogen, pero no sería sorprendente encontrar algúna aplicación de correo que coja las últimas y por lo tanto aparecer diferente dependiendo la aplicación.
De todas formas es absurdo poner dos Subject, Body, etc por lo que recomendamos utilizar o uno u otro pero no los dos
Debido a los problemas con ContentLocation, ContentBase, AttachFile y AttachURL en lo que a insertar archivos en una página HTML se refiere, para hacer esto, recomendamos utilizar solo uno de los métodos ContentLocation y ContentBase, y a la hora de añadir un archivo con AttachFile o AttachURL, llamarlo como esté en vuestro servidor, así si la aplicación de correo no reconoce estas propiedades lo descargará del servidor (con el inconveniente de que el archivo se habrá descargado dos veces, primero en el mail y luego cuando se descarga).

Si se va hacer un gran uso del envío de mails desde ASP, recomendamos utilizar otros componentes como AspEmail o los componentes de ServerObjects



Código:
<%@ Language=VBScript %>
<%
    'Copyright © 2003 McAnam.com
    'Este ejemplo muestra la mejor forma de enviar páginas con archivos adjuntos,
    'se llama al archivo de la misma forma en que está en el servidor,
    'así las aplicaciones de correo que fallen con el método AttachURL (por lo general aplicaciones web)
    'cogerán el archivo de Internet, mientras los que lo reconozcan (por lo general programas tipo Outlook)
    'cogerán directamente la imagen y no necesitarán estar conectados a Internet.
    
    dim mensaje

    set mensaje = Server.CreateObject("CDONTS.NewMail")

    mensaje.AttachURL Server.MapPath("logo.gif"), "http://www.pagina_tuya.com/imaganes/logo.gif"

    mensaje.BodyFormat = 0
    mensaje.MailFormat = 0

    mensaje.Subject = "Bienvenido a mi página"

    mensaje.Body = "<html>" & _
                    "<head>" & _
                        "<title>Mail automatico de xxxxxx.com</title>" & _
                    "</head>" & _
                    "<body>" & _
                        "<img src='http://www.pagina_tuya.com/imaganes/logo.gif'><br>" & _
                        "Se ha dado de alta en xxxxxxx.com, bienvenido" & _
                    "</body>" & _
                   "</html>"

    mensaje.To = "usuario1@pagina.com,Pedro García<usuario2@pagina.com>"
    mensaje.From = "Tu nombre<tu_nick@tu_pagina.com>"

    mensaje.Send

    set mensaje = nothing

%>

Links relacionados:
Cabeceras para enviar correos por e-mail
Verificar la dirección de e-mail con ASP
Verificar la dirección de e-mail con JavaScript
Enviar un mail con PHP
Cómo crear un nuevo correo electrónico en Internet


Para cualquier duda, consulta, sugerencia, opinión, colaboración, etc; no dude en ponerse en contacto con nosotros

Copyright © 2002-2017 [McAnam]. Reservados todos los derechos.
www.mcanam.com