NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Chybná diakritika v mailu (formulář)

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

Aktivity
Avatar
Tomáš Svoboda:17.2.2017 22:04

Dobrý večer, mám problém na svém webu používám formulář co se odesílá na mail. Vše proběhne jak má až na to že se nezobrazují háčky, čárky místo toho jsou tam tyto znaky "ìšèøžýáíé"
Díky za pomoc všem
Code ze souboru mail.php

<?php
$to = "[email protected]";
$extra = "From: ".$_POST['email']."\r\nReply-To: ".$_POST['email']."\r\n";
$subject = "Registrace od ".$_POST['jmeno']."";
$mess =
"Jméno a přijmení: ".$_POST['jmeno']."\n
 Datum narození:".$_POST['datum']."\n
 Telefon: ".$_POST["telefon"]."\n
 Email: ".$_POST['email']."\n
 Adresa: ".$_POST['adresa']."\n";
mail ($to, $subject, $mess, $extra);
?>
<html><head>
<meta http-equiv="refresh" content="0; url=viewpage.php?page_id=12">
</head><body></body></html>
Editováno 17.2.2017 22:05
 
Odpovědět
17.2.2017 22:04
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 9:25

Spíše bych Ti doporučil nějakou knihovnu (PHP Mailer, Swift Mailer apod.), protože časem přijdeš na mnohem více problémů s mail(), které budeš muset řešit, než je diakritika. Pokud by ses přece chtěl držet funkce mail, tak musíš ošetřit zakódování těch hlaviček.

Např. ve Swift Mailer by to mohlo vypadat nějak takhle:

<?php
    require_once 'swiftmailer/lib/swift_required.php';

    $smtpServer     = "nekde.neco";
    $smtpPort       = "465";
    $smtpEncryption = "ssl";
    $smtpUsername   = "nejakeJmeno";
    $smtpPassword   = "nejakeHeslo";

    $receiverName   = "Kosmetika Oriflame";
    $receiverEmail  = "[email protected]";


    $jmeno = $zaznam["jmeno"];
    $datum = $zaznam["datum"];
    $telefon = $zaznam["telefon"];
    $email = $zaznam["email"];
    $adresa = $zaznam["adresa"];

    $senderName = $jmeno;
    $senderEmail = $email;

    $transport = Swift_SmtpTransport::newInstance($smtpServer, $smtpPort, $smtpEncryption)
            ->setUsername($smtpUsername)
            ->setPassword($smtpPassword)
    ;

    $message = Swift_Message::newInstance();
    $message->setTo(array($receiverEmail => $receiverName));
    $message->setSubject(mime_header_encode("Registrace od " . $jmeno));
    $message->setFrom(array($senderEmail => mime_header_encode($senderName)));
    $message->setSender(array($senderEmail => mime_header_encode($senderName)));
    $message->setCharset('UTF-8');
    $message->setPriority(2);

    $zprava_plain = "
        Jméno a příjmení: $jmeno\n
        Datum narození: $datum\n
        Telefon: $telefon\n
        E-mail: $email\n
        Adresa: $adresa\n
    ";

    $message->setBody($zprava_plain, 'text/plain');
    $mailer = Swift_Mailer::newInstance($transport);

    $failures = null;
    if (!$mailer->send($message, $failures)) {
        echo "<br><p style = 'color:red'><strong>Nastala chyba při odesílání e-mailu. Kontaktuje nás, prosím.</strong><br><small>";
        print_r($failures); /// !! POUZE PRO DEBUG, POTOM SMAZAT!!!
        echo "</small><br><br>";
    }

?>
<html><head>
<meta http-equiv="refresh" content="0; url=viewpage.php?page_id=12">
</head><body></body></html>

Jo a ještě bych si dal pozor na to, že jako odesílatele nastavuješ toho, kdo formulář odeslal. Pokud bude mít ta doména správně nastavené SPF, tak Ti ten e-mail nepřijde a maximálně přijde dotyčnému upozornění, že ses o to pokusil. Lepší bude, když jako odesílatele nastavíš sebe a skutečného odesílatele nastavíš do Reply-To (abys mohl odpovídat tlačítkem "odpovědět". Jo a omlouvám se za styl kódu a jeho dvojjazyčnost, splácal jsem narychlo několik skriptů dohromady. :D

Nahoru Odpovědět
18.2.2017 9:25
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 9:36

Jo a samozřejmě můžeš Swift Mailer donutit používat mail(), ikdyž se to nedoporučuje (dokumentace k tomu je zde).

Nahoru Odpovědět
18.2.2017 9:36
Kuba je ajťák. Buď jako Kuba.
Avatar
Odpovídá na Jakub Žák
Tomáš Svoboda:18.2.2017 9:54

No po pravdě uvítám cokoliv co bude spolehlivé a bude fungovat, nejsem až tak zkušený, takže v tom docela plavu, zkoušel jsem použít ten Swiftmailer ale nějak se mi nedaří. Nemohl bych vás poprosit o pomoc?

 
Nahoru Odpovědět
18.2.2017 9:54
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 10:06

A co nefunguje?

Nahoru Odpovědět
18.2.2017 10:06
Kuba je ajťák. Buď jako Kuba.
Avatar
Tomáš Svoboda:18.2.2017 10:10

Vypisuje to furt nějaký chyby
Tuhle jako první
Fatal error: Call to undefined function mime_header_en­code() in /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/sen­d.php on line 30

 
Nahoru Odpovědět
18.2.2017 10:10
Avatar
Tomáš Svoboda:18.2.2017 10:11

jinak výpis indexu je tu

<fieldset>
<table style="height:100%;" width="100%" cellSpacing="0" cellPadding="0" border:1px solid #00ccff;>
<tr><td align="center" valign="top">
<form action="send.php" method="post">
<table width="400" border="0" class="text">
<tr><td width="200"><strong>Jméno a přijmení:</strong</td><td><input name="jmeno" size=25px accesskey="j" type="text"></td></tr>
<tr><td width="200"><strong>Datum narození:</strong</td><td><input name="datum" size=25px accesskey="t" type="text"></td></tr>
<tr><td width="200"><strong>Telefon:</strong</td><td><input name="telefon" size=25px accesskey="t" type="text"></td></tr>
<tr><td width="200"><strong>Email:</strong</td><td><input name="email" size=25px accesskey="e" type="text"></td></tr>
<tr><td width="200" valign="top"><strong>Adresa</strong></td><td><textarea name="adresa" accesskey="A" rows="3" cols="23"></textarea></td></tr>

<tr><td colspan="2" align="center"><input type="submit" class="button" value="Odeslat"> <input type="reset" value="Vymazat"></td></tr>
</table>
</form>
</td></tr>
</table>

<center><p><span class='small'>Tyto internetové stránky nesbírají žádné informace o návštěvnících stránek. Osobní ani jiné údaje nejsou získávány žádným jiným způsobem, s výjimkou elektronického formuláře sloužícího k odesílání Vašich dotazů a požadavků. Všechny údaje obsažené v elektronickém formuláři jsou údaji důvěrnými a slouží pouze k účelu, ke kterému byly poskytnuty.</span> </p></center>
</fieldset>
 
Nahoru Odpovědět
18.2.2017 10:11
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:18.2.2017 10:15

Aha, neuvědomil jsem si, že to je moje funkce :D

function mime_header_encode($text, $encoding = "utf-8") {
    return "=?utf-8?B?" . base64_encode($text) . "?=";
}
Nahoru Odpovědět
18.2.2017 10:15
Kuba je ajťák. Buď jako Kuba.
Avatar
Odpovídá na Jakub Žák
Tomáš Svoboda:18.2.2017 10:19

Ehm, kam tohle mám zapsat ? :o

 
Nahoru Odpovědět
18.2.2017 10:19
Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:18.2.2017 10:24

hned za

<?php
Nahoru Odpovědět
18.2.2017 10:24
Kuba je ajťák. Buď jako Kuba.
Avatar
Tomáš Svoboda:18.2.2017 10:26

tak ted pro změnu vypisuje tohle ;-(

Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [] does not comply with RFC 2822, 3.6.2.' in /data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php:345 Stack trace: #0 /data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php(261): Swift_Mime_Headers_MailboxHeader->_assertValidAddress('') #1 /data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php(106): Swift_Mime_Headers_MailboxHeader->normalizeMailboxes(Array) #2 /data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php(63): Swift_Mime_Headers_MailboxHeader->setNameAddresses(Array) #3 /data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/swiftmailer/lib/classes/Swift/Mime/SimpleMimeEntity.php(592): Swift_Mime_Headers_MailboxH in /data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php on line 345
 
Nahoru Odpovědět
18.2.2017 10:26
Avatar
Odpovídá na Tomáš Svoboda
Tomáš Svoboda:18.2.2017 10:31

Při použití tohoho codu tak mi to vyhazuje zas tuhle chybu
Parse error: syntax error, unexpected '<' in /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/sen­d.php on line 56

<?php
function mime_header_encode($text, $encoding = "utf-8") {
    return "=?utf-8?B?" . base64_encode($text) . "?=";
    require_once 'swiftmailer/lib/swift_required.php';

    $smtpServer     = "smtp-155829.m29.wedos.net";
    $smtpPort       = "465";
    $smtpEncryption = "ssl";
    $smtpUsername   = "[email protected]";
    $smtpPassword   = "heslo";

    $receiverName   = "Kosmetika Oriflame";
    $receiverEmail  = "[email protected]";


    $jmeno = $zaznam["jmeno"];
    $datum = $zaznam["datum"];
    $telefon = $zaznam["telefon"];
    $email = $zaznam["email"];
    $adresa = $zaznam["adresa"];

    $senderName = $jmeno;
    $senderEmail = $email;

    $transport = Swift_SmtpTransport::newInstance($smtpServer, $smtpPort, $smtpEncryption)
            ->setUsername($smtpUsername)
            ->setPassword($smtpPassword)
    ;

    $message = Swift_Message::newInstance();
    $message->setTo(array($receiverEmail => $receiverName));
    $message->setSubject(mime_header_encode("Registrace od " . $jmeno));
    $message->setFrom(array($senderEmail => mime_header_encode($senderName)));
    $message->setSender(array($senderEmail => mime_header_encode($senderName)));
    $message->setCharset('UTF-8');
    $message->setPriority(2);

    $zprava_plain = "
        Jméno a příjmení: $jmeno\n
        Datum narození: $datum\n
        Telefon: $telefon\n
        E-mail: $email\n
        Adresa: $adresa\n
    ";

    $message->setBody($zprava_plain, 'text/plain');
    $mailer = Swift_Mailer::newInstance($transport);

    $failures = null;
    if (!$mailer->send($message, $failures)) {
        echo "<br><p style = 'color:red'><strong>Nastala chyba při odesílání e-mailu. Kontaktuje nás, prosím.</strong><br><small>";
        echo "</small><br><br>";
    }

?>
<html><head>
<meta http-equiv="refresh" content="0; url=viewpage.php?page_id=12">
</head><body></body></html>
Editováno 18.2.2017 10:31
 
Nahoru Odpovědět
18.2.2017 10:31
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 10:32

Píše to špatný formát adresy, byly správně vyplněny všechny položky?

Nahoru Odpovědět
18.2.2017 10:32
Kuba je ajťák. Buď jako Kuba.
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 10:33

Zkopíroval jsi tu funkci bez uzavírací závorky (bez jednoho řádku).

Nahoru Odpovědět
18.2.2017 10:33
Kuba je ajťák. Buď jako Kuba.
Avatar
Tomáš Svoboda:18.2.2017 10:37

údaje k smtp by měli být správné, takže ten code má vypadat takto?

<?php
function mime_header_encode($text, $encoding = "utf-8") {
    return "=?utf-8?B?" . base64_encode($text) . "?=";
    require_once 'swiftmailer/lib/swift_required.php';
}
    $smtpServer     = "smtp-155829.m29.wedos.net";
    $smtpPort       = "465";
    $smtpEncryption = "ssl";
    $smtpUsername   = "[email protected]";
    $smtpPassword   = "hst*Podebrady2012";

    $receiverName   = "Kosmetika Oriflame";
    $receiverEmail  = "[email protected]";


    $jmeno = $zaznam["jmeno"];
    $datum = $zaznam["datum"];
    $telefon = $zaznam["telefon"];
    $email = $zaznam["email"];
    $adresa = $zaznam["adresa"];

    $senderName = $jmeno;
    $senderEmail = $email;

    $transport = Swift_SmtpTransport::newInstance($smtpServer, $smtpPort, $smtpEncryption)
            ->setUsername($smtpUsername)
            ->setPassword($smtpPassword)
    ;

    $message = Swift_Message::newInstance();
    $message->setTo(array($receiverEmail => $receiverName));
    $message->setSubject(mime_header_encode("Registrace od " . $jmeno));
    $message->setFrom(array($senderEmail => mime_header_encode($senderName)));
    $message->setSender(array($senderEmail => mime_header_encode($senderName)));
    $message->setCharset('UTF-8');
    $message->setPriority(2);

    $zprava_plain = "
        Jméno a příjmení: $jmeno\n
        Datum narození: $datum\n
        Telefon: $telefon\n
        E-mail: $email\n
        Adresa: $adresa\n
    ";

    $message->setBody($zprava_plain, 'text/plain');
    $mailer = Swift_Mailer::newInstance($transport);

    $failures = null;
    if (!$mailer->send($message, $failures)) {
        echo "<br><p style = 'color:red'><strong>Nastala chyba při odesílání e-mailu. Kontaktuje nás, prosím.</strong><br><small>";
        echo "</small><br><br>";
    }

?>
<html><head>
<meta http-equiv="refresh" content="0; url=viewpage.php?page_id=12">
</head><body></body></html>

to když nahraju tak vypisuje to tuhle chybu
Fatal error: Class 'Swift_SmtpTran­sport' not found in /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/sen­d.php on line 25

 
Nahoru Odpovědět
18.2.2017 10:37
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 10:38

Ta závorka patří ještě o řádek výše.

Nahoru Odpovědět
18.2.2017 10:38
Kuba je ajťák. Buď jako Kuba.
Avatar
Tomáš Svoboda:18.2.2017 10:38

Jinak prosím vás kde kam a co mám dát na to Reply-to?

 
Nahoru Odpovědět
18.2.2017 10:38
Avatar
Tomáš Svoboda:18.2.2017 10:40

Ted to vypisuje těch několik chyb
Fatal error: Uncaught exception 'Swift_RfcCom­plianceExcepti­on' with message 'Address in mailbox given [] does not comply with RFC 2822, 3.6.2.' in /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/swif­tmailer/lib/clas­ses/Swift/Mime/He­aders/Mailbox­Header.php:345 Stack trace: #0 /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/swif­tmailer/lib/clas­ses/Swift/Mime/He­aders/Mailbox­Header.php(261): Swift_Mime_He­aders_Mailbox­Header->_assertValidAd­dress('') #1 /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/swif­tmailer/lib/clas­ses/Swift/Mime/He­aders/Mailbox­Header.php(106): Swift_Mime_He­aders_Mailbox­Header->normalizeMail­boxes(Array) #2 /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/swif­tmailer/lib/clas­ses/Swift/Mime/He­aders/Mailbox­Header.php(63): Swift_Mime_He­aders_Mailbox­Header->setNameAddres­ses(Array) #3 /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/swif­tmailer/lib/clas­ses/Swift/Mime/Sim­pleMimeEntity­.php(592): Swift_Mime_He­aders_MailboxH in /data/web/vir­tuals/155829/vir­tual/www/doma­ins/kosmetika­oriflame.cz/swif­tmailer/lib/clas­ses/Swift/Mime/He­aders/Mailbox­Header.php on line 345

 
Nahoru Odpovědět
18.2.2017 10:40
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Tomáš Svoboda
Jakub Žák:18.2.2017 15:05

Je potřeba povolit odesílání ze všech adres v rámci služby.

Nahoru Odpovědět
18.2.2017 15:05
Kuba je ajťák. Buď jako Kuba.
Avatar
Odpovídá na Jakub Žák
Patrik Pokorný:13.6.2020 15:21

Já vás zdravím. Mám problém s diatrikou v emailu u webhostingu WEDOS.net.
Formulář je zde:
":http://podkladydoparhodin.cz/viewpage.php?…"
Kod formuláře:

<?php
$to = "[email protected]";
$extra = "From: ".$_POST['email']."\r\nReply-To: ".$_POST['email']."\r\n";
$subject = "Vzkaz od ".$_POST['jmeno']."";
$mess = "Jméno: ".$_POST['jmeno']."
\nEmail: ".$_POST['email']."
\nTelefon: ".$_POST['telefon']."
\nDruh práce: ".$_POST['druhprace']."
\nNázev práce: ".$_POST['nazevprace']."
\nPočet stran: ".$_POST['pocetstran']."
\nDatum vyhotovení: ".$_POST['datumvyhotoveni']."
\nTyp citace: ".$_POST['typcitace']."
\nObor studia: ".$_POST['oborstudia']."
\nPodklady: ".$_POST['podklady']."
\nDalší specifikace/poznámky:".$_POST['text']."";
mail ($to, $subject, $mess, $extra);
?>
<html><head>
<meta http-equiv="refresh" content="0; url=home.php">
<title>Přesměrování...</title>
</head><body></body></html>

Je tam email na info@web od wedosu. Když formulář vyplním a pošlu, dorazí ale bez diatriky na danní email. Když tam ale dám aby to chodilo na email od seznamu tak je to bez problému.
PS: Odesílání z jakékoliv adresy v rámci služby - Mám zaškrtnuto. Děkuji za radu :)

 
Nahoru Odpovědět
13.6.2020 15:21
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Patrik Pokorný
Jakub Žák:10.7.2020 16:44

Doporučuji používat spíš nějakou knihovnu (např. Symfony Mailer nebo SwiftMailer). Skládat e-maily takhle ručně je peklo.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
10.7.2020 16:44
Kuba je ajťák. Buď jako Kuba.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:10.7.2020 17:17

Co jsi nasel v online dokumentaci pro funkci mail? Hledal jsi tam? Napadlo te zkusit hledat tam?

1. php.net/mail

2. ctrl+f (vyhledat na strance) utf8

//  pavel.lint at vk.com ¶
// 8 years ago
// Here's a small handy function I use to send email in UTF-8.

<?php
function mail_utf8($to, $from_user, $from_email,
                                             $subject = '(No subject)', $message = '')
   {
      $from_user = "=?UTF-8?B?".base64_encode($from_user)."?=";
      $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

      $headers = "From: $from_user <$from_email>\r\n".
               "MIME-Version: 1.0" . "\r\n" .
               "Content-type: text/html; charset=UTF-8" . "\r\n";

     return mail($to, $subject, $message, $headers);
   }
?>
Editováno 10.7.2020 17:18
 
Nahoru Odpovědět
10.7.2020 17:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.7.2020 9:37

Jeste mne napada, ze message bys mel mozna mit take v utf8 a base64, ale neni to podminkou ani treba.
a hlavne by sis mel pohlidat, abys pracoval v utf kodovani i v php. Spousta db ma default kodovani w1250. A kdyz nactes data, tak je je pak treba pres iconv() nebo jinak prevest na utf.

 
Nahoru Odpovědět
11.7.2020 9:37
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 23 zpráv z 23.