Siguiendo con las cosas buenas que trae ActionScript 3 hoy veremos como enviar correos desde flash utilizando solamente ActionScript. Para ello usaremos la clase 'Socket', que se encuentra dentro del paquete 'flash.net'.
Primero creemos una clase a la que llamaremos SendMail, en primera instancia importamos las clases a utilizar:
De todas las que tenemos allí, la de mayor importancia es la "flash.net.Socket". Esta clase permite a ActionScript crear una conexión ó Socket para leer o escribir datos. Una vez que importamos las clases empezamos a codificar ya la clase en si, declaramos algunas variables a utilizar y el constructor de la clase
Código :
public class SendMail extends Socket {
private var response:String;
private var conectado:Boolean = false;
private var shost:String;
private var errorLog:String = "";
//Constructor de la clase
public function SendMail(host:String = null, port:int = 0) {
//Llamamos al constructor de la super clase
shost = host;
super(host, port);
configureListeners();
}
}
Dentro de las variables tenemos:
response: Donde almacenaremos la respuesta o información recibida por el servidor conectado: que nos permitirá saber si la conexión al Socket fue exitosa o no
shost: Aquí almacenaremos el nombre del host, ya veremos más adelantes para que la usaremos
Nuestra clase extiende de Socket; es por ello que en nuestro constructor llamamos al constructor de la súper clase, le pasamos el host, que bien puede ser, o la dirección IP o el nombre del servidor de correo y el puerto a conectarnos. Generalmente es el 25. Una vez hecho esto tenemos un método llamado configureListeners():
Código :
private function configureListeners():void {
addEventListener(Event.CONNECT, connectHandler);
addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
}
Asignamos lo manejadores de evento a utilizar. Esta vez solo usaremos el "Event.CONNECT", que se llama una vez que la conexión al host es establecida y el 'ProgressEvent.SOCKET_DATA', que es llamado cuando se recibe alguna respuesta del servidor.
Código :
private function connectHandler(event:Event):void {
//Si el servidor establece la conexión, cambiamos el valor de la variable
conectado = true;
}
private function socketDataHandler(event:ProgressEvent):void {
readResponse();
}
En la primera se coloca el valor 'true' a la variable conectado y en la segunda se llama a una función llamada readResponse(). Cada vez que el servidor genera o envía una respuesta a los datos enviados
Código :
private function readResponse():void {
var str:String = readUTFBytes(bytesAvailable);
response += str;
trace(response.toString());
}
Arriba vemos la función readResponse(), que imprime mediante el trace. Los datos de respuesta del servidor aparecen mediante la propiedad readUTFBytes, en forma de string. Luego, vamos a crear un getter que nos permitirá saber si el servidor se encuentra conectado o no
Código :
public function get IsConnect():Boolean{
return this.conectado;
}
Una vez finalizado esto, vamos a crear la función que se encargara de enviar el mail. Quizas han enviado correo mediante telnet alguna vez, los que no revisen cómo hacerlo. Es lo que usaremos, veamos la función:
Código :
public function sendRequest(sender:String = "nobody@nobody.com", reciver:String = "nobody@nobody.com", subject:String = null, msg:String = null):void {
response = "";
//Cuando establecimos la coneción al host, estribimos en el flujo del socket. la información
//para el envio del mail
try {
this.writeUTFBytes ("HELO "+shost+"\r\n");
this.writeUTFBytes ("MAIL FROM: <"+sender+">\r\n");
this.writeUTFBytes ("RCPT TO: <"+reciver+">\r\n");
this.writeUTFBytes ("DATA\r\n");
this.writeUTFBytes ("From : "+sender+"\r\n");
this.writeUTFBytes ("To : "+reciver+"\r\n");
this.writeUTFBytes ("Subject: "+subject+"\r\n");
this.writeUTFBytes ("Mime-Version: 1.0\r\n");
this.writeUTFBytes ("Content-Type: text/html; charset=UTF-8; format=flowed\r\n");
this.writeUTFBytes (msg+"\r\n");
this.writeUTFBytes (".\r\n");
}
catch(e:IOError) {
trace(e);
}
flush();
}
La función recibimos los siguientes datos
sender: El correo de la persona que envía
reciver: A quien va dirigido el mail
subject: Asunto del correo
msg: Cuerpo del mensaje en si
Luego el método writeUTFBytes se encarga de escribir datos en el flujo del socket. Los datos escritos utilizando este método no son transmitidos inmediatamente si no que se colocan en cola y son transmitidos una vez que se ejecuta el método flush(), que tenemos más abajo.
Esto es todo lo que necesitamos para enviar mails desde flash, es algo sencillo de utilizar. [ Descargar Ejemplo .FLA ]
Muy bueno el tutorial, ahora una pregunta, nececita un serveidor de SMTP verdad? es al que le tenemos que definir como host? Gracias Por:karac_blog
Sí. La dirección IP o el Nombre de Host SMTP es lo que debes pasarle al constructor, ademas del puerto que generalmente es el 25 Por:shogoki
... y no hay nada mas facilito?? este tutorial de AS3 me cuesta entenderlo bastante (de echo siempre que he visto un tutorial de clases me cuesta entenderlo XP).
Odiar o Amar a AS3...he ahi el dilema... Por:noctam_blog
noctam_blog :
(de echo siempre que he visto un tutorial de clases me cuesta entenderlo XP).
Tengo el mismo error 554 y no se como solucionarlo Quizás tenga que ver que cambiaron las configuraciones del servidor. Soy novata en esto de actionscript y estoy trabajando con un archivo creado por otra persona.
Gracias Por:Glome_art_blog
Hola, no tengo nada de experiencia en AS3 me podrían decir qué significa el dialogo de errores que me saca flash?
**Error** Scene=contacto, layer=Layer 2, frame=1:Line 3: The class or interface 'clases.SendMail' could not be loaded. var enviarMail:SendMail = new SendMail("192.60.128", 25);
**Error** Scene=contacto, layer=Layer 2, frame=1:Line 4: The class or interface 'Timer' could not be loaded. var intervalo:Timer = new Timer(1000, 0);
**Error** Scene=contacto, layer=Layer 2, frame=1:Line 6: The class or interface 'TimerEvent' could not be loaded. function servidorConectado(evento:TimerEvent):void{
Total ActionScript Errors: 3 Reported Errors: 3 Por:Mario_blog
Para los que tengan problemas usando la clase, deben tener en cuenta el modelo de seguridad de flash. La clase funciona perfectamente desde el entorno de prueba, pero una vez que es llevada a producción el sandbox evita que la comunicación con el servidor de correos sea efectiva, a menos que que se coloque un archivo Cross-domain en el servidor.
Para los que el servidor arroja el error 554, esto quiere decir que necesitan estar autentificados en el servidor para poder enviar mails.
@Mario_blog: asegúrate de haber bajado el .RAR con los archivos completos y que estén todos ubicados en el mismo directorio Por:shogoki
saludos foro, saludos sr.shogoki, estoy estudiando tu ejm. sobre envio de emails con as3 y esta muy interesante, sin embargo he tenido problemas en los servidores en los que lo subi (fortunecity y lycos),
en el primero no me acepta el archivo de la clase, y en el segundo si lo pude subir pero no baja el swf,(creo que es el servidor ya que anteriormente he bajado swf que tengo alojados, pero ahorita no he podido), tengo dudas sobre el nombre del servidor y los correos elecronicos que se tienen que meter en el swf, tengo una cuenta en hotmail y otra en prodigy.net.mx,
(este es el servidor que uso para outloock, supongo que ese lo puedo meter ahi no?, otra cosa, es exactamente adonde pongo el nombre del servidor y los correos elecronicos, creo que no los estoy poniendo en donde se debe,
cualquier idea, sugerencia, no manejo muy bien el as pero tengo un proyecto en puerta y me piden poner un formulario de correo, como en el servidor en que se va a colgar no hay php ni asp, pues esta es mi unica alternativa,
agradezco de antemano la atencion que le des a este post,
Sip el servidor de correos a utilizar es un servidor SMTP y como dije en mi ultimo post, para que la aplicación función asegúrate Cross-domain en el servidor de correos, además de verificar si el puerto 25 (puerto por default) este abierto si no asegúrate de pasar al constructor de la clase el puerto que usa el servidor para el envió de mail Por:shogoki
uifff esto e las clases me tiene loco!!! por ahora voy a seguir a la antigua.. Por:Giovanny_blog
saludos foro, saludos sr. shogoki, he estado haciendo pruebas con su flash para enviar mails desde el mismo archivo, y me da el siguiente error:
tengo varias dudas al respecto, haber si usted me puede orientar, en el primer error le puse como host "http://mail.lycos.es:25" y en el segundo error le cambie a "http://www.tripod.lycos.es:25", leyendo los post anteriores, subi a mi alojamiento el documento crossdomain.xml, con la siguiente direccion:
<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="http://www.tripod.lycos.es" /></cross-domain-policy>
donde "http://www.tripod.lycos.es", ya se lo cambie a "http://mail.lycos.es", y resulta lo mismo, ahora solo queda lo del puerto, si es 25 o es otro, pero no se cual maneje lycos, envie un correo a soporte tecnico preguntando pero no me han contestado, ¿sera ese el causante del error?, ¿alguien del foro sabra que puerto utiliza?, por lo que me dice el error sigue siendo el sandbox, que se esta violando la seguridad, entonces es cosa del doc. crossdomain.xml?, si es asi que es lo que le tengo que poner?,
espero no desesperarlo con mis preguntas pero he estado haciendo pruebas desde que deje el ultimo post y antes no me salia nada, ahora ya me salen errores (creo que estoy acercandome),
agradecere que me oriente, cualquier idea, consejo, rectificaciòn, de usted o de cualquier compañero del foro estare muy agradecido con ustedes, ya que solventando este problema he estado utilizando el mailto, aunque me han dicho que asi no lo quieren, espero contar con su ayuda en esta consulta.
atentamente guillermo m. Por:
saludos foro, saludos sr. shogoky, tengo otra duda, como hago para meter el archivo cross domain al servidor de correos en lycos.es, yo lo meti junto con todos los demas, la clase y el archivo flash en mi espacio, pero como meto el cross domain en el servidor de correos, donde esta o a quien le digo que lo suba o como lo subo?, en soporte tecnico de lycos para variar no me han contestado, disculpa las molestias, cuando tengas tiempecito, haber si me puedes orientar un poco,
agradeciendo de antemano la atencion que le den al presente post, atte. guillermo m. Por:
saludos foro, saludos sr.shogoky, me podrian facilitar los links en donde se encuentran sus ejemplos de correo?, para verlo funcionando, necesito ver como funciona, no mas no doy, me sigue saliendo el mismo error del sendbox y no se donde meter el croos domain,
agradezco de antemano la atencion que le den al post.
atte. guillermo m. Por:
como te quiero mucho cariño y me importas mucho Por:libnitasg_1994_blog
Hola a todos, acabo de notar que si uno presiona el titulo se dirige a si misma (Llevó ya mucho tiempo visitando cristalab y no me había notado eso, que poco observador). Ahora bien, eso si es útil? Por:esutoraiki_blog
esutoraiki_blog :
Hola a todos, acabo de notar que si uno presiona el titulo se dirige a si misma (Llevó ya mucho tiempo visitando cristalab y no me había notado eso, que poco observador). Ahora bien, eso si es útil?
Para los buscadores, sí, infinitamente. Por:Freddie
¿como me autentifico para poder mandar un mensaje con el servidor smtp.gmail.com? Desde aspx con c# lo hago pero con as3 no tengo ni idea. Me explico, si en aspx utilizo credential(user, pass); en as3 ¿como seria?. Gracias. Por:francisco_blog
necesito una explicación, más sencilla... Por:sara_blog
Buenas familia! después de varias pruebas no consigo que funcione, lo cuelgo en mi servidor y en el campo de "Servidor conectado" se queda en "Espere..." alguien sabe que es lo que pasa? he probado con el servidor de yahoo y el de gmail... un saludo y muchas gracias! Por:TasLab.com_blog
Entiendo perfectamente lo que dice francisco_blog.....
Mi servidor me pide autentificar con Nombre de usuario y contraseña del email...si no cómo podria conectarme???? es imposible hacerlo....imaginen el caos de poder enviar emails desde cualquier dirección sin necesidad de contraseña...
Alguien, o el que haya creado el tutorial que explique alguna solución...
Y tambien, si es posible adjuntar imagenes, ya qu yo tengo un portal de eventos donde la gente puede bajarse las ftos usando el getUrl....pero me interesa mucho esto del email porque asi la gente puede enviarse la fotografia a su email....es posible??
Saludos Por:crispyhead
Holas, saben , esto es lo que busco yo, si algun caballerito me puede ayudar porfi, lo que quiero saber en que parte coloco la dirección de recepción y si hay algo mas que tengo que modificar, ya tengo el hosting. lo necesito urgente porfi porfi porfi. xiauss. Por:k-rincit@
Hola. El correo llega, pero sólo dice el Asunto, no viene remitente ni el cuerpo del mensaje. Esto es teniendo los archivos locales, pero cuando los subo al servidor ni siquiera se conecta(nunca dice "OK"). Por:Pablo Mercado_blog
Hola shogoki. Como uso el Crossdomain? Yo lo pongo en la misma carpeta donde están mis "swf" y "html". Dice así:
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="http://www.darme.com.mx" /></cross-domain-policy>
Gracias por su ayuda. Por:Pablo Mercado_blog
a mi me sale todo bien si lo publico desde la pelicula .fla pero cuando solo abro el swf no se conecta... mi problema es creo lo del Cross-domain.. mi pregunta ...solo funcionara si lo pruebo ya todo sobre el servidor???
pues puse el Cross-domain.xml en la misma crapeta del .fla y el .swf y nada.
este es programa en xml
<? xml version="1.0"> <cross-domain-policy> <allow-access-from domain="www.midominio.com" /></allow> </cross>
estare mal o falta algo Por:i@n_@prendys_blog
Aparece "Ok", pero con los errores: null421 Cannot connect to SMTP server 10.24.31.1 (10.24.31.1:25), connect error 10061
Y al tratar de enviar: Error: Error #2002: Se intentó una operación en un socket no válido. Error: Error #2002: Se intentó una operación en un socket no válido. at flash.net::Socket/flush() at clases::SendMail/sendRequest() at enviodecorreo_fla::MainTimeline/alClicar()
¿qué y cómo debo corregir? Por:mtzpao_blog_blog
Me he bajado los archivos correspondientes. Y el de las clases al compilarlo me da un monton de errores. Tengo el adobe flash cs3. Que actionscript hay que usar para que funcionen todas las clases¿? El 3.0 no¿? Por:rosa_blog
Buenos días, estoy haciendo el envío de emails tal y como dijo el creador. Me falta incluir el crossdomains, pero no se la ubicación exacta, y lo que es más importante, cómo sabe el servidor que tiene que leer ese xml? es decir quién lo ejecuta? cómo se enlaza con la película flash?
Muchas gracias de antemano Por:abejareina_blog
como hago si cuando contrato el hosting el servicio de smtp tiene usuario y contraseña? como modifico el .as para q pueda meter esos datos??? Por:demiantriebl_blog
quier ohacer unas cosas en mipagina pero no soy experto sera alguien tan amable de ayudarme Por:edwar peña ( www.compum
Hola, no logro hacer que funcione. Si recibo el evento de conectado pero no tengo ninguna respuesta del servidor , que podria ser? Por:Adriana-blog
Hola, necesito hacer un .exe en lfash que envie un formulario de contacto desde el escritorio de la pc. Como si fuese una aplicacion de escritorio que envia un formulario de contacto.
¿Es eso posible?
Saludos! Por:Pablo-blog
No entiendo muy bien el tutorial, veamos en el codigo de SendMail.as, donde pone nobody@nobody.com, ¿que tenemos que poner nuestro correo? Por:byweb-blog
como seria para conectarlo gmail...probe pero no me conecta Por:elidexter-blog
Qué lío bárbaro se ha armado !
La única duda que tengo es...
¿En qué parte del código de Action Script tengo que poner la información del puerto SMTP correspondiente para poder hacer el envío?
¿Podrías darnos un ejemplo con mail.yahoo.com.ar?
(Aunque no funcione Yahoo, el tema es saber en dónde poner el nombre del servidor de correo saliente).
Mil gracias. El post está bueno, pero creo que es programación demasiado profunda. Quizá una ayudita para los novatos no estaría nada mal...
¿Recuerdas cuando comenzaste? jajaj
Un abrazo, Por:Raimundo-blog
Perdón por la insistencia.
¿En qué parte de la película Flash vam los códigos?
En el botón send?
Al comienzo en un keyframe?
En un script tipo preload?
Es necesario que guarden un orden?
Gracias Por:Raimundo-blog
NECESITO AYUDA URGENTE!
No consigo que me funcione el forn. Probé con los emails de toda mi familia pero dicen que no les llega.
Manden ayuda, rapido. mañana comienzo vacaciones y quiero dejarlo hecho.
GRaciassss Por:Pepe-blog
Buenas noches, tengo problemas enviando el correo, creo que es por que el servidor SMTP requiere validacion (es de gmail) smtp.gmail.com puerto 465. si pueden ayudarme les agradesco mucho. Por:Andres-blog
Muchas gracias por este tutorial, me está viniendo de perlas.
Un recurso que puede ser interesante es tener una lista de servidores smtp libres, que no requieran login, para hacer pruebas.
Leí un par de comentarios de otros, la clase esta perfecta, pero esta pensada para smtp que no requieren login, para smtp con login habria que agregar en la parte del try codigo extra para que proceda a autenticarse primero, mi tema particularmente es que el envio de mail echo de forma anonima llega vacio y cae en spam automaticamente, o sea no llega el from ni el re. Por:Pablo Foglia-blog
Bueno, el tuto esta muy bueno, pero sirve solo para jugar con sockets un rato desde la pc de desarrollo, cuando uno sube el archivo al servidor no funciona, y esto se debe a que la solicitud de datos fuera del dominio donde esta el swf esta bloqueada, lei por todos lados que con el archivo crossdomain.xml se solucionaba lo cual en primer instancia es cierto, pero seamos sinceros que proveedor de internet se va a tomar el trabajo de ponerlo en el puerto 833 (si mal no recuerdo) para que nosotros con nuestra aplicacion lo levantemos. por lo cual este tuto termina siendo una gran perdida de tiempo. Por:Pablo-blog