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 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
$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
$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
// === 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>";
?>
▶ Exemplo: Simulação da API REST
<?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']);
}
?>
3. Envio de e-mails
(1) Noções básicas sobre a função mail()
<?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 ❌";
}
?>
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
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);
?>
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:
# Install
composer require phpmailer/phpmailer
<?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>'
);
?>
5. Melhores práticas para e-mails
<?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_decodelida com ele em uma única linha, enquanto o XML exige várias etapas.
P: Devo usar o
mail()ou uma biblioteca SMTP? R: Omail()é 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
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)serializa dadosjson_decode($json, true)analisa JSON (true = matriz, padrão = objeto)json_last_error_msg()verifica se há erros de análisemail()é simples, mas requer configuração do servidor; os assuntos codificados utilizambase64_encode- Na produção, use SMTP (PHPMailer) — ele suporta anexos, HTML e criptografia
- Os arquivos JSON são adequados para configurações de usuário único e transferências via API; os dados de múltiplos usuários devem ser armazenados em um banco de dados
📝 Exercícios
- Crie um arquivo de configuração
settings.jsone use PHP para ler e exibir todos os itens de configuração. - Escreva uma API JSON simples:
/usersretorna todos os usuários;/users/1retorna o usuário com ID=1. Simule com parâmetros GET. - 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).



