Eines de l'usuari

Eines del lloc


hestia:correu

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 domini, hi ha una casella de verificació pq. també crei el domini pel correu (bàsicament és un registre 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 «+»

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

config.php
<?php
/* Fitxer de configuració: config.php */
 
return [
    'server' => 'mail.test1.daw.inspedralbes.cat',
    'username' => 'info@test1.daw.inspedralbes.cat',
    'password' => 'UnPasswordMoltDificil!OiQueSi&',
    'port' => 587,
];

El codi PHP té diverses parts

  1. OPCIONAL. Activar la depuració
  2. Preparació de l'objecte «$mail» de PHPMAiler (haureu de fer composer require PHPMailer per tenir la llibreria)
  3. Recepció dels paràmetres del formulari
  4. Si hem rebut els paràmetres, envia el mail
    1. Si no, no fem res.
    2. 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.
  5. Al final, sempre, mostra els camps del formulari
index.php
<?php
 
/**
 * Exemple de fitxer config.php:
 * <?php
 * return [
 *     'server' => '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.";
    }
}
 
?>
<!-- Fins aquí el PHP -->
<!-- Formulari HTML -->
<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Enviar Correu</title>
</head>
<body>
    <form method="post" action="">
        <label for="destinatari">Destinatari:</label>
        <input type="email" id="destinatari" name="destinatari" required>
<br>
        <label for="assumpte">Assumpte:</label>
        <input type="text" id="assumpte" name="assumpte" required>
<br>
        <label for="missatge">Missatge:</label>
        <textarea id="missatge" name="missatge" required></textarea>
 
        <button type="submit">Enviar</button>
    </form>
</body>
</html>
/home/admin/web/eines.inspedralbes.cat/public_html/dokuwiki/data/pages/hestia/correu.txt · Darrera modificació: 2025/01/09 18:45 per ebota