====== Correu ====== ===== Conceptes bàsics ===== Per a entendre una mica com funciona és necessari tenir clars els conceptes més bàsics del correu Protocol d'enviament de correus: SMTP\\ Protocol bàsic de recollida de correus: POP\\ Protocol avançat de recollida de correus: IMAP\\ I també són interessats de conèixer els conceptes de MTA, MTX... Però per fer una aplicació que envia i rep correus no són del tot necessaris ===== Habilitar el correu en un domini ===== Des del panell de Hestia, quan es crea un [[hestia:domini]], hi ha una casella de verificació pq. també crei el domini pel correu (bàsicament és un registre [[hestia:DNS]] de tipus MX). Ara bé, si no s'ha creat el domini del correu, es pot crear a posteriori. Hestia -> Mail -> Add Mail Domain Una vegada creat podem crear comptes de correu segons les necessitats del projecte (el nombre de comptes i la quantitat de mails enviats tenen un sistema de quotes que l'administrador de Hestia pot modificar) ===== Creació d'un compte de correu ===== Hestia > Mail > Símbol "+" {{:hestia:icones.png?nolink|}} I ens preguntarà les dades bàsiques: * nom del compte * Paraula de pas. * A les opcions avançades podem posar alguns límits o reenviaments. * Adreça on enviar les credencials En tot moment, a la dreta, ens mostra tota la informació del compte que estem creant, però si posem un correu, aleshores tindrem tota aquesta informació al nostre correu per poder consultar després (o per compartir) tranquil·lament. ===== Enviant correu des de PHP ===== Una de les llibreries típiques és PHPMailer. Per poder-la fer servir al labs hem de desactivar la verificació dels certificats de la següent forma try { $mail = new PHPMailer(true) $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); $mail->isSMTP(); $mail->SMTPAuth = true; $mail..... ... I per depurar: $mail->SMTPDebug = 2; // Nivells: 0 = cap, 1 = errors i missatges, 2 = missatges de l'estat del client/servidor, 3 = més detallat, 4 = traça detallada $mail->Debugoutput = 'html'; // Format de sortida (html o text) ==== Exemple complet ==== 'mail.test1.daw.inspedralbes.cat', 'username' => 'info@test1.daw.inspedralbes.cat', 'password' => 'UnPasswordMoltDificil!OiQueSi&', 'port' => 587, ]; El codi PHP té diverses parts - OPCIONAL. Activar la depuració - Preparació de l'objecte "$mail" de PHPMAiler (haureu de fer ''composer require PHPMailer'' per tenir la llibreria) - Recepció dels paràmetres del formulari - Si hem rebut els paràmetres, envia el mail - Si no, no fem res. - Si error en el mail fa un echo "a sac" del missatge. Per fer-ho bé, el missatge estaria dins d'un div i s'hauria de mostrar correctament. - Al final, sempre, mostra els camps del formulari 'smtp.example.com', * 'username' => 'nomusuari@example.com', * 'password' => 'contrassenyaSegura', * 'port' => 465, * ]; */ // Incloem la biblioteca PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'vendor/autoload.php'; // Incloem el fitxer de configuració $config = require 'config.php'; // Funció per enviar un correu electrònic function enviarCorreu(string $destinatari, string $assumpte, string $missatge): bool { global $config; try { $mail = new PHPMailer(true); //activem el debug al màxim per veure tots els errors ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Opcions de depuració $mail->SMTPDebug = 2; // Nivells: 0 = cap, 1 = errors i missatges, 2 = missatges de l'estat del client/servidor, 3 = més detallat, 4 = traça detallada $mail->Debugoutput = 'html'; // Format de sortida (html o text) //**El servidor té un problema amb els certificats i hem de deshabilitar un nivell de seguretat. //En un entorn real NO S'HAURIA DE FER, sinó que s'hauria d'arreglar la configuració //del servidor** $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); // Configuració del servidor SMTP $mail->isSMTP(); $mail->Host = $config['server']; $mail->SMTPAuth = true; $mail->Username = $config['username']; $mail->Password = $config['password']; #º $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Activar encriptació TLS $mail->Port = $config['port']; // Configuració del remitent i destinatari $mail->setFrom($config['username'], 'Nom del Remitent'); $mail->addAddress($destinatari); // Contingut del correu $mail->isHTML(true); $mail->Subject = $assumpte; $mail->Body = $missatge; // Mostrar informació del servidor per consola error_log("Servidor: " . $mail->Host); error_log("Port: " . $mail->Port); error_log("Nom d'usuari: " . $mail->Username); error_log("Contrasenya: " . $mail->Password); error_log("------------------------------- ENVIA !"); // Enviem el correu $mail->send(); return true; } catch (Exception $e) { error_log("Error en enviar el correu: " . $mail->ErrorInfo); return false; } } // Processar el formulari if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Sanejament de les dades del formulari $destinatari = filter_input(INPUT_POST, 'destinatari', FILTER_VALIDATE_EMAIL); $assumpte = filter_input(INPUT_POST, 'assumpte', FILTER_SANITIZE_STRING); $missatge = filter_input(INPUT_POST, 'missatge', FILTER_SANITIZE_STRING); if ($destinatari && $assumpte && $missatge) { if (enviarCorreu($destinatari, $assumpte, $missatge)) { echo "El correu s'ha enviat correctament."; } else { echo "Hi ha hagut un error en enviar el correu."; } } else { echo "Si us plau, ompliu tots els camps correctament."; } } ?> Enviar Correu