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.
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.
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).
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?
Vypisuje to furt nějaký chyby
Tuhle jako první
Fatal error: Call to undefined function mime_header_encode() in
/data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/send.php
on line 30
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>
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
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/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/send.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>
Jakub Žák:18.2.2017 10:32
Píše to špatný formát adresy, byly správně vyplněny všechny položky?
Jakub Žák:18.2.2017 10:33
Zkopíroval jsi tu funkci bez uzavírací závorky (bez jednoho řádku).
ú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_SmtpTransport' not found in
/data/web/virtuals/155829/virtual/www/domains/kosmetikaoriflame.cz/send.php
on line 25
Jinak prosím vás kde kam a co mám dát na to Reply-to?
Ted to vypisuje těch několik chyb
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
Jakub Žák:18.2.2017 15:05
Je potřeba povolit odesílání ze všech adres v rámci služby.
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
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.
+20 Zkušeností
+2,50 Kč
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);
}
?>
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.
Zobrazeno 23 zpráv z 23.