Autor Zpráva
leorond
Profil
Ahoj, mám menší problém s diakritikou v mailech.

Vytvořil jsem si tento script

<?php
if(isset($_POST["odeslat"]))
    {
    if (!JeEmail($_POST["mail"])) $err = "Není zadán platný e-mail";
    elseif(strlen($_POST["text"])<1) $err1 = "Musíte zadat zprávu!";
    else
    $email = 'josifek.dvori@seznam.cz';
    $vysledek = mail($email, $_POST["predmet-1"]." : ".$_POST["mail"], "\n".$_POST["mail"]."\n\n".$_POST["text"]);
    if ($vysledek)
        $ok = '<font size=4><b>Mail byl úspěšně odeslaný!</b></font>';
    else
        $err2 = 'Mail se neodeslal!';
    }
?>

mezi head jsem vložil <meta charset="utf-8">

ale když odešlu mail tak tam mám špatnou diakritiku

Mohl by mi někdo poradit?


Právě jsem to vyřešil touto funkcí :) děkuji autorovy ;)

<?php
function autoUTF($s)
{
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s)) // detect UTF-8
    {
        return $s;
    }
    elseif (preg_match('#[\x7F-\x9F\xBC]#', $s)) // detect WINDOWS-1250
    {
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    }
    else // assume ISO-8859-2
    {
        return iconv('ISO-8859-2', 'UTF-8', $s);
    }
}
 
function cs_mail($to, $predmet, $zprava, $head = "")
{
    $predmet = "=?utf-8?B?".base64_encode(autoUTF($predmet))."?=";
    $head .= "MIME-Version: 1.0".PHP_EOL;
    $head .= "Content-Type: text/plain; charset=\"utf-8\"".PHP_EOL;
    $head .= "Content-Transfer-Encoding: base64".PHP_EOL;
    $zprava = wordwrap(base64_encode(autoUTF($zprava)), 78, PHP_EOL, true);
    return mail($to, $predmet, $zprava, $head);
}
?>
leorond
Profil
Ale ještě bych se zeptal na takovou maličkost, co kdybych do mého skriptu chtěl z DB vypsat třeba 10 mailových adres a odeslat tak hromadný mail všem uživatelům? Vím že je potřeba použít "," za každou mailovou adresou ale když ji tam vložím tak se mail neodešle. Dělám něco špatně?

<?php
if(isset($_POST["odeslat"]))
    {
    $result = mysql_query("SELECT email FROM aktuality");
    while($row = mysql_fetch_assoc($result))
    $vysledek = cs_mail($row["email"], $_POST["predmet-1"]." : ".$_POST["mail"], "\n".$_POST["mail"]."\n\n".$_POST["text"]);
    if ($vysledek)
        $ok = '<font size=4><b>Mail byl úspěšně odeslaný!</b></font>';
    else
        $err2 = 'Mail se neodeslal!';
    }
?>



A jak bych mohl odstranit ze zpráv <p>,... když používám tiny_mce


Tak jsem doma, mail se odešle pouze pokud je to prostý text, když zadám třeba tučné písmo tak mám smolíka.
Tomáš123
Profil
leorond:
Vím že je potřeba použít "," za každou mailovou adresou ale když ji tam vložím tak se mail neodešle.
A zadávaš to v správnom formáte?

A jak bych mohl odstranit ze zpráv <p>,... když používám tiny_mce
str_replace("<p>", "", $message);
Ak by šlo o nejaké 3, 4 značky, ide ich vymenovať, inak asi bude lepšie použiť regulárne výrazy, kde budeš môcť odstrániť aj napríklad paragrafy s triedami.

Tak jsem doma, mail se odešle pouze pokud je to prostý text
Odosielaš e-mail s hlavičkou text/html?
leorond
Profil
Bože je možný že jsem takovej ... :D no jistě že tam mám text/plain :D


člověk jde písmeno po písmenu a ona je to taková prkotina
Dan Charousek
Profil
leorond:
V PHP se dá explicitně validovat emailová adresa pomocí filter_var()

$email = "bob@example.com";
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // validní email
} else { /* nevalidní email */}

Nemusíš tedy používat vlastní řešení, které mnohdy nepokryje všechny případy (nebo naopak pokryje jich víc než by mělo).

Tomáš123:
str_replace("<p>", "", $message);
A co uzavírací značka?

leorond:
Na odstraňování html tagů existuje přímo funkce strip_tags();
leorond
Profil
No dejme tomu že používám tinymce a chtěl bych tam ty HTML značky nechat?
Například bych tam vložil něco takového

$zprava  =  "<html><body>";
$zprava  .=  htmlspecialchars($_POST['text']);
$zprava  .=  "</body></html>";
$vysledek = cs_mail_1("mail@mail.cz", $_POST["predmet"], $zprava, "From: ".strip_tags($row["email"])."".PHP_EOL);

Bude to fungovat? Nebo dělám něco špatně?
Slark
Profil *
Pokud používáte tinymce, tak si odstraňte htmlspecialchars a bude vám html výstup fungovat i v emailu, takže zpráva bude jen $_POST['text'].
leorond
Profil
Ano vím jen jsem musel udělat ještě pár úprav a to

$zprava  =  $_POST['text'];
$vysledek = cs_mail_1("mail@mail.cz", $_POST["predmet"], "<html><body>".$zprava."</body></html>", "From: ".strip_tags($row["email"])."".PHP_EOL);

takto mi to funguje v pořádku.

Co kdybych chtěl odesílat mail více uživatelům? Potřeboval bych vypsat třeba 100 řádků mailů z mysql, to zvládám ale jak to udělat aby se mi za každou takto vypsanou mailovou adresu vložila čárka? Případně pokud bude za každou adresou čárka, odešle se mail i v případě že za poslední adresou bude čárka také?
juriad
Profil
Slyšel jsi někdy o funkci implode?
leorond
Profil
Vypadá to zajímavě, ano něco jsem o tom četl ale moje angličtina není moc obstojná a tak z toho mám spíše guláš.
Mohl bys mi trošku nastínit jednoduchý příklad s menším popisem?
leorond
Profil
Tak mám takovíto výsledný skript který funguje a nefunguje, pošle mi email pokud v něm není HTML což nechápu. Používám tinymce a mělo by to odeslat v pořádku nebo snad ne?

<?
if(isset($_POST["MAIL"]))
{
    $result = mysql_query("SELECT email FROM kontakt");
    while($row = mysql_fetch_assoc($result))
    $vysledek = cs_mail_1("josifek.dvori@seznam.cz", $_POST["predmet"], "<html><body>".$_POST['text']."</body></html>", "From: ".strip_tags($row["email"])."".PHP_EOL);
    echo "Zpráva byla odeslána";
}
?>
<form action="#" method="POST">
    <input type="text" name="predmet" placeholder="Předmět..."><br><br>
    <textarea name="text"></textarea><br><br>
    <input type="submit" name="MAIL" value="Odeslat">
</form>



nebo by byla chyba zde?

function cs_mail_1($to, $predmet, $zprava, $head = "")
{
    $predmet = "=?utf-8?B?".base64_encode(autoUTF($predmet))."?=";
    $head .= "MIME-Version: 1.0".PHP_EOL;
    $head .= "Content-Type: text/html; charset=\"utf-8\"".PHP_EOL;
    $head .= "Content-Transfer-Encoding: base64".PHP_EOL;
    $zprava = wordwrap(base64_encode(autoUTF($zprava)), 78, PHP_EOL, true);
    return mail($to, $predmet, $zprava, $head);
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: