JSON e e-mail

O JSON é a linguagem universal da web — a comunicação entre front-end e back-end depende dele, a transferência de dados por API o utiliza e até mesmo os arquivos de configuração são escritos nele. O e-mail é um recurso indispensável para qualquer aplicativo web — verificação de cadastro, redefinição de senha e notificações. Esta aula aborda ambos os temas.

1. Noções básicas sobre JSON

PHP
<?php
// PHP array/object → JSON string
$data = [
    'name' => 'John',
    'age'  => 25,
    'skills' => ['PHP', 'MySQL', 'JavaScript'],
    'isActive' => true,
    'score' => null,
];

$json = json_encode($data);
echo $json;
// {"name":"John","age":25,"skills":["PHP","MySQL","JavaScript"],"isActive":true,"score":null}
?>

(1) Opções comuns do json_encode

PHP
<?php
$data = ['name' => 'John', 'age' => 25, 'score' => null];

// Pretty print (human-readable)
echo json_encode($data, JSON_PRETTY_PRINT);
/*
{
    "name": "John",
    "age": 25,
    "score": null
}
*/

// Don't escape Unicode (preserves non-ASCII characters)
echo json_encode($data, JSON_UNESCAPED_UNICODE);
// {"name":"John","age":25,"score":null}

// Combine options
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

// Handle null (PHP 8.3+)
echo json_encode($data, JSON_UNESCAPED_UNICODE, JSON_INVALID_UTF8_IGNORE);
?>
Opção Efeito
JSON_PRETTY_PRINT Formatação com recuo
JSON_UNESCAPED_UNICODE Não converter caracteres não ASCII para \uXXXX
JSON_UNESCAPED_SLASHES Não fuja de / para \/
JSON_NUMERIC_CHECK Converter cadeias numéricas em números
JSON_FORCE_OBJECT Saída {} para matrizes vazias

2. json_decode — Análise de JSON

PHP
<?php
$json = '{"name":"John","age":25,"skills":["PHP","MySQL"]}';

// Default: returns an object
$obj = json_decode($json);
echo $obj->name;  // John
echo $obj->skills[0];  // PHP

// Second parameter true → returns an associative array
$arr = json_decode($json, true);
echo $arr['name'];  // John

// Error handling
$badJson = '{name: John}';  // Missing double quotes
$result = json_decode($badJson);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON parse error: " . json_last_error_msg();
    // JSON parse error: Syntax error
}

// PHP 7.3+ cleaner syntax
$result = json_decode($badJson);
echo json_last_error_msg();
?>

▶ Exemplo: Como ler e gravar arquivos JSON

PHP
<?php
// === Writing a JSON File ===
$config = [
    'app_name' => 'MyBlog',
    'version'  => '1.2.0',
    'database' => [
        'host' => 'localhost',
        'name' => 'myblog',
    ],
    'features' => ['blog', 'comments', 'search'],
];

$json = json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
file_put_contents('config.json', $json, LOCK_EX);
echo "Config file written ✅";

// === Reading a JSON File ===
$json = file_get_contents('config.json');
$config = json_decode($json, true);

echo "App name: {$config['app_name']}<br>";
echo "Database host: {$config['database']['host']}<br>";
echo "Features: " . implode(', ', $config['features']) . "<br>";
?>
▶ Experimente

▶ Exemplo: Simulação da API REST

PHP
<?php
// api.php — simple JSON API
header('Content-Type: application/json; charset=utf-8');

$method = $_SERVER['REQUEST_METHOD'];
$path = $_GET['path'] ?? '';

$users = [
    ['id' => 1, 'name' => 'John', 'email' => 'j@j.com'],
    ['id' => 2, 'name' => 'Jane', 'email' => 'ja@ja.com'],
];

if ($method === 'GET' && $path === 'users') {
    echo json_encode(['status' => 'ok', 'data' => $users], JSON_UNESCAPED_UNICODE);
} elseif ($method === 'GET' && preg_match('/users\/(\d+)/', $path, $m)) {
    $id = (int)$m[1];
    $user = $users[$id - 1] ?? null;
    if ($user) {
        echo json_encode(['status' => 'ok', 'data' => $user], JSON_UNESCAPED_UNICODE);
    } else {
        http_response_code(404);
        echo json_encode(['status' => 'error', 'message' => 'User not found']);
    }
} elseif ($method === 'POST' && $path === 'users') {
    $input = json_decode(file_get_contents('php://input'), true);
    // In a real app this would write to the database
    echo json_encode(['status' => 'ok', 'message' => 'User created']);
} else {
    http_response_code(404);
    echo json_encode(['status' => 'error', 'message' => 'Unknown endpoint']);
}
?>
▶ Experimente

3. Envio de e-mails

(1) Noções básicas sobre a função mail()

PHP
<?php
$to = "user@example.com";
$subject = "=?UTF-8?B?" . base64_encode("Password Reset Notification") . "?="; // Encoded subject
$message = "Hello, please click the link below to reset your password:\n\n";
$message .= "https://myblog.com/reset?token=abc123";
$headers = "From: noreply@myblog.com\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";

if (mail($to, $subject, $message, $headers)) {
    echo "Email sent ✅";
} else {
    echo "Email failed ❌";
}
?>
💡 Dica: mail() requer que o servidor tenha o sendmail/Postfix configurado. O XAMPP não inclui um por padrão — para testar a funcionalidade de e-mail, é melhor usar o SMTP (próxima seção).

