Mailform

renni 13.06.04 18:17

Mailin lähetys formilla

 Tekstiversio  Arvo: 5 (14 ääntä)  Äänestä: +  -
Formi ja käsittelijä eri tiedostoissa, lisäksi kolmannessa tiedostossa
lista kelvollisista vastaanottajista. Näin saadaan formi toimimaan
millä tahansa palvelimella ilman PHP-tukeakin, kunhan käsittelijä
on jossain käytettävissä. Vastaanottajien kätkeminen tiedostoon
estää osoitteiden joutumisen vääriin käsiin ja lomakkeen väärinkäytön.
Tämä on muuten ihka ensimmäinen PHP-koodini.


mailform.php
---- begin ----
<?php # mailform.php - Form mailer by Renni

# muokkaa tähän conffitiedoston sijainti
$config_file = "config/mailform.cfg"

$errors = false;
$errmsg = "";


# käpistellään lomakkeen kentät
@extract($_POST);
$name    = stripslashes($name);
$email   = stripslashes($email);
$subject = stripslashes($subject);
$message = stripslashes($message);
$userid  = stripslashes($userid);

# tarkistetaan että käyttäjä on täyttänyt kaiken tarvittavan,
# tämän voisi tehdä javascriptillä lomakkeellakin
if (empty($name)) {
    $errors = true;
    $errmsg .= "Nimi puuttuu.<br/>";
}

if (empty($email)) {
    $errors = true;
    $errmsg .= "Email puuttuu.<br/>";
}

if (empty($subject)) {
    $errors = true;
    $errmsg .= "Otsikko puuttuu.<br/>";
}

if (empty($message)) {
    $errors = true;
    $errmsg .= "Viesti puuttuu.<br/>";
}


# luetaan mahdolliset vastaanottajat configista
if ($userlist = @file($config_file)) {
    foreach ($userlist as $line) {
       if ( (substr(trim($line)01) != '#') &&  # skipataan kommentoidut rivit
            (substr_count($line, '=') >= 1) )       # oltava asetusrivi
       {
           $pos = strpos($line, '=');
           $users[trim(substr($line, 0, $pos))] = trim(substr($line, $pos+1));
       }
    }

    if ( array_key_exists($userid, $users) ) {
        $to = $users[$userid];
    }
    else {
        $errors = true;
        $errmsg .= "Vastaanottajan tunnus '$userid' väärä.<br/>\n";
    }
}
else {
    $errors = true;
    $errmsg = "Asetustiedoston luku epäonnistui.<br/>\n";
}


# jos kaikki menny ok niin lähetetäänpä viesti
if ( ! $errors ) {
    # tehdäänpä nätit headerit
    $headers = "From: $name <$email>";
    $headers .= "\nMIME-Version: 1.0";
    $headers .= "\nX-Mailer: PHP/" . phpversion();
    $headers .= "\nContent-type: text/plain; charset=\"iso-8859-15\"\n";

    $errors = ! mail($to, $subject, $message, $headers);
}


# näytetään mahdolliset virheet tai ohjataan uudelle sivulle
if ( $errors ) {
    //  header(location:$errpage?message=$errmsg);

    echo("<html><head><title>virhe</title></head>\n");
    echo("<body>\n<b>Lähetys epäonnistui!</b><br/>\n");
    echo($errmsg);
    echo("\n</body></html>");
}
else {
    header("location:$redir");
}
?>
---- end ----

mailform.html
---- begin ----
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Mailform</title>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
</head>

<body>

<form action="mailform.php" method="post">
<div>
<!-- Aseta tähän vastaanottajan tunnus mailform.cfg tiedostosta -->
<!-- Tämä voisi olla vaikkapa selectinä lomakkeellakin -->
<input type="hidden" name="userid" value="renni" />

<!-- Aseta tähän url-osoite johon mennään onnistuneen lähetyksen jälkeen -->
<input type="hidden" name="redir" value="kiitos.html" />
</div>

<!-- Tässä käyttäjälle näkyvä lomake, muokkaa mieleiseksi. -->
<table>
<tr>
<td>Nimesi: </td>
<td><input type="text" name="name" size="20" maxlength="20" /></td>
</tr><tr>
<td>Sähköpostisi: </td>
<td><input type="text" name="email" size="30" maxlength="30" /></td>
</tr><tr>
<td>Aihe: </td>
<td><input type="text" name="subject" size="30" maxlength="30" /></td>
</tr><tr>
<td valign="top">Viesti: </td>
<td><textarea name="message" cols="50" rows="10"></textarea></td>
</tr><tr>
<td>&nbsp;</td>
<td><input type="submit" name="send" value="Lähetä" /></td>
</tr>
</table>
</form>

</body>
</html>
---- end ----


mailform.cfg
---- begin ----
# Mailformin vastaanottajat, muokkaa tänne mahdolliset vastaanottajat

# ensimmäinen
renni = renni@jossakin.net

# toinen
jokumuu = joku@muu.net
---- end ----
 

TETRIS 19:09 13.6.04 
Täytyy sanoa, että todella hyvältä vaikutti jos tämä on ensimmäinen vinkkisi. Koodikin näytti äkki vilkaisulla hyvältä. PHP osuus oli oikein hyvin sisennetty. Way to go man...
Roland 13:06 21.6.04 
Hei tähän on tosi kätevä tämä pelastaa sivuni, kun mail komento pystyy oottamaan vain 5 parametria vastaan ja tämä näyttää siltä, että tällä saa enemmänkin...
renni 17:12 21.6.04 
Korjasinpas viestin tyypiksi text/plain. Tällaisessa mitään html-muotoiluja tarvita. :)

TETRIS: Vaikka tämä siis on ensimmäinen PHP-koodini, niin toki olen aika paljon koodailu monilla muilla kielillä. Oppinut arvostamaan koodin kunnollista muotoilua vuosien saatossa.
Kaichu 17:13 17.7.04 
Tää on helvettin hyvä ja toimiva scripti kiitos renni
Inestical 19:20 6.1.05 
Tää on Kyl ihan nice :P mutta (siellä on aina mutta..):
Warning: Failed to Connect in mailform.php on line 103
Oon yrittäny korjata tota, mut mitään ei oo tapahtunu :(
editoitu: 23:03 6.1.05
Inestical 21:57 6.1.05 
nonii, nyt se lähti. Mul ei ollu SMTP servu kunnossa :-), mut ny on
editoitu: 04:05 8.1.05
Inestical 04:01 8.1.05 
Noni, ny se ei enää toimi, mut plussa kuitenkin
kinnupa1 02:10 29.1.05 
Toi toimii ja on muuten hyvä mut siihen sais laittaa loppuun sellasen toiminnon että palautteen lähettäjä voi valita haluaako hän vastauksen vai ei. Ja et se näkyis saapuneessa sähköpostissa haluaako lähettäjä vastauksen vai ei.
verigrei 08:02 23.2.05 
En tiedä paljoakaan php:stä, jos joku voisi kertoo että miten toi "<!-- Aseta tähän vastaanottajan tunnus mailform.cfg tiedostosta -->" tunnus pitää kirjottaa? jos kirjoitan sen pelkkänä tekstinä, se ei toimi. Ja sitten pitääkö palvelimen ylläpitäjän antaa sille "mailform.cfg":lle jotkut erikoisoikeudet?

Litrahajua 15:19 18.3.05 
Olipas kätevä apu tämmoiselle PHP-ummikolle!!!
Muokkasin tuosta version jossa on viiden kysymyksen kysely, siis viisi tekstilaatikkoa. Samalla jouduin tai pääsin kurkistamaan PHP-kielen ihmeelliseen maailmaan.

Nimimerkille kinnupa: lomakkeeseen voi laittaa mitä kenttiä tahansa! PHP-fileessä muuttuja $message pitää vain sitten parsia kokoon eri kentistä. Väliin voi laittaa esim. rivinvaihtoja. Esim. jos formissa on kaksi tekstikenttää nimeltään textb1 ja textb2 niin rivi voi näyttää esim. tältä:
$message .= "Laatikko 1: ".$textb1."\n\n"."Laatikko 2: ".$textb2;

Nimimerkille verigrei: vastaanottajan tunnus kirjoitetaan riville
<input type="hidden" name="userid" value="renni" />, tuossahan on tunnus "renni". Vastaava rivi cfg-fileessä
# ensimmäinen
renni = renni@jossakin.net

Käsnääkkö? Vääntääkseni rautalangasta, itse laitoin
<input type="hidden" name="userid" value="mulle" /> ja cfg-fileeseen
mulle = admin@tunkkari.tk
lahtis 01:14 10.5.05 
mut lähettöökö tää myös tohon toiseen osoiteeseen?
jonezy 18:20 9.3.06 
mulla ei jostain kumman syystä suostu pelittää...
pitääkö mun coffata php.ini:ä

ClarkConnectin boksissa pyörii Apache 2 ja PHP 4.3.11.
SUFC 22:28 4.8.06 
Koodi toimii muuten ihan ok ja ilman virheilmoituksia, mutta viesti ei koskaan pääse perille. Voisiko joku kertoa missä kohdin tuossa koodissa määritetään SMTP-palvelin? Kiitos!
SUFC 22:33 4.8.06 
Sain viestit perille!
Kristal 13:25 6.8.06 
Lähetys epäonnistui!
Asetustiedoston luku epäonnistui.

tuollaista mulla pukkaa, eli missä vika?

mutta muuten on erittäin hyvä koodi, tällaista sitä on etsittykin!
renni 16:31 22.8.06 
Tätä pitäisi näemmä vieläkin viilata vähän.

Kristal: mailform.cfg on tässä esimerkissä piilotettu config/ hakemistoon (jonne ei tietenkään pääsyä webbipalvelimella). Sen voi sijoittaa minne itse haluaa muokkaamalla tuota riviä jossa tiedosto avataan. Tarkoitushan on että tuota tiedostoa ei pääse kukaan muu lukemaan.

SUFC: php.ini:ssä on nuo asetettu.
editoitu: 14:35 20.10.06
Z1ppaaja 14:35 20.10.06 
Parse error: parse error, unexpected T_VARIABLE in /home/*******/public_html/mailform.php on line 6

Tällästä errorii pukkaa mulle.
php.ini tarkastanu et ei pitäis minkää estää.
Apache version 1.3.36 ja PHP version 4.3.11
Wide 15:42 6.11.06 
# muokkaa tähän conffitiedoston sijainti
$config_file = "config/mailform.cfg" <-- puolipiste puuttuu tästä

Tuon puolipisteen puuttumisen takia antaa sitten herjaa tuosta kutosrivistä.
Z1ppaaja 09:44 15.11.06 
No juu...
Ois tollanen nyt pitäny huomata, mut vissii liian väsyneenä tuli sit laitettua tota. :)
editoitu: 23:59 2.2.07
sariia 23:35 2.2.07 
"Näin saadaan formi toimimaan millä tahansa palvelimella ilman PHP-tukeakin, kunhan käsittelijä on jossain käytettävissä."

Mitä tämä tarkoittaa? Lähinnä tuo käsittelijä. Palvelimella, johon ois ajatus lomake heittää, ei ole php-tukea.

*edit* esim. tätäkö? http://www.sivuille.net/postittaja/ohje.jsp
Noh, jos näin on niin, mistä näista ko. palveluntarjoajista tietää, että mikä on suht luotettava? Tarkoitan sitä, että ei lopeta toimintaansa heti ens viikolla eikä ens kuussakaan. - Ei mistään?