Maillist v PHP bez použití databáze - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Maillist v PHP bez použití databáze

php_mailing

4. dubna 2001, 00.00 | Nedávno jsme ukázali postup, jak vytvořit vlastní maillist jenž využívá databázi. Dnes si přiblížíme, jak napsat tento skript bez využití databáze.

Nedávno jsem napsal článek o tom, jak vytvořit maillist v PHP. Náš výsledný skript aktivně využíval databáze. Dnes Vám chci popsat stejný skript, avšak s použitím textového souboru na disku. Jelikož princip obou skriptů je shodný, nebudu zde uvádět bližší popis, ale jen citaci okomentovaných upravených zdrojových kódů.

obecne.php
<?
// proměnná $addmess se bude vkládat na konec emailu.
$addmess = "\n\n";
$addmess .= "-------------------------------------------------------\n";
$addmess .= "Pokud jste si tento mail nevyzadali, ci jiz\n";
$addmess .= "nebudete nadale chtit zasilat novinky,\n";
$addmess .= "pak otevrete nize uvedenou\n";
$addmess .= "stranku a budete automaticky odhlaseni.\n";
$addmess .= "http://www.server.cz/maillist.php?akce=del&mail=";

// administrátorův email
$admin = "";

// pomocná proměnná
$je_na_seznamu = 0;

// proměnná s hlášením
$error = '';

// proměnná $file obsahuje cestu k souboru se seznamem emailů.
$file = "./maillist";

// funkce zkontroluje zda proměnná $mail obsahuje stejnou
// emailovou adresou jaká je funkci předána jako parametr.
// Pokud jsou obě adresy schodné, vrátí funkce true. Pokud
// ne vrátí false.
function testmailu($mail_ze_souboru)
{
   global $mail;
   if ($mail_ze_souboru == $mail)
      return true;
   else
      return false;
}
?>

maillist.php
<?
// soubor obsahuje důležité proměnné a funkce.
include "./obecne.php";

// načtení souboru se seznamem do proměnné $data.
// Funkce File vytvoří ze souboru pole. Pro každý
// řádek souboru vyvoří v poli jeden index.
if ($akce)
   $data = File($file);

// pokud je akce add a email má platný formát, ověříme zda se emailová
// adresa v souboru ještě nenachází. Pokud ne, zapíšeme ji, pokud ano,
// zobrazíme uživateli, že email je již přihlášen.
if ($akce == "add"
    && eregi("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$",$mail)):
   for ($i=0; $i<count($data); $i++)
   {
       if (testmailu(chop($data[$i]))):
          // mail na seznamu je. Ukoncime cyklus
          $je_na_seznamu = 1;
          break;
       endif;
   }

   if ($je_na_seznamu == 1):
       $error = "Mail již na seznamu je !!!";
   else:
       // email na seznamu nebyl, proto jej vlozime do souboru
       $zapis = $mail . "\n";
       $fp = Fopen($file,"a");
       FPutS($fp,$zapis);
       FClose($fp);

       $mess = "Vas email byl pridan na seznam odberatelu.\n\n";
       $mess = $mess . $addmess . $mail;
       mail ($mail,"Pridani na seznam",$mess,"From: ".$admin);
       $error = "Mail byl přidán do seznamu !!!";
   endif;

// pokud je akce del a existuje proměnná $mail vymažeme všechny řádky,
// které obsahují emailovou adresu z proměnné $mail. Pokud takovýto
// email v souboru neexsituje vypíšeme hlášení, jinak se na email
// odešle potvrzení o odhlášení.

elseif($akce == "del" && $mail!=""):

   // proměnná pro obsah nového maillistu
   $new_data = '';

   // pro každý mail v souboru provedeme kontrolu
   for ($i=0; $i<count($data); $i++)
   {
       $buffer = chop($data[$i]);
       if (testmailu($buffer)):
          // mail na seznamu je. Do pole $new_data
          // tento email nevložíme
          $je_na_seznamu = 1;
       else:
          // pokud se mail k vymazání neschoduje
          // s aktuálním mailem v souboru, přidáme jej
          // do $new_data
          $new_data .= $buffer . "\n";
       endif;
   }

   if ($je_na_seznamu == 1):
      // pokud byl email nalezen, smažeme soubor maillist
      // a vložíme do něj obsah $new_data
      $fp = Fopen($file,"w");
      FPutS($fp,$new_data);
      FClose($fp);

      $mess = "Vas email byl smazan ze seznamu odberatelu.\n\n";
      mail($mail,"Odhlaseni",$mess,"From: ".$admin);
      $error = "Mail byl vymazán ze seznamu !!!";
   else:
      // pokud email na seznamu není zobrazíme chybové hlášení.
      $error = "Mail není na seznamu !!!";
   endif;

else:
// nejedá-li se o žádnou akci
   $error = "Zadejte svůj email";
endif;

// zobrazíme html stránku
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
<HTML>
<HEAD><TITLE>Maillist</TITLE></HEAD>
<BODY>
<?
   echo $error;
   echo "<BR>\n";
?>
<FORM METHOD="POST" ACTION="maillist.php">
<INPUT TYPE="HIDDEN" NAME="akce" VALUE="add">
<INPUT TYPE="TEXT" NAME="mail">
<INPUT TYPE="SUBMIT" VALUE="ZAPSAT NA SEZNAM">
</FORM>

