#!/usr/bin/env php
<?php
/**
 * smtp_test.php — Teste de conexão SMTPS via linha de comando
 * Compatível com PHP 5.6+
 * Uso: php smtp_test.php
 */

// ============================================================
// CONFIGURAÇÕES FIXAS — ajuste conforme seu servidor
// ============================================================
define('SMTP_HOST',  'smtps.fiocruz.br');
define('SMTP_PORT',  587);               // 465 = SMTPS (SSL), 587 = STARTTLS
define('SMTP_USER',  'glpienspmailuser');
define('SMTP_PASS',  'uvWlHSYnbLUseVPjxX5nCw1nJIpOoC1X4x7lsiUVnYzhZqOmje23G1PIZQXzRBdx');
define('SMTP_FROM',  'wilians.pertence@fiocruz.br');   // simula o campo "e-mail" do formulário
define('SMTP_TO',    'glpi@ensp.fiocruz.br');
define('USE_STARTTLS', true);           // true se porta 587/STARTTLS, false se 465/SSL direto
// ============================================================

$from      = SMTP_FROM;
$from_name = strstr($from, '@', true);   // nome amigável: parte antes do @
$to        = SMTP_TO;

$now     = date('d/m/Y H:i:s');
$subject = "Conexao OK - $now";
$body    = "Este e um e-mail de teste automatizado.\r\n\r\n"
         . "Servidor : " . SMTP_HOST . "\r\n"
         . "Data/Hora: $now\r\n\r\n"
         . "Se voce recebeu esta mensagem, a conexao SMTPS esta funcionando corretamente.";

echo "\n--- Iniciando teste de envio ---\n";
echo "Host    : " . SMTP_HOST . ":" . SMTP_PORT . "\n";
echo "De      : $from\n";
echo "Para    : $to\n";
echo "Assunto : $subject\n\n";

// Envia e exibe o resultado
$result = send_smtp($to, $subject, $body, $from, $from_name);

if ($result === true) {
    echo "\n[OK] E-mail enviado com sucesso!\n";
} else {
    echo "\n[ERRO] Falha no envio: $result\n";
    exit(1);
}

// ============================================================
// Função principal de envio SMTP/SMTPS
// ============================================================
function send_smtp($to, $subject, $body, $from, $from_name) {

    $host       = SMTP_HOST;
    $port       = SMTP_PORT;
    $user       = SMTP_USER;
    $pass       = SMTP_PASS;
    $starttls   = USE_STARTTLS;
    $timeout    = 15;

    // Monta o prefixo de conexão
    $socket_host = $starttls ? "tcp://$host" : "ssl://$host";

    $ctx = stream_context_create(array(
        'ssl' => array(
            'verify_peer'       => false,   // mude para true em produção com CA válida
            'verify_peer_name'  => false,
            'allow_self_signed' => true,
        )
    ));

    echo "[1/7] Conectando em $socket_host:$port ...\n";
    $sock = @stream_socket_client(
        "$socket_host:$port",
        $errno, $errstr, $timeout,
        STREAM_CLIENT_CONNECT,
        $ctx
    );

    if (!$sock) {
        return "Nao foi possivel conectar ($errno: $errstr)";
    }
    stream_set_timeout($sock, $timeout);

    // Lê banner de boas-vindas
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 220)) { fclose($sock); return "Banner inesperado: $resp"; }

    // EHLO
    echo "[2/7] Enviando EHLO ...\n";
    smtp_send($sock, "EHLO " . gethostname());
    $resp = smtp_read($sock, true);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 250)) { fclose($sock); return "EHLO falhou: $resp"; }

    // STARTTLS (se necessário)
    if ($starttls) {
        echo "[2b] Iniciando STARTTLS ...\n";
        smtp_send($sock, "STARTTLS");
        $resp = smtp_read($sock);
        smtp_log('S', $resp);
        if (!smtp_ok($resp, 220)) { fclose($sock); return "STARTTLS falhou: $resp"; }
        stream_socket_enable_crypto($sock, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
        // Repete EHLO após TLS
        smtp_send($sock, "EHLO " . gethostname());
        $resp = smtp_read($sock, true);
        smtp_log('S', $resp);
        if (!smtp_ok($resp, 250)) { fclose($sock); return "EHLO pos-TLS falhou: $resp"; }
    }

    // AUTH LOGIN
    echo "[3/7] Autenticando ...\n";
    smtp_send($sock, "AUTH LOGIN");
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 334)) { fclose($sock); return "AUTH LOGIN falhou: $resp"; }

    smtp_send($sock, base64_encode($user));
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 334)) { fclose($sock); return "Usuario recusado: $resp"; }

    smtp_send($sock, base64_encode($pass));
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 235)) { fclose($sock); return "Senha/autenticacao recusada: $resp"; }

    // MAIL FROM
    echo "[4/7] MAIL FROM ...\n";
    smtp_send($sock, "MAIL FROM:<$from>");
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 250)) { fclose($sock); return "MAIL FROM recusado: $resp"; }

    // RCPT TO
    echo "[5/7] RCPT TO ...\n";
    smtp_send($sock, "RCPT TO:<$to>");
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 250)) { fclose($sock); return "RCPT TO recusado: $resp"; }

    // DATA
    echo "[6/7] Enviando mensagem ...\n";
    smtp_send($sock, "DATA");
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 354)) { fclose($sock); return "DATA recusado: $resp"; }

    $date    = date('r');                      // RFC 2822
    $mid     = '<' . time() . '.' . mt_rand() . '@' . $from . '>';
    $subj_b64 = '=?UTF-8?B?' . base64_encode($subject) . '?=';

    $headers  = "Date: $date\r\n";
    $headers .= "From: =?UTF-8?B?" . base64_encode($from_name) . "?= <$from>\r\n";
    $headers .= "Reply-To: <$from>\r\n";  // garante que respostas vão para o remetente do formulário
    $headers .= "To: <$to>\r\n";
    $headers .= "Subject: $subj_b64\r\n";
    $headers .= "Message-ID: $mid\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
    $headers .= "Content-Transfer-Encoding: base64\r\n";

    $body_b64 = chunk_split(base64_encode($body));

    fwrite($sock, $headers . "\r\n" . $body_b64 . "\r\n.\r\n");
    $resp = smtp_read($sock);
    smtp_log('S', $resp);
    if (!smtp_ok($resp, 250)) { fclose($sock); return "Mensagem rejeitada: $resp"; }

    // QUIT
    echo "[7/7] Encerrando conexao ...\n";
    smtp_send($sock, "QUIT");
    smtp_read($sock);
    fclose($sock);

    return true;
}

// ============================================================
// Helpers
// ============================================================
function smtp_send($sock, $cmd) {
    smtp_log('C', $cmd);
    fwrite($sock, $cmd . "\r\n");
}

/** Lê uma ou mais linhas de resposta SMTP (suporte a respostas multi-linha) */
function smtp_read($sock, $multi = false) {
    $resp = '';
    while (!feof($sock)) {
        $line = fgets($sock, 515);
        $resp .= $line;
        // Resposta multi-linha: "250-texto" continua; "250 texto" encerra
        if (!$multi || (strlen($line) >= 4 && $line[3] === ' ')) {
            break;
        }
    }
    return rtrim($resp);
}

function smtp_ok($resp, $expected) {
    return strpos($resp, (string)$expected) === 0;
}

function smtp_log($dir, $text) {
    $prefix = $dir === 'C' ? "\033[33m>>> " : "\033[36m<<< ";
    // Oculta a senha (linha após "334 UGFzc3dvcmQ")
    static $hide_next = false;
    if ($hide_next && $dir === 'C') {
        echo $prefix . "********" . "\033[0m\n";
        $hide_next = false;
        return;
    }
    if (strpos($text, '334') === 0 && strpos(base64_decode(trim(substr($text, 4))), 'assword') !== false) {
        $hide_next = true;
    }
    echo $prefix . $text . "\033[0m\n";
}