▶ Exemplo: E-mail de verificação em HTML

PHP
<?php
function sendVerificationEmail(string $to, string $token): bool {
    $subject = "=?UTF-8?B?" . base64_encode("Please verify your email") . "?=";
    
    // HTML email
    $message = "<html><body>";
    $message .= "<h2>Welcome to MyBlog!</h2>";
    $message .= "<p>Please click the link below to verify your email:</p>";
    $message .= "<a href='https://myblog.com/verify?token={$token}'>Verify Email</a>";
    $message .= "<p>If the link doesn't work, copy and paste this address:</p>";
    $message .= "<p>https://myblog.com/verify?token={$token}</p>";
    $message .= "</body></html>";
    
    $headers = "From: noreply@myblog.com\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    
    return mail($to, $subject, $message, $headers);
}

$token = bin2hex(random_bytes(32));
sendVerificationEmail('user@example.com', $token);
?>
▶ Experimente

4. PHPMailer (Recomendado)

O mail() é simples, mas tem limitações. O PHPMailer é o padrão de fato para o envio de e-mails em PHP:

BASH
# Install
composer require phpmailer/phpmailer
PHP
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

function sendEmailSMTP(string $to, string $subject, string $body): bool {
    $mail = new PHPMailer(true);
    
    try {
        // Server settings
        $mail->isSMTP();
        $mail->Host       = 'smtp.gmail.com';    // SMTP server
        $mail->SMTPAuth   = true;
        $mail->Username   = 'your@gmail.com';     // Sender email
        $mail->Password   = 'app-password';       // App-specific password
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port       = 587;
        $mail->CharSet    = 'UTF-8';
        
        // Recipients
        $mail->setFrom('your@gmail.com', 'MyBlog');
        $mail->addAddress($to);
        
        // Content
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = strip_tags($body);  // Plain-text fallback
        
        $mail->send();
        return true;
    } catch (Exception $e) {
        echo "Email failed: {$mail->ErrorInfo}";
        return false;
    }
}

sendEmailSMTP(
    'user@example.com',
    'Password Reset',
    '<h3>MyBlog Password Reset</h3><p>Click <a href="#">here</a> to reset your password.</p>'
);
?>
💡 Dica: Ao fazer testes com o Gmail: ative a verificação em duas etapas → gere uma senha específica para o aplicativo → use essa senha (não a sua senha de login do Gmail). O Gmail rejeitará as conexões se você usar diretamente a sua senha normal.


5. Melhores práticas para e-mails

PHP
<?php
class MailService {
    public function sendWelcome(string $email, string $username): bool {
        $subject = "Welcome to MyBlog";
        $body = file_get_contents(__DIR__ . '/templates/welcome.html');
        $body = str_replace('{{username}}', htmlspecialchars($username), $body);
        
        return sendEmailSMTP($email, $subject, $body);
    }
    
    public function sendPasswordReset(string $email, string $token): bool {
        $link = "https://myblog.com/reset?token={$token}";
        $subject = "Password Reset";
        $body = "
            <h3>Password Reset Request</h3>
            <p>Click the link below to reset your password (valid for 1 hour):</p>
            <a href='{$link}'>{$link}</a>
            <p>If you didn't request a password reset, please ignore this email.</p>
        ";
        return sendEmailSMTP($email, $subject, $body);
    }
    
    public function sendNotification(string $email, string $title, string $message): bool {
        $subject = "📢 {$title}";
        $body = "<h3>{$title}</h3><p>{$message}</p>";
        return sendEmailSMTP($email, $subject, $body);
    }
}
?>

❓ Perguntas Frequentes

P: Por que o JSON é mais popular que o XML? R: Ele é leve (tem menos tags), é suportado nativamente pelo JavaScript (JSON.parse) e é altamente legível. No PHP, json_encode/json_decode lida com ele em uma única linha, enquanto o XML exige várias etapas.

P: Devo usar o mail() ou uma biblioteca SMTP? R: O mail() é prático para desenvolvimento local (se estiver configurado). Use uma biblioteca SMTP (PHPMailer) em produção — ela oferece melhor tratamento de erros, suporta anexos e vários destinatários, e não é afetada pela configuração de e-mail do servidor.

P: Posso usar um arquivo JSON como banco de dados? R: Sim, para conjuntos de dados pequenos e cenários com um único usuário (como arquivos de configuração). Para leituras/gravações simultâneas por vários usuários e consultas complexas, é necessário usar o MySQL. Os problemas do JSON como banco de dados: não permite gravações simultâneas, não possui índices, o que torna as consultas lentas, e o desempenho diminui à medida que os dados aumentam.

📖 Resumo

📝 Exercícios

  1. Crie um arquivo de configuração settings.json e use PHP para ler e exibir todos os itens de configuração.
  2. Escreva uma API JSON simples: /users retorna todos os usuários; /users/1 retorna o usuário com ID=1. Simule com parâmetros GET.
  3. Adicione a verificação por e-mail ao seu sistema de cadastro: gere um token de verificação no momento do cadastro (armazene em um arquivo/banco de dados) e envie um e-mail de verificação (teste localmente com mail() ou SMTP).
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%