</BODY>
</HTML>

listadmin.php
<?
// soubor obsahuje důležité proměnné a funkce.
include "./obecne.php";

// načtení souboru se seznamem do proměnné $data.
// Funkce File vytvoří ze souboru pole. Pro každý
// řádek souboru vyvoří v poli jeden index.
$data = File($file);

// stejné jako ve skriptu maillist.php, ale neodesílá email
if ($akce == "add"
    && eregi("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$",$mail)):
   for ($i=0; $i<count($data); $i++)
   {
       if (testmailu(chop($data[$i]))):
          // mail na seznamu je. Ukoncime cyklus
          $je_na_seznamu = 1;
          break;
       endif;
   }

   if ($je_na_seznamu == 1):
       $error = "Mail již na seznamu je !!!";
   else:
       // email na seznamu nebyl, proto jej vlozime do souboru
       $zapis = $mail . "\n";
       $fp = Fopen($file,"a");
       FPutS($fp,$zapis);
       FClose($fp);

       $error = "Mail byl přidán do seznamu !!!";
       $data = File($file); // načte se nový soubor s adresami

   endif;
endif;

// stejné jako ve skriptu maillist.php, ale neodesílá email
if($akce == "del" && $mail!=""):
   // proměnná pro obsah nového maillistu
   $new_data = '';

   // pro každý mail v souboru provedeme kontrolu
   for ($i=0; $i<count($data); $i++)
   {
       $buffer = chop($data[$i]);
       if (testmailu($buffer)):
          // mail na seznamu je. Do pole $new_data
          // tento email nevložíme
          $je_na_seznamu = 1;
       else:
          // pokud se mail k vymazání neschoduje
          // s aktuálním mailem v souboru, přidáme jej
          // do $new_data
          $new_data .= $buffer . "\n";
       endif;
   }

   if ($je_na_seznamu == 1):
      // pokud byl email nalezen, smažeme soubor maillist
      // a vložíme do něj obsah $new_data
      $fp = Fopen($file,"w");
      FPutS($fp,$new_data);
      FClose($fp);

      $error = "Mail byl vymazán ze seznamu !!!";
      $data = File($file); // načte se nový seznam adres

   else:
      // pokud email na seznamu není zobrazíme chybové hlášení.
      $error = "Mail není na seznamu !!!";
   endif;
endif;

// pokud byla zadáná zpráva, bude se odesílat newsletter
if($akce == "send" && $message!=""):

   // odstraní se zpětné lomítka, které PHP vytvoří
   $message = stripslashes($message);

   // na každou adresu se odešle email
   for ($i=0; $i<count($data); $i++)
   {
      $buff = chop($data[$i]);
      $mess = $message . $addmess . $buff;

      // konverze češtiny z kódování win do iso
      $mess = StrTr($mess,"\x8A\x8D\x8E\x9A\x9D\x9E","\xA9\xAB\xAE\xB9\xBB\xBE");

      mail ($buff,"Newsletter",$mess,"From: ".$admin);
   }
   
   $error = "Newsletter odeslán !!!";
endif;

// zobrazíme html stránku s formuláři pro přidání/odebrání emailu
// a formulář pro zadání textu zprávy. Pokud v souboru není
// žádný záznam, zobrazí se jen formulář pro přidání emailu

Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>
<HTML>
<HEAD><TITLE>Maillist - administrace</TITLE></HEAD>
<BODY>
<?
echo $error;
?>
<BR>
<FORM METHOD="POST" ACTION="listadmin.php">
<INPUT TYPE="HIDDEN" NAME="akce" VALUE="add">
<INPUT TYPE="TEXT" NAME="mail">
<INPUT TYPE="SUBMIT" VALUE="ZAPSAT NA SEZNAM">
</FORM>
<BR>
<?
   // pokud je alespoň jedna adresa na seznamu zobrazíme formulář pro
   // smazání emailu a pole pro odesílání zprávy

   if (count($data) > 0):
      ?>
      Přihlášených uživatelů: <? echo count($data); ?><BR>
      <FORM METHOD="POST" ACTION="listadmin.php">
      <INPUT TYPE="HIDDEN" NAME="akce" VALUE="del">
      <SELECT NAME="mail">

      <?
      // zobrazení emailů v selectu
      for ($i=0; $i<count($data); $i++)
      {
         $buff = chop($data[$i]);
         echo "<OPTION VALUE=\"".$buff."\">".$buff."</OPTION>\n";
      }
      ?>

      </SELECT>
      <INPUT TYPE="SUBMIT" VALUE="SMAZAT ZE SEZNAMU">
      </FORM>
      <BR>Zpráva:<BR>
      <FORM METHOD="POST" ACTION="listadmin.php">
      <INPUT TYPE="HIDDEN" NAME="akce" VALUE="send">
      <TEXTAREA NAME="message" COLS="60" ROWS="10"></TEXTAREA>
      <BR>
      <INPUT TYPE="SUBMIT" VALUE="ODESLAT NEWSLETTER">
      </FORM>

      <?
   // jinak se vypíše hlášení
   else:
      echo "Nikdo není na seznamu !!!";
   endif;
?>

</BODY>
</HTML>

Jak sami můžete vidět, změny oproti skriptům využívající databázi nejsou příliš velké - spočívají ve výměně SQL dotazů za části jednoduchého PHP kódu.

Download

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: