Odesílání emailu z php formuláře

Dobrý den, chtěl bych se zeptat zda a jak propojit php formulář s odesláním emailu na seznam. Kontakty - poupatko.wz.cz
Děkuji za radu.

html:

<form name="contactform" method="post" action="send_form_email.php">
<table width="450px">
<tr>
<td valign="top">
<label for="first_name">Jméno *</label>
</td>
<td valign="top">
<input type="text" name="first_name" maxlength="50" size="30">
</td>
</tr>
<tr>
<td valign="top"">
<label for="last_name">Příjmeni *</label>
</td>
<td valign="top">
<input type="text" name="last_name" maxlength="50" size="30">
</td>
</tr>
<tr>
<td valign="top">
<label for="email">Email adresa *</label>
</td>
<td valign="top">
<input type="text" name="email" maxlength="80" size="30">
</td>
</tr>
<tr>
<td valign="top">
<label for="telephone">TelefonĂ­ ÄŤĂ­slo</label>
</td>
<td valign="top">
<input type="text" name="telephone" maxlength="30" size="30">
</td>
</tr>
<tr>
<td valign="top">
<label for="comments">Komentář *</label>
</td>
<td valign="top">
<textarea name="comments" maxlength="1000" cols="27" rows="6"></textarea>
</td>
</tr>
<tr>
<td colspan="2" style="text-align:center">
<input type="submit" value="Submit">
</td>
</tr>
</table>
</form>


Edit send_form_email.php

<?php
if(isset($_POST['email'])) {

// EDIT THE 2 LINES BELOW AS REQUIRED
$email_to = "vlsvo@seznam.cz";
$email_subject = "Your email subject line";


function died($error) {
// your error code can go here
echo "We are very sorry, but there were error(s) found with the form you submitted. ";
echo "These errors appear below.<br /><br />";
echo $error."<br /><br />";
echo "Please go back and fix these errors.<br /><br />";
die();
}

// validation expected data exists
if(!isset($_POST['first_name']) ||
!isset($_POST['last_name']) ||
!isset($_POST['email']) ||
!isset($_POST['telephone']) ||
!isset($_POST['comments'])) {
died('We are sorry, but there appears to be a problem with the form you submitted.');
}

$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$telephone = $_POST['telephone']; // not required
$comments = $_POST['comments']; // required

$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
$error_message .= 'The Email Address you entered does not appear to be valid.<br />';
}
$string_exp = "/^[A-Za-z .'-]+$/";
if(!preg_match($string_exp,$first_name)) {
$error_message .= 'The First Name you entered does not appear to be valid.<br />';
}
if(!preg_match($string_exp,$last_name)) {
$error_message .= 'The Last Name you entered does not appear to be valid.<br />';
}
if(strlen($comments) < 2) {
$error_message .= 'The Comments you entered do not appear to be valid.<br />';
}
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Form details below.nn";

function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}

$email_message .= "First Name: ".clean_string($first_name)."n";
$email_message .= "Last Name: ".clean_string($last_name)."n";
$email_message .= "Email: ".clean_string($email_from)."n";
$email_message .= "Telephone: ".clean_string($telephone)."n";
$email_message .= "Comments: ".clean_string($comments)."n";


// create email headers
$headers = 'From: '.$email_from."rn".
'Reply-To: '.$email_from."rn" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
?>

<!-- include your own success html here -->

Thank you for contacting us. We will be in touch with you very soon.

<?php
}
?>
Nechápu otázku. Co propojit? Vždyť přiložený kód všechno řeší. Nevím, odkud jsi to zkopíroval, ale chtělo by to začít u řádku začínajícím: // EDIT THE 2 LINES BELOW AS REQUIRED..
V adresáři kontaky na wz na příslušné stránce http://www.poupatko.wz.cz/kontakt/?p=5 mám v html formulář, který by měl odesílat email. Nicméně, se mi nic neodesílá. Nevíte v čem by mohl býtí problém. Email by měl chodit na seznam. Nechybí mi ještě neco v tom adresáři, krom toho html s názvem index.html a php skriptu - send_form_email.php, který jsem si někde stáhnul a snažil nakonfigurovat ?
Možná kdyby sis odstranil ten "@" před funkcí mail(), tak bys na to přišel. Nejprve si zablokuješ chybová hlášení a pak se divíš, že to nefunguje a nevíš proč.

Také bys mohl provizorně místo funke mail() použít funkci echo() se stejnými parametry a vypsat si, co se vlastně snažíš odeslat.
zkusil jsem to předělat ale emaily mi stejně nechodí v čem by mohl být problém ?
Děkuji za radu

<?php
if(isset($_POST['email'])) {

// EDIT THE 2 LINES BELOW AS REQUIRED
$email_to = "vlsvo@seznam.cz";
$email_subject = "Email from WEB";


function died($error) {
// your error code can go here
echo "We are very sorry, but there were error(s) found with the form you submitted. ";
echo "These errors appear below.<br /><br />";
echo $error."<br /><br />";
echo "Please go back and fix these errors.<br /><br />";
die();
}

// validation expected data exists
if(!isset($_POST['first_name']) ||
!isset($_POST['last_name']) ||
!isset($_POST['email']) ||
!isset($_POST['telephone']) ||
!isset($_POST['comments'])) {
died('We are sorry, but there appears to be a problem with the form you submitted.');
}

$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$telephone = $_POST['telephone']; // not required
$comments = $_POST['comments']; // required

$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
$error_message .= 'The Email Address you entered does not appear to be valid.<br />';
}
$string_exp = "/^[A-Za-z .'-]+$/";
if(!preg_match($string_exp,$first_name)) {
$error_message .= 'The First Name you entered does not appear to be valid.<br />';
}
if(!preg_match($string_exp,$last_name)) {
$error_message .= 'The Last Name you entered does not appear to be valid.<br />';
}
if(strlen($comments) < 2) {
$error_message .= 'The Comments you entered do not appear to be valid.<br />';
}
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Form details below.\n\n";

function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}

$email_message .= "First Name: ".clean_string($first_name)."\n";
$email_message .= "Last Name: ".clean_string($last_name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Telephone: ".clean_string($telephone)."\n";
$email_message .= "Comments: ".clean_string($comments)."\n";


// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
$zprava="first_name: $first_name\r\nlast_name: $last_name\r\nemail: $email_from\r\ntelephone: $telephone\r\ncomments: $comments\r\n";
if (isset($_POST['first_name'])&& isset($_POST['last_name']) && isset($_POST['email']) && isset($_POST['telephone']) && isset($_POST['comments']) )
{$result = mail ($email_to, $email_subject, $email_message, $headers );
if ($result)
echo "E-mail byl úspěšně odeslán na vaši adresu s objednávkou.";
else
echo "E-mail nebyl odeslán, nastala chyba.";
} else {
echo "E-mail nebyl odeslán, nebyla vyplněna všechna potřebná pole .<br/>";
echo "Text e-mailu:<br/>".nl2br($zprava);
}
}

?>
Zkusil jsi tu funkci echo()? Co vypsala?

K čemu vlastně používáš funkci clean_string()? Je k něčemu potřebná? Když budu někomu psát o content-type, tak mi to z té zprávy vymaže? Proč?

Proč 2x testuješ existenci proměnných $_POST['xx']? Vždyť je to zbytečné.

Zatím jsi nenapsal, jaká hlášení ti to vypisuje. To máme používat věšteckou kouli?

Proč tam vkládáš hlavičku 'Reply-To:'? Asi netušíš, jaké problémy s ní bývají.

Proč 2x sestavuješ zprávu? Jednou do $email_message, podruhé do $zprava?
Zkusil jsem to opravit. Nicméně mi to nic nevipisuje žádné hlášení ani po úpravě php scirptu.

<?php
if(isset($_POST['email'])) {

// EDIT THE 2 LINES BELOW AS REQUIRED
$email_to = "vlsvo@seznam.cz";
$email_subject = "Email from WEB";
$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$telephone = $_POST['telephone']; // not required
$comments = $_POST['comments']; // required


// create email headers
$headers = 'From: '.$email_from."\r\n".
$zprava="first_name: $first_name\r\nlast_name: $last_name\r\nemail: $email_from\r\ntelephone: $telephone\r\ncomments: $comments\r\n";
if (isset($_POST['first_name'])&& isset($_POST['last_name']) && isset($_POST['email']) && isset($_POST['telephone']) && isset($_POST['comments']) )
{$result = mail ($email_to, $email_subject, $email_message, $headers );
if ($result)
echo "E-mail byl úspěšně odeslán na vaši adresu s objednávkou.";
else
echo "E-mail nebyl odeslán, nastala chyba.";
} else {
echo "E-mail nebyl odeslán, nebyla vyplněna všechna potřebná pole .<br/>";
echo "Text e-mailu:<br/>".nl2br($zprava);
}
}

?>
Bavíme se stále o http://www.poupatko.wz.cz/kontakt/?p=5? Protože odkazovaný formulář totiž vůbec nevede na (celou dobu probíraný) skript send_form_email.php. Místo toho je směrovaný na /kontakt/?p=5 (což je mimochodem identická stránka).

Opět, nevím odkud jsi to zkopíroval tentokrát, ale co tam sakra dělá toto:
<script type="text/javascript">document.write('<fo');document.write('rm act');document.write('ion="?p=5" me');document.write('thod="po');document.write('st" na');document.write('me="contac');document.write('t-form" enctype="multi');document.write('part/form-data" id="fo');document.write('rm-5">'); (Pozn. pokud se zo nezobrazí tady na fóru správně, tak je tam vložený javascriptový kód, který vytvoří otevírací tag pro formulář.)
Těch blbostí je tam víc. Proč jsou například kolem @ v mailových adresách mezery? Aby se na to nedalo kliknout, když ti někdo chce poslat mail? Někdo tam zase místo toho rve (at) a jiné hovadiny. To už není ochrana proti spammerům, ale proti zákazníkům, kteří chtějí nakoupit.
Děkuji. Už mi to posílá emaily. :-)
Nevím co myslíš "@ v mailových adresách mezery"? Můžeš mi to nějak blíže popsat.
Díky za info.
Když napíšeš "obchod @ nasefirma.cz". Správně je "obchod@nasefirma.cz", tedy bez mezer. Také je dobré z toho udělat odkaz, aby se na to dalo kliknout.
Zkusil jsem dodělat do php scritpu nějaký ošetření proti spamům, ale vypisuje mi to, že nebyly všechny potřebné položky vyplněny. Můžu poprosit o radu v čem je problém ?

<?php
if(isset($_POST['email'])) {

// EDIT THE 2 LINES BELOW AS REQUIRED
$email_to = "vlsvo@seznam.cz";
$email_subject = "Email from WEB";
$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$telephone = $_POST['telephone']; // not required
$comments = $_POST['comments']; // required
$spam = $_POST['spam']; // required

// create email headers
$headers = 'From: '.$email_from."\r\n".
$zprava="first_name: $first_name\r\nlast_name: $last_name\r\nemail: $email_from\r\ntelephone: $telephone\r\ncomments: $comments\r\nspam: $spam\r\n" ;
if (isset($_POST['first_name'])&& isset($_POST['last_name']) && isset($_POST['email']) && isset($_POST['telephone']) && isset($_POST['comments']) && isset($_POST['spam'=="12"]) )
{$result = mail ($email_to, $email_subject, $zprava, $headers );
if ($result)
echo "E-mail byl úspěšně odeslán na vaši adresu s objednávkou.";
else
echo "E-mail nebyl odeslán, nastala chyba.";
} else {
echo "E-mail nebyl odeslán, nebyla vyplněna všechna potřebná pole .<br/>";
echo "Text e-mailu:<br/>".nl2br($zprava);
}
}

?>
Tak takto opravdu nee:
isset($_POST['spam'=="12"])

Pokud ti to připadá v pořádku, zapoměň na jakékoliv další úpravy a začni prosím alespoň se základy PHP (nebo jakéhokoliv jiného programovacího jazyka).
Použil jsem ukázku z jaksedelaweb.

h1>Odesílání emailu</h1>

<?
$predmet = $_POST['predmet'];
$email = $_POST['email'];
$spam = $_POST['spam'];
$zprava = $_POST['zprava'];

if ($predmet!="" and $email!="" and $zprava!="" and $spam=="2")
{
Mail("nekdo@seznam.cz", $predmet, $zprava, "From: " . $email);
echo "<p><strong>Váš e-mail byl úspěšně odeslán</strong>.</p>";
}
else
{
echo "<p>Váš e-mail se <strong>nepodařilo odeslat</strong> pravděpodobně jste nevyplnili všechny údaje, nebo nevíte kolik je 1 + 1.</p>";
}
?>

</body>


Prosím tedy o radu.
Dekuji
Už jsem ti ji dal. Zapoměň na další úpravy a začni prosím alespoň se základy PHP (nebo jakéhokoliv jiného programovacího jazyka). Hned v prvních lekcích by ses dozvěděl, že zápis $_POST[] je pole a hodnota v hranatých závorkách je index v poli (celočíselný, v PHP taky jako řetězec). Správně to tedy má být asi takto:

if(isset($_POST['spam']))
{
if($_POST['spam'] == '12')
{
echo 'Ok';
}
else
{
echo 'Failure';
}
}

Mimochodem, zmíněný postup opravdu nemá s ochranou proti spamu nic společného (protože správná odpověď pro součet je vždycky stejná). Pouze otravuješ uživatele s nutností vyplnit jedno pole navíc. A myslím si, že autor původního kódu to jistě zmínil v doprovodném komentáři.

Na další otázky z úrovně "nikdy jsem neviděl manuál" odpovídat nebudu ;)
Naopak se občas vyplatí přidat do formuláře neviditelné políčko s názvem např. "nickname". Robot ho automaticky vyplní, ale člověk ho nevidí a tedy nechá prázdné.