Maillist v PHP - 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

php_mailing

19. března 2001, 00.00 | Dnes si ukážeme jak v PHP vytvořit skript pro rozesílání novinek přihlášeným uživatelům. Chcete posílat annonce na nové články, či přehled počasí? Jednoduchý systém vám to hravě umožní!

Dnes se vám budu snažit přiblížit postup, jehož pomocí budete schopni přidat na své stránky MAILLIST – rozesílání informací o novinkách, změnách vašich stránek či k rozesílání jiných důležitých informací.
Princip služby spočívá v tom, že má návštěvník webové prezentace možnost do formuláře zobrazeného na www stránce zadat svůj email a tím jej přidat do seznamu. Webmaster nebo administrátor stránek pak má přehled o všech přihlášených emailových adresách a může na ně rozeslat potřebné informace.

Nejdříve si proberem jaké požadavky bude náš maillist mít. A zároveň si uvedeme funkce, které aplikace bude umět.

  • Skript je psán v PHP a vyžaduje podporu MySQL databáze. Verzi, jež nevyžaduje podporu databáze, vám popíši někdy jindy - princip je ale stejný.
  • Přihlašování a odhlašování uživatelů bude naprosto automatické. Při přihlášení/odhlášení uživatel dostane emailem zprávu o tom, zda se přihlášení/odhlášení podařilo. Skript bude kontrolovat, zda přidávaná emailová adresa existuje. Pokud ano, tak ji již do databáze podruhé nevloží.
  • Administrátor má přehled o počtu emailových adres. Má možnost rozeslat zprávu na všechny emailové adresy na seznamu, dále pak bude mít možnost seznam editovat - mazat nebo přidávat emailové adresy.

Nejdříve uvedu strukturu databázové tabulky, kterou si nazveme maillist. Tabulka bude mít dva sloupečky. První bude id a slouží ke snadnější manipulaci se záznamy. Druhý sloupec je email a bud v něm uložena samotná emailová adresa.

  • id int unsigned not null auto_increment primary key
  • email varchar(255) not null

Nyní uvedu citaci zdrojových kódů skriptů obecne.php, maillist.php a listadmin.php. Do skriptu maillist.php a listadmin.php je includovaný soubor obecne.php. Ten obsahuje funkci pro připojení k databázi a několik proměnných. Části kódů jsou okomentovány.

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=";

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

// do funkcí mysql_connect a mysql_select_db vyplňte vámi používané hodnoty

@$conn = mysql_connect("server","user","heslo") or die('Selhání databáze');
@$sql = mysql_select_db("databaze");
?>

maillist.php
<?
// funce připojí skript k databázovému serveru a definuje proměnné

include "./obecne.php";

// pokud je akce add a email má platný formát, ověříme v databázi,
// zda už náhodou tahle adresa na seznamu není, pokud ano, zobrazíme
// hlášení, že email je již přihlášen, pokud ne, zapíšeme jej do
// seznamu a odešleme na něj email s potvrzením o přihlášení.

if ($akce == "add" && 
   eregi("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$",$mail)):
   @$v = mysql_query("SELECT id FROM maillist WHERE email LIKE '$mail'");
   @$p = mysql_num_rows($v);

   if ($p > 0):
      $error = "Mail již na seznamu je !!!";
   else:
      @$v = mysql_query("INSERT INTO maillist VALUES('','$mail')");
      $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 databázi neexistuje, vypíšeme hlášení, jinak se na email
// odešle potvrzení o odhlášení.

elseif($akce == "del" && $mail!=""):
   @$v = mysql_query("DELETE FROM maillist WHERE email LIKE '".$mail."'");
   @$p = mysql_affected_rows();

   if ($p > 0):
      $mess = "Vas email byl smazan ze seznamu odberatelu.\n\n";
      mail($mail,"Odhlaseni",$mess,"From: ".$admin);
      $error = "Mail byl vymazán ze seznamu !!!";
   else:
      $error = "Mail není na seznamu !!!";
   endif;

else:
   $error = "Zadejte svůj email";
endif;

mysql_close($conn); // zavřeme spojení s databází

// zobrazíme html stránku
?>
<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
<?
// funce připojí skript k databázovému serveru a definuje proměnné

include "./obecne.php";

$error = '';

// obdobné jako ve skriptu maillist.php, ale neodesílá email
if ($akce == "add" && 
   eregi("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}\$",$mail)):
   @$v = mysql_query("SELECT id FROM maillist WHERE email LIKE '$mail'");
   @$p = mysql_num_rows($v);
   if ($p > 0):
      $error = "Mail již na seznamu je !!!";
   else:
      @$v = mysql_query("INSERT INTO maillist VALUES('','$mail')");
      $error = "Mail byl přidán do seznamu !!!";
   endif;
endif;

// obdobné jako ve skriptu maillist.php, ale neodesílá email
if($akce == "del" && $mail!=""):
   $v = mysql_query("DELETE FROM maillist WHERE email LIKE '".$mail."'");
   $p = mysql_affected_rows();

   if ($p == 1):
      $error = "Mail byl vymazán ze seznamu !!!";
   else:
      $error = "Mail není na seznamu !!!";
   endif;
endif;

// pokud byla zadáná zpráva, bude se odesílat newsletter
if($akce == "send" && $message!=""):
   // select všech emailů v seznamu
   @$v = mysql_query("SELECT email FROM maillist");

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

   // na každou adresu se odešle email
   while($z = mysql_fetch_row($v))
   {
      $mess = $message . $addmess . $z[0];
      mail ($z[0],"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 databázi není
// žádný záznam, zobrazí se jen formulář pro přidání emailu
?>
<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>
<?
   // select všech emailových adres
   @$v = mysql_query("SELECT email FROM maillist");

   // pokud je alespoň jedna adresa v databázi, zobrazíme formulář pro
   // smazání emailu a pole pro odesílání zprávy

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

      <?
      // zobrazení emailů v selectu
      while ($z = mysql_fetch_row($v))
      {
         echo "<OPTION VALUE=\"".$z[0]."\">".$z[0]."</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;

   mysql_close($conn); // zavřeme spojení s databází
?>

</BODY>
</HTML>

Takže teď máme již funkční skripty maillistu. Pozastavím se u administrace, která je obsažena ve skriptu listadmin.php. Zde může administrátor přidávat a mazat emaily a může posílat emaily všem přihlášeným (narozdíl od přidávání/mazání samotným uživatelem se ani v jednom případě neodesílá mail s upozorněním). Pokud v databázi nebude ani jedna přihlášená emailová adresa, administrátor bude moci pouze přidávat emailové adresy.

Je jen na vás, jak si tento příklad upravíte. Určitě by nebylo od věci chránit administrační část heslem, které bude znát samozřejmě jen administrátor - tuto autorizaci jsem pro jednoduchost vypustil - ale pro ochranu těch, kteří se přihlásili, je nezbytná. Dalších možností je nepřeberné množství, např. odesílání příloh, HTML mailů, uživatel si může definovat oblast novinek které chce dostávat (například: pouze informace o nových článcích, či jen předpověď počasí, nebo oboje). Administrátor pak při psaní zprávy označí její zaměření a rozešle se jen těm, kteří si daný okruh zpráv objednali. Fantazii a potřebám se meze nekladou...

Download

Poznámka: Skript je opraven. Byla objevena malá chybička v odesílání emailu. (9.5.2001)

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

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

 

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

Uživatelské jméno:

Heslo: