Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: mb_send_mail - složené tělo emailu

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Procházka:2. dubna 0:56

Zdravím páni,
potřeboval bych do odeslaného těla emailu vložit více položek formuláře, ale nevím jak. Konkrétně jsou to jmeno, email, cislo, pocet osob, termin, zprava. Samotnou zpravu mám vloženou bez problémů, ale vložit tam více věcí zaráz je právě ten problém.
Můžete mně prosím poradit? Děkuji předem.

<?php
/*
 *  _____ _______         _                      _
 * |_   _|__   __|       | |                    | |
 *   | |    | |_ __   ___| |___      _____  _ __| | __  ___ ____
 *   | |    | | '_ \ / _ \ __\ \ /\ / / _ \| '__| |/ / / __|_  /
 *  _| |_   | | | | |  __/ |_ \ V  V / (_) | |  |   < | (__ / /
 * |_____|  |_|_| |_|\___|\__| \_/\_/ \___/|_|  |_|\_(_)___/___|
 *                   ___
 *                  |  _|___ ___ ___
 *                  |  _|  _| -_| -_|  LICENCE
 *                  |_| |_| |___|___|
 *
 *    REKVALIFIKAČNÍ KURZY  <>  PROGRAMOVÁNÍ  <>  IT KARIÉRA
 *
 * Tento zdrojový kód pochází z IT kurzů na WWW.ITNETWORK.CZ
 *
 * Můžete ho upravovat a používat jak chcete, musíte však zmínit
 * odkaz na http://www.itnetwork.cz
 */

mb_internal_encoding("UTF-8");

$hlaska = '';
if (isset($_GET['uspech']))
    $hlaska = 'Poptávka byla úspěšně odeslána, brzy Vám odpovíme.';
if ($_POST) { // V poli _POST něco je, odeslal se formulář
    if (
        isset($_POST['jmeno']) && $_POST['jmeno'] &&
        isset($_POST['email']) && $_POST['email'] &&
                isset($_POST['cislo']) && $_POST['cislo'] &&
                isset($_POST['osob']) && $_POST['osob'] &&
                isset($_POST['termin']) && $_POST['termin'] &&
        isset($_POST['zprava']) && $_POST['zprava'] &&
        isset($_POST['rok']) && $_POST['rok'] == date('Y')
    ) {
        $hlavicka = 'From:' . $_POST['email'];
        $hlavicka .= "\nMIME-Version: 1.0\n";
        $hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";
        $adresa = '[email protected]';
        $predmet = 'Poptávka ubytování';
        $uspech = mb_send_mail($adresa, $predmet, $_POST['zprava','jmeno'], $hlavicka);
        if ($uspech) {
            $hlaska = 'Poptávka byla úspěšně odeslána, brzy Vám odpovíme.';
            header('Location: mailform.php?uspech=ano');
            exit;
        } else
            $hlaska = 'Email se nepodařilo odeslat. Zkontrolujte adresu.';
    } else
        $hlaska = 'Formulář není správně vyplněný!';
}

?>

<!DOCTYPE html>
<html lang="cs">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

    <?php
    if ($hlaska)
        echo ('<p style="font:1.1em/1.5; color: #CCC; font: arial,sans-serif;">' . htmlspecialchars($hlaska) . '</p>');

    $jmeno = (isset($_POST['jmeno'])) ? $_POST['jmeno'] : '';
    $email = (isset($_POST['email'])) ? $_POST['email'] : '';
    $cislo = (isset($_POST['cislo'])) ? $_POST['cislo'] : '';
    $osob = (isset($_POST['osob'])) ? $_POST['osob'] : '';
    $termin = (isset($_POST['termin'])) ? $_POST['termin'] : '';
    $zprava = (isset($_POST['zprava'])) ? $_POST['zprava'] : '';
    ?>


    <form method="POST" style="font:1.1em/1.5; color: #CCC; font: arial,sans-serif;">
        <table>
            <tr>
                <td>Jméno a příjmení:</td>
                <td><input name="jmeno" type="text" value="<?= htmlspecialchars($jmeno) ?>" /></td>
            </tr>
            <tr>
                <td>Email:</td>
                <td><input name="email" type="email" value="<?= htmlspecialchars($email) ?>" /></td>
            </tr>
            <tr>
                <td>Telefonní číslo:</td>
                <td><input name="cislo" type="text" /></td>
            </tr>
            <tr>
                <td>Počet osob:</td>
                <td><input name="osob" type="text" /></td>
            </tr>

            <tr>
                <td>Termín pobytu od - do:</td>
                <td><input name="termin" type="text" /></td>
            </tr>
            <tr>
                <td>Aktuální rok (antispam):</td>
                <td><input name="rok" type="number" /></td>
            </tr>
            <tr>
                <td>Upřesnění pokojů a/nebo vzkaz:</td>
                                <td><textarea rows="5" cols="40" name="zprava"><?= htmlspecialchars($zprava) ?></textarea></td>
            </tr>
        <br />

        </table>


        <input type="submit" value="Odeslat poptávku" />
    </form>


