domingo, 6 de janeiro de 2013

Enviar email localmente com PHP + Apache + PHPMailer e Gmail no Windows


Muito se busca na internet sobre como enviar emails através de seu servidor web local, e muito se encontra a respeito, talvez nada completo, mas tem muito material a respeito de  emails através de sua instalação local do PHP e Apache.
Mais cedo estava lendo um comentário de um usuário do Sistema Básico servidor local e que chegassem corretamente em contas de email que utilizam servidores do Hotmail, Gmail, Yahoo, etc... isso me levou a montar esse simples tutorial ensinando a enviar emails através de suas aplicações utilizando PHP e Apache instalados localmente em conjunto com a classe PHPMailer e o melhor de tudo, envio autenticado.
A Primeira coisa é efetuar o download do PHPMailer para PHP 5 em formato ZIP
 arquivo baixado dentro do diretório raíz de seu servidor (DocumentRoot que você definiu no seu Apache), no meu caso é E:\sites.

Crie um arquivo php novo com o seguinte conteúdo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
 <body>
 <?php
 /*
Supondo que o arquivo esteja dentro do
diretório raíz e sub-diretório phpmailer/
*/
require "phpmailer/class.phpmailer.php";
 
// conteúdo da mensagem
$mensagem = "Testando o envio de email através de aplicações locais";
 
// Estrutura HTML da mensagem
$msg = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";
$msg .= "<html>";
$msg .= "<head></head>";
$msg .= "<body style=\"background-color:#fff;\" >";
$msg .= "<strong>MENSAGEM:</strong><br /><br />";
$msg .= $mensagem;
$msg .= "</body>";
$msg .= "</html>";
 
// Abaixo começaremos a utilizar o PHPMailer.
 
/*
Aqui criamos uma nova instância da classe como $mail.
Todas as características, funções e métodos da classe
poderão ser acessados através da variável (objeto) $mail.
*/
$mail = new PHPMailer(); //
 
// Define o método de envio
$mail->Mailer     = "smtp";
 
// Define que a mensagem poderá ter formatação HTML
$mail->IsHTML(true); //

// Define que a codificação do conteúdo da mensagem será utf-8
$mail->CharSet    = "utf-8";
 
// Define que os emails enviadas utilizarão SMTP Seguro tls
$mail->SMTPSecure = "tls";
 
// Define que o Host que enviará a mensagem é o Gmail
$mail->Host       = "smtp.gmail.com";
 
//Define a porta utilizada pelo Gmail para o envio autenticado
$mail->Port       = "587";                  
 
// Deine que a mensagem utiliza método de envio autenticado
$mail->SMTPAuth   = "true";
 
// Define o usuário do gmail autenticado responsável pelo envio
$mail->Username   = "um-username-seu-no-gmail";
 
// Define a senha deste usuário citado acima
$mail->Password   = "respectiva-senha-deste-username-acima";
 
// Defina o email e o nome que aparecerá como remetente no cabeçalho
$mail->From       = "o-username@gmail.com";
$mail->FromName   = "seu-nome-por-exemplo";
 
// Define o destinatário que receberá a mensagem
$mail->AddAddress("email-do-destinatário@provedor-de-email-do-destinatario");
 
/*
Define o email que receberá resposta desta
mensagem, quando o destinatário responder
*/
$mail->AddReplyTo("o-username@gmail.com", $mail->FromName);
 
// Assunto da mensagem
$mail->Subject    = "Assunto-da-mensagem";
 
// Toda a estrutura HTML e corpo da mensagem
$mail->Body       = $msg;
 
// Controle de erro ou sucesso no envio
if (!$mail->Send())
{
 
    echo "Erro de envio: " . $mail->ErrorInfo;
 
}
else{
 
    echo "Mensagem enviada com sucesso!";
 
}
 
?>
</body>
</html>


Salve este arquivo como email.php no seu diretório raíz, o mesmo que contem o diretório phpmailer/
Abra o arquivo php.ini, que no meu caso está dentro do diretório 
C:\php
Procure por:

;extension=php_openssl.dll
Retire o ';' do início da linha para descomentar e ativar a extensão php openssl, ficando assim:

extension=php_openssl.dll

Feito isso, agora levando em conta que salvou o arquivo email.php diretamente na raiz de seu servidor, digite na barra de endereço de seu navegador a seguinte URL:
Após acessar a URL acima, analise o resultado na tela.
Se deu alguma mensagem de erro, revise, se não adiantar a revisão, faça um comentário e tento ajudar.Se deu mensagem de sucesso, parabéns, você conseguiu.
Verifique a caixa de entrada da conta de email a qual você definiu em 
$mail->AddAddress, e veja se chegou alguma mensagem.
Espero que tenha gostado




quinta-feira, 3 de janeiro de 2013

Upload de arquivos com AJAX e PHP

