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


Ahoj.
1.) A zkoušíš to kde? Na localhostu, nebo někde na normálním serveru?
2.) Jak se projevuje, že to nefunguje? Že mail nedorazí ještě neznamená,
že se neodeslal.
3.) Headers jsou trochu magie - než se s tím patlat, tak bych rovnou
doporučil používat nějakou knihovnu (PHPMailer, Nette mailer, swift mailer)
- tam budeš takových věcí ušetřen.
Ta videa jsou nějaká divná, přiznávám se, že jsem je nestudoval - polovina negativních hodnocení není úplně dobrá vizitka.
Na příklad nastavení hlaviček a češtiny se můžeš podívat sem: Problémy s e-maily - mě to vždy fungovalo, pokud jsem nepoužíval knihovny.
ahoj, ďakujem že si odpísal. Skúšam to na hostingu: https://www.000webhost.com/ . prejavuje sa to následným
hlásením:
Warning: mb_send_mail() has been disabled for security reasons in
/storage/ssd1/919/8387919/public_html/index.php on line 14
Email failed to send. Check the address.
zdrojoví kod stránky som sem dal a hlásenie píše chibu na 14 riadku,
zasekáva sa to pri mb_send_mail, neviem príjst na to kde je chyba, vždy to
opravím ale vždy je chiba pri mb_send_mail
ďakujem aj za odkaz študujem ho, čo sa týka videí, viem že neboli príliš
dobre hodnotené, no iné som zatiaľ nenašiel.
translate.google.com = mb_send_mail() has been disabled for security reasons
Nejspis ta funkce byla zakazana. Nejspis adminem serveru, aby neslo odesilat
maily. Pokud je to free hosting, nejspis bude nekde tabulka, co vsechno takovy
free povoluje a co uz ne proti placene verzi. Pomoci phpinfo() by se to melo dat
take zjistit.
Pravdepodobne ti nepujde pouzit ani funkce mail(). Tim padem odpada moznost
pouziti knihoven jako php-mailer.
Ja mam na mail treba tohle, ale to ti asi nepomuze. Posledni radek je prave funkce mail.
<?php
class classMail
{
//private $to, $subject, $message, $headers;
private $sep, $server;
function __construct($server=array())
{
$this->sep = PHP_EOL;
$this->server = $server;
}
private function fileToBase64($str)
{
return chunk_split(base64_encode($str), 76, $this->sep);
// return wordwrap(base64_encode($data['content']), 76, $this->sep, true);
}
private function createMessage($data)
{
if (!isset($data['content']) || $data['content']=='' || !isset($data['type']))
{
return;
}
$out = array();
switch ($data['type'])
{
// pro mail-body
case 'text': // array('type'=>'text', 'content'=>'a\nb\nc')
case 'text_file': // array('type'=>'text_file', 'content'=>file_get_contents('path')}
{
$out[] = 'Content-type: text/plain; charset=utf-8'; //'Content-type: text/html; charset=iso-8859-1',
if ($data['type']=='text')
{
$out[] = 'Content-Transfer-Encoding: quoted-printable';
$out[] = '';
$out[] = $data['content'];
break;
}
$out[] = 'Content-Transfer-Encoding: base64';
$out[] = '';
$out[] = $this->fileToBase64($data['content']);
break;
}
case 'html':
case 'html_file':
{
$out[] = 'Content-type: text/html; charset=utf-8';
if ($data['type']=='html')
{
$out[] = '';
$out[] = $data['content'];
break;
}
$out[] = 'Content-Transfer-Encoding: base64';
$out[] = '';
$out[] = $this->filetoBase64($data['content']);
}
// pro mail-att
case 'file':
$out[] = 'Content-type: text/html; charset=utf-8';
$out[] = 'Content-Type: application/octet-stream; name="'.$data['filename'].'"';
$out[] = 'Content-Transfer-Encoding: base64';
$out[] = 'Content-Disposition: attachment; filename="'.$data['filename'].'"';
$out[] = '';
$out[] = $this->fileToBase64($data['content']);
break;
default: break;
}
return $out;
}
//private function headersCreate()
// {
// }
//private function messagesCreate()
// {
// }
//rfc2557 ? https://tools.ietf.org/html/rfc2557 | https://www.ietf.org/rfc/rfc2557.txt / 1999
// https://tools.ietf.org/html/rfc7231#section-3.1.4.2
public function send($form, $server=array()) //$from, $to, $subject, $message, $domena
{
$keys = array(
'from',
'to',
'notify',
'subject',
'message',
'att'
);
foreach ($keys as $value)
{
$$value = isset($form[$value]) ? $form[$value] : '';
}
if (!isset($from) || $from==""
|| !isset($to) || $to==""
|| !isset($subject) || $subject==""
)
{
return;
}
//if ($domena=="localhost ") {return false;} // upraveno
$from_text = $from;
$to_text = $to;
$subject_text = $subject;
$from = "=?utf-8?B?".base64_encode($from) ."?=";
$to = "=?utf-8?B?".base64_encode($to) ."?=";
$subject = "=?utf-8?B?".base64_encode($subject)."?=";
$uid = substr(sha1(uniqid(time())),0,20);
$uid = 'NextPart uid=' . $uid;
// $part_sep = '--NextPart uid=' . $uid;
// $uid_sep = '--'.$uid;
// ??? RFC 821, RFC 2821, rfc1341
$headers = array();
$headers[] = "From: $from";
$headers[] = "Reply-To: $from";
$headers[] = "Return-To: $from";
if ($form['notify']==true)
{
$headers[] = "Disposition-Notification-To: $from";
$headers[] = "Return-Receipt-To: $from";
}
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'X-Mailer: PHP/' . phpversion();
$headers[] = 'Content-Type: multipart/mixed; boundary="' . $uid . '"';
// $headers[] = ''; // pro slu.cz musi byt zakomentovano
$headers[] = 'This is a multi-part message in MIME format.';
$headers = implode($this->sep, $headers);
$messages = array();
$messages[] = 'test zprava';
if (isset($message) && trim($message)!=='') // $form['message']
{
array_unshift($att, $this->createMessage(array('type'=>'text', 'content'=>$message)));
}
if (count($att)>0)
{
foreach($att as $item)
{
$messages[] = '--' . $uid;
$messages[] = implode($this->sep, $this->createMessage($item));
// $messages[] = '';
$messages[] = '';
}
}
/*
Nefunguje to, aspon Thunderbird ten obrazek nezobrazi
$messages[] = '--' . $uid;
$messages[] = 'Content-Type:Text/html; charset="US-ASCII"';
$messages[] = '';
$messages[] = '<html><head><title>Test
</title></head>
<body><img src="http://www.dsv.su.se/~yvonne-b/yvonne.jpg"/> yvonne.jpg
<img src="teckning.gif"/> teckning.gif
<IMG SRC="cid:foo4atfoo1atbar.net" ALT="IETF logo">
</body></html>';
$messages[] = '';
$messages[] = '';
$messages[] = '--' . $uid;
$messages[] = 'Content-Type: image/jpg';
$messages[] = 'Content-Transfer-Encoding: base64';
$messages[] = 'Content-ID: <foo4atfoo1atbar.net>';
$messages[] = 'Content-Location: cid:foo4atfoo1atbar.net';
$messages[] = '';
$messages[] = 'R0lGODlhPABSAMQAAP///+He3tXU2sjK1bzB0K+3zKOtx5ajw4qavX2QuXCGtGR9r1dyrExppz9gojJW
nSZMmBlClAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAA
AAA8AFIAAAX/YCCOZGmewbKgbOu+55IkK2zfsEzjfF8KDofAR8QtHAaDo1ZsmgaKBCSSjEASioFze3g4
IAxFJKJgeB+Hre/QeDwW7wCj4WCk6l5GWv0SKB5jD3NDDSoNAQJ0gBBxfC00EAgNUQ4iDQ1zIg5YDQhu
CY4oAw0RaYUKhwGXl5YKC4cHEEyhAQMEAQkODyJzDEIBdUeIggx2AYIKAglDjioDYcYIYDQFCkFZDAkN
kbwNMwfGagVjArGFBnoODQZyuisGdAcLBq8NBQRjjkAIiFh+A0G8bAsCQVEQKH6W4ZpFRIAvXwpGEHjl
YIzFixjrMLgVgMCXgr94CDhy6UsqEQIA/80hViBIAYqYIjxgFqBASTAOIuKgQaecgQQEtIhYoIDANkAY
HxScyKTAswMGBjDaiAPBgnsNAIopJULBlDcJDhQYWwABjUU6';
$messages[] = '';
$messages[] = '';
*/
$messages[] = '--' . $uid . '--';
$messages = implode($this->sep, $messages);
// set mail server, if not set in php.ini
$server = count($server)>0 ? $server : $this->server;
$key_all = array('SMTP', 'smtp_port', 'sendmail_from');
foreach($key_all as $key)
{
if (isset($server[$key]))
{
ini_set($key, $server[$key]);
}
}
// send mail
//echo '<hr><pre>'; var_dump(array($to_text, $subject, $messages, $headers)); echo '</pre>';
//die();
return mail($to_text, $subject, $messages, $headers);
}
}
// $this->createMessage($messages, $item);
// $this->createMessage($messages, array('type'=>'file', 'content'=>file_get_contents($item['path'])));
/// $message = array();
// foreach ($messages as $value)
/// {
// }
?>
Odeslani mailu vypada nejak takhle
public function mailSend($form)
{
$MAIL = new classMail(array(
'SMTP' => "mujserversmtp.cz",
'smtp_port' => "25",
'sendmail_from' => $form['mail']['from']
));
$to = $form['mail']['to'];
$bool = $MAIL->send(array(
'from' => $form['mail']['from'],
'to' => $to,
'notify' => false,
'subject' => $form['mail']['subject'],
'message' => '',
'att' => $form['mail']['att']
));
$to = $to=='' ? 'prazdna' : '';
if ($bool)
{
fce_notice('Mail byl uspesne odeslan na adresu '.$to.'.', 'success');
}
else {
fce_notice('Odeslani mailu selhalo (adresa prijemce '.$to.').', 'error');
}
return $bool;
}
ahojte veľmy vám všetkým ďakujem za pomoc, skúšal som ešte jeden hosting a tam mi fungoval pôvodný spôsob. Odkaz na hosting uvádzam tu: https://www.webzdarma.cz/ . jediná vada na kráse je že sa mail objaví v spame, ale funguje to.
Od wz davam ja ruce pryc. Tam my smazali webku jen tak. Naprosto ignorovali, ze mam na webce uvedene kontakty.
Proti spamu je dulezita hlavicka a neposilat maily moc casto. Pokud
potrebujes vice mailu (a mimo nocni hodiny), musis se domluvit s adminy.
Hlavicka by mela stacit tahle, pripadne zpatecni adresy. Ty by meli
existovat.
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'X-Mailer: PHP/' . phpversion();
U mailu je spoustu vychytavek, kvuli kterym to nedojde nebo hodi do spamu. To je treba pozjistovat u admina serveru, na ktery to melo prijit nebo ze ktereho to melo odejit. Ma tam logy.
Matúš Petrofčík:7.1.2019 13:33
Trochu offtopic, ale môžeš namiesto vlastného PHP maileru skúsiť nejaký existujúci balíček s pomocou Composer-u (odkaz na článek).
V článku sa nachádza ukážka použitia balíčka PhpMailer.
Alternatívne môžeš použiť napr. SwiftMailer.
ďakujem, za rady. čo sa tíka web zdarma, len tam testujem, všetky stránky mám zálohované na disku, momntálne pýšem len prototyp, nakoniec to pobeží na uplne inom servere, táto verzia na webzdarma nemá byť vôbec pre pouzívateľa takže ak to zmažú nemám problém si vytvoriť ďalší. Na Composer saešte pozriem. ešte raz všetkým ďakujem za pomoc.
Ahoj mám dotaz ohledně použití if (!preg_match("/^[a-zA-Z ]*$/",$name)) v českém jazyce při kontrole dat z formuláře, pokud napíšu jméno s interpunkcí např. s -ř, provede to podmínku(např. vypíše chybovou hlášku), zkusil jsem to ošetřit přidáním ř(což např. s 9 fungovalo) do podmínky if (!preg_match("/^[a-zA-Zř ]*$/",$name)) a provedlo to podmínku stejně. Dík za radu. Honza
:12.1.2019 16:21
Najefektívnejšie to bude, ak to urobíš nejako takto:
$czechAlphabet = "AÁBCČDĎEÉĚFGHIÍJKLMNŇOÓPQRŘSŠTŤUÚŮVWXYÝZŽaábcčdďeéěfghiíjklmnňoópqrřsštťuúůvwxyýzž";
if (!preg_match("/^[$czechAlphabet]+$/", $name)) {
//Error
}
Jan Tesař:12.1.2019 18:40
Ahoj, nevěděl jsem jestli tam nemáš překlep a nepatří tam místo +$ dát *$, nicméně to nefunguje tak ani tak, myslím že je to totéž jako když jsem tam dopsal ř, a chtěl následně dopsat všechny písmenka s interpunkcí, problém je asi právě v tom, že příkaz neakceptuje písmenka s interpunkcí - nefungovalo to ani na localhostu, ani na webhostingu.
děkuji
Honza
:13.1.2019 12:04
Ahoj, to + je tam zámerne, aby vrátilo 0, ktorá je implicitne konvertovaná na false, keď premenná $name je prázdny string. Mohol by si mi poslať nejaký príklad hodnoty uloženej v $name?
Jan Tesař:13.1.2019 12:37
Děkuji, dám tam +, už to funguje, chyba na mojí straně - nepřepnul jsem si kódovaní v PSPadu, ale toho času a zkoušení, než mi to došlo, ach jo.
Jaroslav Patrný:28.4.2019 17:40
Ahoj, na FREE https://www.000webhost.com/ je funkce mb_send_mail() zakázaná a u FREE ji není možné povolit.
Zobrazeno 15 zpráv z 15.