</body>

</html>
 
Odpovědět
2. dubna 0:56
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2. dubna 8:38
  • Kdyby sis to isset resil uz na zacatku, mohl jsi pro odeslani pouzit jen porovnani $jmeno==""
  • vsude, kde mas v adrese \nma byt PHP_EOL
  • a ke tve otazce, navod k funkci najdes na https://www.php.net/mb-send-mail

Hm, koukam, ze priklady k mb-send-mail stoji za prd :)
Ok, tak podstatne je, ze treti parametr je $message

 mb_send_mail(
    string $to,
    string $subject,
    string $message,
    array|string $additional_headers = [],
    ?string $additional_params = null
): bool

Zkus tedy mail. A, opet, kde tam maji \r\n a pod, ma byt PHP_EOL
https://www.php.net/…ion.mail.php

<?php
$to      = '[email protected]';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>

Example #5 Sending HTML email
It is also possible to send HTML email with mail().

<?php
// Multiple recipients
$to = '[email protected], [email protected]'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Johny</td><td>10th</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$headers[] = 'To: Mary <[email protected]>, Kelly <[email protected]>';
$headers[] = 'From: Birthday Reminder <[email protected]>';
$headers[] = 'Cc: [email protected]';
$headers[] = 'Bcc: [email protected]';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers)); // lepe implode(PHP_EOL, $headers)
?>

Info k PHP_EOL se trosku hur hleda, lepsi pouzit google.
https://www.php.net/…onstants.php#…
Jde o to, ze ruzne verze php a systemy pouzivaji pro odradkovani ruzne zapisy. A to prave resi pouziti je konstanty PHP_EOL Mohlo by se ti stat, ze ti mail nepujde odeslat, protoze mas v hlavicce spatnou konstantu, \n nemusi stacit.
Samozrejme si ty priklady uprav podle tveho kodu. Kodovani a jine.

Editováno 2. dubna 8:39
 
Nahoru Odpovědět
2. dubna 8:38
Avatar
Odpovídá na Peter Mlich
Petr Procházka:3. dubna 0:59

Díky moc za odpověď a nápovědu. Ještě jsem si musel hodně nastudovat, ale dobrá věc se podařila :-)
Nakonec jsem to vyřešil pomocí pole, kde mám všechny hodnoty poskládané a vkládám je do mail funkcí implode
Pro názornost a třeba někoho dalšího, kdo by to potřeboval:

$hlavicka[] = 'From:' . $_POST['email'];
$hlavicka[] = 'Cc:' . $_POST['email'];
$hlavicka[] = '\nMIME-Version: 1.0\n';
$hlavicka[] = 'Content-type: text/html; charset=\"utf-8\"\n';
$adresat = '[email protected]';
$predmet = 'Poptávka - penzion Vanda';
        $array = array
                (PHP_EOL,
                'Jméno: ' . $_POST['jmeno'],
                'Email: ' . $_POST['email'],
                'Telefon: ' . $_POST['cislo'],
                'Počet osob: ' . $_POST['osob'],
                'Termín od: ' . $_POST['termin_od'],
                'Termín do: ' . $_POST['termin_do'],
                'Zpráva: ' . $_POST['zprava']);
$uspech = mail($adresat, $predmet, "<pre>".implode(PHP_EOL, $array)."</pre>", implode(PHP_EOL, $hlavicka));
if ($uspech) {
    $hlaska = 'Poptávka byla úspěšně odeslána, budeme Vás kontaktovat.';
 
Nahoru Odpovědět
3. dubna 0:59
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3. dubna 7:40

Jo, no, ale misto mail jsi mel pouzit ten mb_mail :) U mail to odesila tak, jak to tam das. A nektere maily neumi spravne dekodovat utf-8 nebo jine kodovani. Tomu by mel predejit mb_mail. Ale nemam s tim zkusenost.
Hlavicka se treba koduje jeste do base64, prave kvuli problemum s utf.

Ale, pokud ti to odesila spravne, a mail uzivatele zobrazuje ok, tak ok. Zatim bych to neresil.

 
Nahoru Odpovědět
3. dubna 7:40
Avatar
Odpovídá na Peter Mlich
Petr Procházka:3. dubna 22:27

Tady: "":https://www.dasm.cz/…-maily-z-php jsem načetl, že v případě toho skládaného těla mailu a myslím i složených hlaviček je potřeba použít prostou fci mail, tak jsem to tak udělal. Odesílá to s diakritikou, odřádkované, takže v pohodě :-)
Zkoušel jsem to i s mb_mail, a funguje to také, takže obě možnosti jsou v tomhle případě nejspíš správné :-)

 
Nahoru Odpovědět
3. dubna 22:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.