Simples tutorial de upload de arquivos com AJAX e PHP
O conceito
- Criar um formulário HTML simples para upload de arquivos
- Definir o target para um iFrame invisível que está na página. (logo veremos sobre e porque disso)
- Chamar uma função JavaSript para exibir uma animação enquanto o PHP rola nos bastidores.
- Após o PHP terminar o upload, esconder a animação
Criando o arquivo HTML
O arquivo HTML que usaremos neste artigo é bem simples. Ele tem apenas um formulário  com um campo do tipo FILE e um botão SUBMIT. No entanto, não podemos esquecer de definirmos o parâmetro enctype. Na verdade, além do que mencionei, precisamos adicionar um pouco mais de código nesse HTML do que um simples formulário. Primeiro precisamos de um bloco onde nós vamos mostrar a animação que ilustrará o progresso do upload. Precisamos também de um outro bloco onde informamos ao visitante se o upload foi sucesso ou não. Além disso, precisamos adicionar um iFrame oculto para a página que é utilizada como target do  formulário. Também adicionaremos um evento 'onsubmit' no formulário.
Enfim, o 'body' de nosso arquivo HTML ficará assim:
pegue o arquivo loader.gif aqui
<body>
    <p id="upload_process">Loading...<br/><img src="loader.gif" /></p>
    <p id="result"></p>
    <form action="upload.php" method="post" enctype="multipart/form-data" target="upload_target" onsubmit="startUpload();" >
        File: <input name="myfile" type="file" />
        <input type="submit" name="submitBtn" value="Upload" />
    </form>
    <iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>
</body>
Por padrão, o conteúdo do bloco da animação de progresso do upload estará oculto. Precisaremos de uma função JavaScript que faz com que este bloco fique visível caso o botão submit for pressionado. É um código muito simples, que apenas alterará o parâmetro de visibilidade.
function startUpload(){
     document.getElementById('upload_process').style.visibility = 'visible';
    return true;
}
E tem mais. Precisaremos de uma outra função, onde à chamaremos ao final do processo de upload. A finalidade desta função será imprimir uma mensagem de resultado que dependendo do valor de um devido parâmetro, esconderá o bloco da animação ilustrativa de progresso do upload novamente.
function stopUpload(success){
     var result = '';
     if (success == 1){
        document.getElementById('result').innerHTML ='<span>O upload do arquivo foi executado com sucesso!<\/span><br/><br/>';
    }
    else{
        document.getElementById('result').innerHTML = '<span>Ocorreu um erro durante o upload do arquivo!<\/span><br/><br/>';
    }
     document.getElementById('upload_process').style.visibility = 'hidden';
    return true;
 }
Bom, antes de criarmos o código PHP, vamos criar um style CSS para caracterizar visualmente o bloco de progresso do upload. O estilo para usarmos no formulário é muito simples, mas o estilo do bloco de progresso e upload iremos definir o z-index e o parâmetro de visibilidade também.
#upload_process{
    z-index:100;
    position:absolute;
    visibility:hidden;
    text-align:center;
    width:400px;
    margin:0px;
    padding:0px;
    background-color:#fff;
    border:1px solid #ccc;
}
form{
    text-align:center;
    width:390px;
    margin:0px;
    padding:5px;
    background-color:#fff;
    border:1px solid #ccc;
}


Agora podemos focalizar no lado servidor e no responsável pela mágica do upload.
O código do lado servidor é escrito em PHP e é muito curto e simples. Primeiro precisamos definir
o caminho de destino do arquivo. Neste caso, vamos utilizar o diretório que já estamos trabalhando. 
Depois introduzimos uma variável que mostrará se houve um erro ou não durante o processo de upload
Em seguida, movemos o arquivo carregado no diretório tmp para o diretório que mencionei um pouco antes.
Continuando...
Definimos uma variável para lidar com o resultado do upload, ou seja,  se foi sucesso ou falha e ao final
do código inserimos um comando 'sleep()' para fazer a animação demorar um pouco mais no caso de uploads 
muito rápidos.
Enfim, o código PHP completo fica assim
<?php
$destination_path = getcwd().DIRECTORY_SEPARATOR;
$result = 0;
$target_path = $destination_path . basename( $_FILES['myfile']['name']);
if (@move_uploaded_file($_FILES['myfile']['tmp_name'], $target_path))
{
    $result = 1;
}
sleep(1);
?>
Para concluir vamos dar uma olhada naquele iFrame que falamos no início:
A saída do código PHP será exibido/executado dentro do iFrame. Como você se lembra, o iFrame não estará visível, no entanto, podemos chamar uma função JavaScript nele. Na verdade é exatamente esse o ponto em que podemos chamar a função JavaScriptdefinida no código HTML para esconder a animação de progresso e exibir o resultado de upload de arquivos na página principal.
Nós podemos fazê-lo com o seguinte código JavaScript:
<script language="javascript" type="text/javascript">
window.top.window.stopUpload(<?php echo $result; ?>);
</script>


É isso aí. Qualquer dúvida fala aí nos comentários.
Bons estudos.