Enviar email con Outlook y archivo adjunto


([N4] gontorre) #1

Buenos días

Quiero enviar un email desde mi programa a través de Outlook con un archivo adjunto. He probado con:

Ejecutar comando del sistema("mailto:gontorre@gmail.com?subject=Titulo del mensaje&body=Cuerpo del mensaje&attachment=+NOM_FICHERO")

Pero no hace nada

¿Hay alguna forma de hacerlo?

Gracias

Gonzalo Torre


([N1] vlinares) #2

Buenos días…
Lo he probado con Thunerbird y si que me levanta el correo, pero tengo que afinarlo, estuve el viernes por la tarde 5 minutos con esto.
Prueba con:
Ejecutar documento ("mailto:…)
Lo de enviar el adjunto no lo he probado, pero si funciona perfecto, me quita un montón de dolores de cabeza.

Un saludo.
Vicente


([N4] gontorre) #3

Lo he probado con Ejecutar documento y lo del adjunto no funciona. La instrucción que pongo es:

Set(NOM_FICHERO,"\cC:\TEMP\PRUEBA.TXT\c")
Ejecutar documento("mailto:direccion@correo.com?subject=Titulo del mensaje&body=Cuerpo del mensaje&attachment="+NOM_FICHERO)

El Outlook me muestra el mensaje “Argumento de la línea de comandos no válido. Compruebe el modificador que está usando”

Así que me temo que no se pueden adjuntar archivos con un mailto:

¿Alguna idea?


([N3] pacosatu) #4

Hola Gonzalo.

Usar el esquema mailto: a través del Shell del sistema operativo tiene la limitación de no poder adjuntar archivos y que el mensaje no puede exceder de un determinado tamaño (creo que son aprox. 2Kbytes), además de no poder aplicar formato al contenido del mensaje.
El comando Ejecutar documento ("mailto: … ") está pensado para correos sencillos.

La opción multiplataforma mailsend.exe (Open App vSendMail) está muy probada con Velneo, pero si necesitas gestionar el buzón de Outlook yo usaría toda la potencia de la Automatización OLE de Windows mediante CreateObject(“outlook.application”) y las macros de VBScript (Open App vxWinScript).

Saludos
Paco Satué


([N4] gontorre) #5

OK, gracias Paco.

Para algunas cosas tenía pensado utilizar vSendMail, pero hay ciertos mensajes que necesito que se guarden en la bandeja de Outlook, así que miraré la otra opción.

Un saludo

Gonzalo Torre


([N4] gontorre) #6

Buenos días,

Estoy intentando hacer un pequeño script para enviar un email al que le paso como parámetros la dirección de email, el asunto y la ruta al archivo adjunto. Como no tengo ni idea de JS estoy bastante perdido. El script es algo así:

function EnviarEmail (diremail, asunto, adjunto) {
objOutlook = CreateObject(“Outlook.Application”)
objMailItem = objOutl.CreateItem(0)
objMailItem.Display
objMailItem.Recipients.Add(diremail)
objMailItem.Subject = asunto
objMailItem.Attachments.Add(adjunto)
}

Desde un manejador de eventos quiero llamar a esa función y hago lo siguiente:

#include “4e79zgfw.vca/js/EnviarEmail.js”
asunto=theRoot.varToString(‘ASUNTO’)
email=theRoot.varToString(‘EMAIL’)
fichero=theRoot.varToString(‘NOM_FICHERO’)
EnviarEmail(email,asunto,fichero)

Al ejecutarlo me da el error:

Error en script: ReferenceError: Can’t find variable: CreateObject <anonymous>()@scegestion/VALORACIONES/ENVIAR_EMAIL_JS:3

Agradecería mucho algo de ayuda.

Un saludo

Gonzalo Torre


([N3] pacosatu) #7

Hola Gonzalo.

Lamentablemente JavaScript no accede a los objetos COM de Windows (es lo que tiene la multipletaforma), eso solo lo puede hacer JScript o VBScript (Función CreateObject).

No te queda más remedio que escribír eso mismo como un Script de VBScript y ejecutarlo desde Velneo.

Saludos
Paco Satué


([N4] carlitos) #8

HOla
vsendmail deja los correos en la bansdeja de elementos envíados si tienes el correo por IMAP…


([N4] gontorre) #9

Buenos días Paco,

Disculpa mi ignorancia, pero ¿como hago para ejecutar el VBScript desde Velneo?

Gracias y un saludo

Gonzalo Torre


([N3] pacosatu) #10

Hola Gonzalo.

Velneo propone usar la DLL vxScript.dll que aparece documentada en la Open App vxWinScript.
Esta DLL proporciona varias funciones útiles, entre ellas la función EVALUATE() que permite evaluar un código de Script y devolver el resultado fácilmente a Velneo.

También puedes ejecutar directamente el fichero Script .vbs mediante el comando “Ejecutar documento (<script.vbs>)”, pero solo funciona en Windows 7 y superior. En XP habría que comprobarlo. En este caso no puedes devolver un resultado desde el Script y tendrás que buscar medios alternativos, como usar un fichero temporal o una rama del registro de Velneo en Windows.

Saludos
Paco Satué


([N4] gontorre) #11

¡Por fin lo he resuelto!

Pongo como lo he hecho por si le sirve a alguien. Es un script sencillo que me abre un mensaje de Outlook con un destinatario, un asunto y un archivo adjunto.

Primero tengo un script JS EnviarEmail.js que crea el VBScript en la carpeta temporal del cliente:

var EnviarEmail = function (email,asunto,adjunto)
{
		importClass("VFile");

		// Preparar scriptVB a procesar
		var scriptVB = 'Set objOutl = CreateObject("Outlook.Application")' + '\r\n';
		scriptVB += 'Set objMailItem = objOutl.CreateItem(0)'  + '\r\n'
		scriptVB += 'objMailItem.Display'  + '\r\n'
		scriptVB += 'strEmailAddr = "'+ email +'"' + '\r\n';
		scriptVB += 'objMailItem.Recipients.Add strEmailAddr' + '\r\n';
		scriptVB += 'objMailItem.Subject = "'+asunto+'"' + '\r\n';		
		scriptVB += 'objMailItem.Attachments.Add "'+adjunto+'"' + '\r\n';		
		
		// Guardar fichero scrtipVB
		importClass("VTextFile");

		var ficheroScriptVB = new VTextFile(theRoot.clientCachePath() + "EnviaEmail.vbs");
		 
		// Se abre el fichero en modo escritura, crea si no existe o limpia si existe
		if ( ficheroScriptVB.open(VFile.OpenModeWriteOnly | VFile.OpenModeTruncate))
		{
			// Se guarda el script generado
			ficheroScriptVB.write(scriptVB);
				 
			// Se cierra el fichero
			ficheroScriptVB.close();
		};
};


En el formulario donde quiero enviar el email creo un manejador de evento JS con el código:

#include "4e79zgfw.vca/js/EnviarEmail.js"

asunto=theRoot.varToString('ASUNTO')
email=theRoot.varToString('EMAIL')
fichero=theRoot.varToString('NOM_FICHERO')
EnviarEmail(email,asunto,fichero)

Para enviar el email:

Interfaz: Ejecutar Manejador de eVento(CREA_SCRIPT_EMAIL_JS)
Ejecutar documento(sysCacheClientPath+“EnviaEmail.vbs”)

Gracias a todos por la ayuda

Gonzalo Torre


([N1] OscarBarea) #12

Muy buen aporte Gonzalo,
No se podría hacer lo mismo, pero que te abra el cliente de mail predeterminado del sistema. Sería interesante poder hacer los mismo, pero con cualquier cliente mail.
Gracias
Oscar B.


([N4] gontorre) #13

Buenos días Óscar

Hace tiempo hice en FoxPro un rutina de envío de emails que uilizaba CreateObject(“MAPI.Session”) y creo recordar que me habría el Outlook o el Outlook Express. Lo que no sé es si funcionará con otros clientes de correo.

Un saludo

Gonzalo Torre


([N4] Ramon Denuc) #14

Hola Gonzalo,

Muy buena rutina.

Podrías enviar esta rutina de envió de correo electrónico a Francisco J Vela para que le incluya en la App’s de Funciones de Velneo que esta disponible en su web.

http://ayudavelneo.com/app-funciones-para-velneo-v7/

Saludos,


([N1] vlinares) #15

Buenos días…
Muchas gracias por tu aportación.
Solo dos detalles.

EnviarEmail.js

Por una parte la segunda y tercera linea cuando estas escribiendo la variable scriptVB no terminan en “;”, ¿es correcto?

Y por otra parte recibo un mensaje de error, que paso en la imagen adjunta.
He revisado el Script y no veo diferencias con el que tu pasaste.

He de indicar que no le adjunto ningún fichero.

Un saludo
Vicente



([N1] vlinares) #16

Auto corrección.
El error lo da porque no adjuntaba ningún fichero y la variable “FICHERO” llegaba vacia.


([N4] gontorre) #17

Es cierto. Tal y como está hecha la rutina tienes que adjuntar un fichero. Lo hice muy rápido para resover un caso en el que siempre va un fichero adjunto. Se podría depurar el código para que tuviese en cuenta si el fichero viene vacío.

Un saludo

Gonzalo Torre


([N1] vlinares) #18

Buenas tardes…
Ya lo tengo depurado y estoy trabajando en mas cosas, CcList, etc. y añadiendo el cuerpo de correo.
Cuando lo tenga listo subo el EnviareMailExtendido.js (con tu permiso) solo tengo un problema para terminalo…
Le estoy pasando el cuerpo en texto plano, pero necesito ponerle saltos de linea para que se más legible por el usuario (Quería hacerlo en RichFormat, pero no tengo la “plantilla” (negrillas, saltos de linea Etc.) para crear el mensaje.
Como te decía si en el cuerpo del mensaje le paso los saltas de linea ‘\n\r’ el VBS, se vuelve loco y me dice que la cadena está por cerrar.
¿Cual es el carácter de salto de linea en una cada del VBS?.

Gracias por tu ayuda.
Un saludo
Vicente



([N4] gontorre) #19

La verdad es que no se cual es el caracter de salto de línea. Ten en cuenta que hasta ayer nunca había hecho nada en VBS. Lo hice todo a base de prueba y error.

De todas formas prueba a formar una cadena con etiquetas HTML toda seguida sin saltos de línea y utiliza objMailItem.HTMLBody en vez de objMailItem.Body

A lo mejor alguien que tenga más idea que yo (que no es raro) puede echar una mano.

Un saludo

Gonzalo Torre


([N1] vlinares) #20

Gracias lo intentaré así…

Ya he conseguido la codificación de RTF y lo que pretendo es pasarle en el cuerpo esto formato.
Pero ahora lo que no reconoce el la linea en que le digo que le paso un RTF.
Hasta ahora tengo esto…y falla en la linea en negrilla…

var EnviarEmailExtendido = function (email,cclista,asunto,cuerpo,adjunto)
{
importClass(“VFile”);

	// Preparar scriptVB a procesar
	var scriptVB = 'Set objOutl = CreateObject("Outlook.Application")' + '\r\n';
	scriptVB += 'Set objMailItem = objOutl.CreateItem(0)'  + '\r\n'
	scriptVB += 'objMailItem.Display'  + '\r\n'
	scriptVB += 'strEmailAddr = "'+ email +'"' + '\r\n';
	scriptVB += 'objMailItem.Recipients.Add strEmailAddr' + '\r\n';
	scriptVB += 'objMailItem.Subject = "'+asunto+'"' + '\r\n';
	if ( cclista!= "")
	{ scriptVB += 'objMailItem.Cc = "'+ cclista+'"' + '\r\n';
	}
	<strong>scriptVB += 'objMailItem.BodyFormat = "olFormatRichText"' + '\r\n';</strong>
	
	scriptVB += 'objMailItem.Body = "'+cuerpo+'"' + '\r\n';
	if ( adjunto != "")
	{
		scriptVB += 'objMailItem.Attachments.Add "'+adjunto+'"' + '\r\n';
	}

	// Guardar fichero scrtipVB
	importClass("VTextFile");

	var ficheroScriptVB = new VTextFile(theRoot.clientCachePath() + "EnviarEmailExtendido.vbs");
	 
	// Se abre el fichero en modo escritura, crea si no existe o limpia si existe
	if ( ficheroScriptVB.open(VFile.OpenModeWriteOnly | VFile.OpenModeTruncate))
	{
		// Se guarda el script generado
		ficheroScriptVB.write(scriptVB);
			 
		// Se cierra el fichero
		ficheroScriptVB.close();
	};

};

Si hay algún alma caritativa que controle lo del VBS le pago una cerveza.

:-))

Un saludo a todos
Vicente