php_mailing
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)