Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago de Oliveira Cruz

[TUTORIAL]Formulário de E-mail em AS2 + PHP + Anexos

Recommended Posts

Esse tutorial foi postado também em meu blog

http://berseck.wordpress.com

 

 

Bom galera sempre vejo as pessoas por ai com maior problemão para criar um e-mail com anexos no flash...

 

Então resolvi criar esse tutorial que vai ensinar como fazer para anexar diversos anexos ao mesmo tempo em seu e-mail.

 

Bom vamos lá

 

Vamos precisar criar alguns campos né?

 

Então criei os seguintes campos que estão na imagem:

Imagem Postada

 

Essa imagem é composta de:

1 DataGrid

3 campos de texto input Text

2 campos de texto dynamic text

5 botões

 

As instancias são

anexos é a instancia do DataGrid

nome é a variavel do campo de texto do nome

email é a variaveldo campo de texto de email

anexo é a variavel colocada no campo de texto anexo

mensagem é a variavel do campo de mensagem

status é a variavel do campo de texto onde mostrará o status do formulário

 

os botões serão:

enviar, excluir, limpar, procurar e anexar

Todos com esses nomes de instância

 

Monstado o layout acima de acordo com as instâncias

 

o código AS2 é:

//Importo as classes necessárias
import mx.controls.gridclasses.DataGridColumn;
import flash.net.FileReference;

//Uso codificação que leia os acentos
System.useCodepage = true;

//Configurações do Datagrid de anexos
anexos._x = 318;
anexos._y = 21;
anexos.setSize(210, 83);
anexos.multipleSelection = true;

//Style da Datagrid
anexos.setStyle("color", 0x696969);
anexos.setStyle("themeColor", "haloBlue")
anexos.setStyle("fontSize",12);
anexos.setStyle("fontFamily" , "Verdana");


//Index
anexar.tabEnabled = false;
procurar.tabEnabled = false;
enviar.tabEnabled = false;
limpar.tabEnabled = false;

// Declara os campos de texto como vazios;
nome = "";
email = "";
mensagem = "";
status = "";
anexo = "";
var a:Array = new Array();
var a2:Array = new Array();
var count:Number = 0;
var inic:Number;
var t:Number = 0;

//Grava o item selecionado da datagrid
dgL = new Object();
dgL.cellPress = function(evt_obj:Object){
    inic = evt_obj.itemIndex;
}
anexos.addEventListener("cellPress", dgL);

var obj_e:LoadVars = new LoadVars();
var obj_b:LoadVars = new LoadVars();
//botão que exclui da datagrid o item selecionado
excluir.onPress = function(){
    obj_e.nome = a[inic];
    obj_e.sendAndLoad("excluir.php", obj_b, "POST");
    obj_b.onLoad = itemRemoved;
}
function itemRemoved(){
    if(obj_b.ok == 1){
        for(var i = 0; i < a.length; i++){
            if(a[inic] != a[i]){
            a[t] = a[i];
                t++;
            }
        }
        anexos.removeItemAt(inic);
        status = "anexo removido";
    }else{
        status = "anexo não existe";
    }
}

// Cria as variaveis que carregam os dados para o envio
var obj_s = new LoadVars();
var obj_l = new LoadVars();


enviar.onPress = function(){
    if (nome.text == "") {
        status = "O nome esta vazio";
        selection.setFocus("nome");
    } else if (email.text == "") {
        status = "O e-mail está vazio";
        Selection.setFocus("email");
    } else if (email.indexOf("@") == -1 || email.indexOf(".") == -1){
        status = "O e-mail inválido";
        Selection.setFocus("email");
    } else if (mensagem.text == "") {
        status = "Faltou a mensagem";
        Selection.setFocus("mensagem");
    } else {
        obj_s.nome = nome;
        obj_s.email = email;
        obj_s.mensagem = mensagem;
        obj_s.anexo = a;
        obj_s.num = count;
        obj_s.sendAndLoad("mail.php",obj_l,"POST"); //Envio as variáveis para o php
        obj_l.onLoad = sentMail;
    }
}

