sexta-feira, 29 de julho de 2011

Envio de e-mail com PHP por Socket

Para o envio de e-mail o PHP nos possibilita o uso da função mail, porém para utilizá-la é preciso efetuar algumas configurações no php.ini e esta função é bem limitada quanto a servidores SMTP que requerem autenticação com usuário e senha. Neste tutorial estarei ensinando como enviar e-mail por Socket utilizando a função fsockopen.

Abaixo tem a função com o exemplo de utilização, espero que vocês gostem e qualquer dúvida é só comentar.

<?php
function enviar_email($destinatario, $remetente, $assunto, $mensagem) {
    // dominio do servidor SMTP, para servidores HTTPS coloque o prefixo ssl://
    $servidor = "smtp.meuservidor.com";
    // usuario do servidor SMTP
    $usuario = "usuario";
    // senha do servidor SMTP
    $senha = "senha";
    // numero da porta do servidor SMTP
    $success = true;
        
    // abro uma conexao por socket com o servidor
    $socket = @fsockopen($servidor, 25, $errno, $errstr, 10);
    if ($socket) {
        $ln = "\r\n"; 
        // pego o texto de retorno do servidor e verifico o codigo da resposta se for 220 ok
        $response = fgets($socket, 256);
        if (!preg_match("/^220/", $response)) $success = false;

        // envio um comando HELO e verifico o codigo da resposta se for 250 ok
        fwrite($socket, "HELO $servidor".$ln);
        $response = fgets($socket, 256);
        if (!preg_match("/^250/", $response)) $success = false;
       
        // envio um comando AUTH LOGIN para iniciar a autenticacao
        fwrite($socket, "AUTH LOGIN".$ln);
        fgets($socket, 256);
        // envio o nome de usuario
        fwrite($socket, base64_encode($usuario).$ln);
        fgets($socket, 256);
        // envio senha do servidor
        fwrite($socket, base64_encode($senha).$ln);
        // verifico o codigo da resposta se for 235 a autenticacao ocorreu com sucesso
        $response = fgets($socket, 256);
        if (!preg_match("/^235/", $response)) $success = false;

        // envio um comando MAIL FROM e verifico o codigo da resposta se for 250 ok      
        fwrite($socket, "MAIL FROM:$remetente".$ln);
        $response = fgets($socket, 256); 
        if (!preg_match("/^250/", $response)) $success = false;
        
        // envio um comando RCPT TO e verifico o codigo da resposta se for 250 ok 
        fwrite($socket, "RCPT TO:$destinatario".$ln);
        $response = fgets($socket, 256);
        if (!preg_match("/^250/", $response)) $success = false;

        // envio um comando DATA e verifico o codigo da resposta se for 354 ok 
        fwrite($socket, "DATA".$ln);
        $response = fgets($socket, 256);
        if (!preg_match("/^354/", $response)) $success = false;
        
        // definicao dos cabecalhos da mensagem 
        $headers = "Message-Id: <".time().".".md5(microtime())."@".$_SERVER['SERVER_ADDR'].">".$ln;
        $headers .= "Date: ".date("r").$ln;
        $headers .= "X-Priority: 3".$ln;
        $headers .= "Content-Type: text/plain; charset=\"UTF-8\"".$ln;
        $headers .= "Subject: $assunto".$ln;
        $headers .= "To: $destinatario".$ln;       
        $headers .= "From: $remetente".$ln.$ln;
        $headers .= $mensagem.$ln.".".$ln;
        fwrite($socket, $headers);
        $response = fgets($socket, 256);
        if (!preg_match("/^250/", $response)) $success = false;
 
         // envio um comando QUIT e verifico o codigo da resposta se for 221 ok        
        fwrite($socket, "QUIT".$ln);
        $response = fgets($socket, 256);
        if (!preg_match("/^221/", $response)) $success = false;
        
        // fecho a conexao com o servidor
        fclose($socket);
        return $success;
    }
    else return false;
}

$result = enviar_email("destinatario@email.com", "remetente@email.com", "Meu Assunto", "Minha Mensagem");
if ($result) {
    echo "E-mail enviado com sucesso!";
}
else echo "Ocorreu um erro ao tentar enviar o e-mail!";
?>

Nenhum comentário: