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:
Código :
package clases {
//Importamos clases a utilizar
import flash.net.Socket;
import flash.errors.*;
import flash.events.*;
import flash.utils.*;
}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
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 ]

Por cierto, ¿podrías por favor poner el swf resultante en el rar?
Así puedo pasarlo a portada
Por karac el 01 de Noviembre de 2006
Gracias
Por noctam el 01 de Noviembre de 2006
Odiar o Amar a AS3...he ahi el dilema...
noctam_blog :
OOP en Actionscript
Introducción a clases en Actionscript 3
Luego ya entenderás más.
Por Arnaldo el 10 de Noviembre de 2006
Por Siroko el 30 de Enero de 2007
554 <sirokosan@gmail.com>: Relay access denied
554 Error: no valid recipients
502 Error: command not implemented
502 Error: command not implemented
221 Error: I can break rules, too. Goodbye.
closeHandler: [Event type="close" bubbles=false cancelable=false eventPhase=2]
Por Siroko el 30 de Enero de 2007
Por Glome_art el 07 de Marzo de 2007
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 Mario el 09 de Marzo de 2007
**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
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 vgm77 el 22 de Marzo de 2007
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,
mi correo es vgm77@prodigy.net.mx
saludos
guillermo
Por Giovanny el 24 de Marzo de 2007
Por el 08 de Abril de 2007
Error #2044: SecurityErrorEvent no controlado: text=Error #2048: Violación de la seguridad Sandbox: http://usuarios.lycos.es/guillermomariscal/mailFlashSimple.swf no puede cargar datos desde http://mail.lycos.es:25.
at Timeline0_7af97a5fba784e44af6a7aeaf368f266/::frame1()
Error #2044: SecurityErrorEvent no controlado: text=Error #2048: Violación de la seguridad Sandbox: http://usuarios.lycos.es/guillermomariscal/mailFlashSimple.swf no puede cargar datos desde http://www.tripod.lycos.es:25.
at Timeline0_d7c75dcc5214df468685744c791eccbc/::frame1()
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 el 09 de Abril de 2007
agradeciendo de antemano la atencion que le den al presente post,
atte. guillermo m.
Por el 10 de Abril de 2007
agradezco de antemano la atencion que le den al post.
atte.
guillermo m.
Por libnitasg_1994 el 07 de Mayo de 2007
Por esutoraiki el 07 de Mayo de 2007
esutoraiki_blog :
Por francisco el 08 de Junio de 2007
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 sara el 18 de Julio de 2007
Por TasLab.com el 24 de Julio de 2007
Por crisp el 17 de Agosto de 2007
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 k-ri el 29 de Agosto de 2007
lo necesito urgente porfi porfi porfi.
xiauss.
Por Pablo Mercado el 17 de Septiembre de 2007
Por Pablo Mercado el 17 de Septiembre de 2007
<?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 i@n_@prendys el 13 de Noviembre de 2007
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 mtzpao_blog el 10 de Diciembre de 2007
null421 Cannot connect to SMTP server 10.24.31.1 (10.24.31.1:25), connect error 10061
closeHandler: [Event type="close" bubbles=false cancelable=false eventPhase=2]
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 rosa el 13 de Enero de 2008
Por abejareina el 21 de Febrero de 2008
Muchas gracias de antemano
Por demiantriebl el 19 de Marzo de 2008
Por edwar peña ( www.c el 29 de Mayo de 2008
quier ohacer unas cosas en mipagina pero no soy experto sera alguien tan amable de ayudarme
Por Adriana el 10 de Julio de 2008
Por Pablo el 21 de Octubre de 2008
¿Es eso posible?
Saludos!
Por byweb el 21 de Diciembre de 2008
Por elidexter el 31 de Marzo de 2009
Por Raimundo el 07 de Abril de 2009
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 el 07 de Abril de 2009
¿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 Pepe el 16 de Abril de 2009
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 Andres el 21 de Abril de 2009
Por Skaaven el 09 de Agosto de 2009
Un recurso que puede ser interesante es tener una lista de servidores smtp libres, que no requieran login, para hacer pruebas.
Yo encontré un listado aquí:
http://www.e-eeasy.com/SMTPServerList.aspx
Por Pablo Foglia el 30 de Agosto de 2009
Por Pablo el 30 de Agosto de 2009
Por (O.O) el 30 de Agosto de 2010
Por UserFlex el 16 de Septiembre de 2010
Como hay que configurar y donde poner el fichero crossdomain.xml, porque el problema es que con la nueva politica de cross domain me es imposible conectar el servidor de correo, por el error de violación de seguridad, en desarrollo todo funciona ok.
1) Servidor Web (donde esta la aplicación).
2) Servidor de correo.
El crossdomain.xml esta en el servidor Web, he probado con todas las opciones posibles, pero no es posible conectar Error violacion de seguridad mail.MiDominio.com:25
Si alguien me puede ayudar, esto me trae de cabeza
Gracias
Por UserFlex el 16 de Septiembre de 2010
<?xml version="1.0" encoding="UTF-8" ?>
<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
<allow-access-from domain="*" to-ports="*" secure="true" />
<allow-access-from domain="*" secure="false"/>
<allow-access-from domain="*.localhost" secure="false"/>
<allow-access-from domain="*.MiDominio.com" secure="false"/>
<allow-access-from domain="www.MiDominio.com" secure="false"/>
<allow-access-from domain="mail.MiDominio.com" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false" />
</cross-domain-policy>
La coña es que desde el entorno de desarrollo, me conecto sin problemas a los servidor y se envía sin problemas los correos conectando a mail.MiDomino.com puerto 25
Socorro !!!! Mil gracias.