function sentMail(){
    if(obj_l.ok == 1){
        nome = "";
        email = "";
        mensagem = "";
        anexo = "";
        a = [];
        anexados.text = "";
        count = 0;
        anexos.removeAll();
        status = "mensagem enviada";
    }else {
        status = "erro ao enviar";
    }
}
//Botão que limpa o conteudo dos campos de texto
limpar.onPress = function(){
    nome = "";
    email = "";
    mensagem = "";
    status = "";
    anexo = "";
    a = [];
    anexados.text = "";
    count = 0;
}

//Upload dos arquivos
//criando a instancia da classe FileReference, a nova classe responsável pelo Upload...
var frUpload:FileReference = new FileReference();
//Declarando variaveis a serem utilizadas
var objUpload:Object = new Object();
var arquivosPermitidos:Array = new Array();
//Função de Upload
function initUpload(Void):Void {
    //adicionando a lista de extensões permitidas para o Seleção...
    //só imagens .jpg...
    arquivosPermitidos[0] = {description:"Imagens (*.jpg)", extension:"*.jpg; *.jpeg"};
    //só imagens .gif...
    arquivosPermitidos[1] = {description:"Imagens (*.gif)", extension:"*.giff; *.gif"};
    //só arquivos .doc...
    arquivosPermitidos[2] = {description:"Documentos (*.doc)", extension:"*.docx; *.doc"};
    //só arquivos .pdf
    arquivosPermitidos[3] = {description:"Documentos (*.pdf)", extension:"*.pdf"};
    //ação de escolha de um arquivo na caixa de browse...
    objUpload.onSelect = function(f:FileReference):Void {
        anexo = f.name;
        a[count] = f.name
        count++;
    }
    frUpload.addListener(objUpload);
    
    anexar.onPress = function(Void):Void {
        frUpload.upload("upload.php");
        status = "carregando";
    }
    
    procurar.onRelease = function(Void):Void {
        frUpload.browse(arquivosPermitidos);
    }
    
    objUpload.onComplete = function(f:FileReference):Void {
        status = "arquivo anexado";
        var dados:Object = {Anexos:anexo};
        anexos.addItem(dados);
    }
}
//
//iniciando nosso projeto...
initUpload();

 

Bom agora eu preciso criar um código em php para excluir e outro para upload

Código php do upload.php

 

//diretório destino das imagens dentro da pasta da aplicação...
	//deve ter permissão para escrita chmod(777)...
	$dir = "./imagens/";
	//recebendo o arquivo multipart vindo do flash...
	$file = $_FILES["Filedata"];
	//finalizando o upload e criando apartir do arquivo temp, multipart, um novo arquivo
	// em nossa pasta de destino. O echo serve para dizer ao flash se deu certo ou não...
	echo move_uploaded_file($file["tmp_name"], $dir . "/" . $file["name"]);
	?>

 

excluir.php

 

<?php
if(isset($_POST['nome'])){
    $excluir = $_POST['nome'];
    $dir = "./imagens/";
    //Excluo o arquivo
    if(unlink($dir . "/" . $excluir)){
        echo "&ok=1&";
    }else{
        echo "&ok=2&";
    }
} else {
    echo "valor inexistente";
}?>

 

Agora onde fica o segredo da multiplicação dos anexos rs :P/>

mail.php

 

<?php
if(isset($_POST['nome']) && isset($_POST['anexo']) && isset($_POST['email'])){
//Recebo as variáveis do flash
$nome = $_POST['nome'];
$num = $_POST['num'];
$file = $_POST['anexo'];
$from = $_POST['email'];
$email_from = $from;
$email_subject = "Mail from website";
$email_txt = $_POST['mensagem'];

//Coloque seu e-mail aqui
//Put your mail here
$email_to = "mail@mail.com";

$headers = "From: ".$email_from; 

$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

$headers .= "\nMIME-Version: 1.0\n" . 
            "Content-Type: multipart/mixed;\n" . 
            " boundary=\"{$mime_boundary}\"";  
//Texto do e-mail
$email_message =     "Mensagem: $email_txt <br>" . "\n\n" . "--{$mime_boundary}\n" . "Content-Type:text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . "Mensagem: $email_txt\n\n" . "\n\n";  

$email_message .=     "<br><br>" . "Nome: $nome" . "\n\n" . "--{$mime_boundary}\n" . "Content-Type:text/html; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n";

if($file != ""){
// Anexo os arquivos
// Attach itens to mail
$names = split(',',$file); 
foreach($names as $name) {
    $anexo = "./imagens/" . $name;
    
    /* 
    * Use fopen if your server dont accept file
    * Use fopen se seu servidor não aceita file
    */
    //$fileatt = $anexo;
    //$fileatt_type = "application/octet-stream";
    //$fileatt_name = $name;
    //$file = fopen($fileatt,'rb'); 
    //$data = chunk_split(base64_encode(fread($file,filesize($fileatt)))); 
    //fclose($file); 
    
    /*
    * Use file if your server dont accept fopen
    * Use file se seu servidor não aceita fopen
    */
    $data = chunk_split(base64_encode(join('',file($anexo)))); 
    
    $email_message .= "--{$mime_boundary}\n" . "Content-Type: {$fileatt_type};\n" . " name=\"{$fileatt_name}\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
    echo unlink("./imagens/" . $anexo);
}
}
   
$email_message .=  "--{$mime_boundary}--\n";


$ok = @mail($email_to, $email_subject, $email_message, $headers);
if(ok){
    echo "&ok=1&";
}else {
    echo "&ok=2&";
}
} else {
echo "email invalido";
}
?>

 

 

E é só :D/>

 

Espero que gostem ;)/>

 

Para baixar o código clique aqui

 

Devido aos usuarios terem muitos problemas com fopen procurei um outro metodo de resolver o problema e atualizei o código

Código atualizado, para usar file ou fopen para anexar os arquivos!!

 

Abraços e até a proxima

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, vi seu tutorial e é de fato, muito bom e de extrema importância para quem gosta de desenvolver seus trabalhos em Flash. Baixei os arquivos e depois de estudá-los no tutorial, enviei para meu servidor web, fiz a devida alteração do endereço de email no php, e dei permissão 777 na pasta `imagens`. Muito bem, a mensagem é enviada normalmente, com as informações de todos os campos do formulário, e com uma imagem de 800 kb anexada, mas quando abro a mensagem no meu servidor de e-mails e clico no anexo recebo uma mensagem de que o anexo exedeu o tamanho permitido pelo servidor. Porém quando envio uma imagem de 20 kb isso não aconteçe, e recebo o arquivo anexado normalmente. O grande problema é que, se nào for possível anexar imagens/arquivos maiores, este formulário `perde a razão de ser`, porque qualquer foto que é feita hoje com uma máquina comum pesa algo em torno de 2,5Mb. Gostaria que, se for possível, você analizasse este problema para sabermos porque isto está ocorrendo.

Att. Luis Carlos

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não está no meu formulário e sim no seu servidor :)/>

Reconfigure o mesmo ;)/>

 

Meu servidor de e-mails envia e recebe até 120mb em 1 e-mail... e eu testei e ele realmente envia 120mb em um e-mail com fotos... videos... tudo q eu inventar de enviar no e-mail e colocar para o código aceitar... ele enviar :)/>

 

Ou seja é a configuração do seu e-mail e não meu formulário.

Veja qual a capacidade maxima de envio de anexos no seu servidor...

 

Isso vai explicar seus problemas.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.