E-mailový klient pre webmail v PHP – adresár a doplnkové funkcie

26. března 2004

V tomto záverečnom článku o tvorbe webmailu vás oboznámim s doplnkovými funkciami, vymazávaním e-mailov, čítaním odoslaných e-mailov a adresárom.

Posledné súbory tohto webmailu sú nasledovné:

  • delete.php – súbor pre vymazávanie e-mailov
  • delete_address.php – vymazávanie adries z adresára
  • insert_address.php – vkladanie adries do adresára
  • read_sent.php – čítanie odoslaných správ
  • select_address.php – výber viacerých adries prijímateľov e-mailu
  • send_to_address.php – tieto adresy upraví a vloží do formulára na písanie správ (new.php)
  • sent.php – odoslané správy

Vymazávanie e-mailov (delete.php)

Začneme od prvého súboru delete.php, ktorý vymazáva e-mailové správy. Zdrojový kód súboru a funkcie:

<?php
  session_start();
  require „./functions.php“;
  html_header();
  delete_message($id);
  html_footer();
?>
// functions.php
<?php
function delete_message($id)
{
  global $userid;
  $imap = open();
  if(!$imap) return false;
  $num_id = count($id);
  if($num_id>0):
    for($i=0;$i<$num_id;$i++):
      imap_delete($imap,$id[$i]);
    endfor;
    imap_expunge($imap);
    if($num_id==1) echo „<div align=’center‘ class=’middle‘>Správa bola vymazaná.</div>“;
    elseif($num_id>1) echo „<div align=’center‘ class=’middle‘>Správy boli vymazané.</div>“;
    imap_close($imap);
  else:
    echo „<div align=’center‘ class=’warning‘>Žiadna správa nebola vybraná k vymazaniu.</div>“;
  endif;
}
?>

Mazanie e-mailových správ prebieha vo funkcii delete_message() na základe identifikačného čísla správy. Vymazávať sa dá viac správ zároveň, premenná $id je teda pole. Vstup je z výberu správ, kde označíme tie, ktoré chceme vymazať a formulár odošleme. Vo funkcii môžete nájsť tieto IMAP funkcie:

  • int imap_delete(int spojenie, int cislo_spravy); – funkcia označí správu pre zmazanie
  • int imap_expunge(int spojenie); – funkcia vymaže správy označené funkciou imap_delete()
  • int imap_close(int spojenie, int moznosti); – uzatvorí spojenie

Adresár

Adresár je užitočná vec, ktorá nebude chýbať ani v našom webmaile. Ten náš bude schopný pridávať, vymazávať a hlavne zobrazovať a prakticky využívať kontakty. Začneme pekne od začiatku – pridávanie (insert_address.php):

<?php
  session_start();
  require „./functions.php“;
  html_header();
  insert_address_form($_GET);
  html_footer();
?>
// functions.php
function insert_address_form($form)
{
  global $userid;
  $form[‚name‘] = trim($form[‚name‘]);
  $form[‚mail‘] = trim($form[‚mail‘]);
  if(!isset($form[‚sent‘])):
    ?>
    <form action=“insert_address.php“ method=“get“>
    <table cellpadding=“0″ cellspacing=“0″ border=“0″>
    <tr>
      <td><div align=“left“ class=“middle“>Meno&nbsp;</div></td>
      <td><input type=“text“ class=“textinput“ name=“name“ /></td>
    </tr>
    <tr>
      <td><div align=“left“ class=“middle“>Adresa&nbsp;</div></td>
      <td><input type=“text“ class=“textinput“ name=“mail“ value=“<?php echo form[‚mail‘]?$form[‚mail‘]:““?>“ /></td>
    </tr>
    <tr>
      <td colspan=“2″ align=“center“><button type=“submit“ class=“button“>Vložiť</button></td>
    </tr>
    </table>
    <input type=“hidden“ name=“sent“ value=“1″ />
    </form>
    <?php
  else:
    db_connect();
    $query = „insert into address values(“,’$userid‘,’$form[name]‘,’$form[mail]‘)“;
    $result = mysql_query($query);
    if(!$result)
    {
      echo „<div class=’warning‘ align=’center‘>Kontakt sa nepodarilo vložiť.</div>“;
      return;
    }
    echo „<div class=’warning‘ align=’center‘>Kontakt bol úspešne pridaný.</div>“;
  endif;
}

Jednoduchá funkcia, ktorá umožňuje vkladať nové kontakty. Pokiaľ je formulár odoslaný, tak sa údaje spracujú – vložia do databáze. V opačnom prípade sa zobrazí formulár na vkladanie nových kontaktov.

Vymazávanie kontaktov bude prebiehať v súbore delete_address.php:

<?php
  session_start();
  require „./functions.php“;
  html_header();
  delete_address($_GET);
  html_footer();
?>
// functions.php
function delete_address($form)
{
  global $userid;
  $address = trim($form[‚address‘]);
  if(empty($address)):
    db_connect();
    $query = „select * from address where userid = ‚$userid'“;
    $result = mysql_query($query);
    $num_result = mysql_num_rows($result);
    if($num_result>0):
      ?>
      <select name=’address‘ class=’select‘>
        <option value=’false‘>–vyber–</option>
        <?php
        for($i=0;$i<$num_result;$i++):
          $name = mysql_result($result,$i,“name“);
          $address = mysql_result($result,$i,“mail“);
          echo „<option value=’$address‘>$name &lt;“.$address.“&gt;</option>“;
        endfor;
        ?>
      </select>
      &nbsp;
      <button class=“button“ type=“submit“>Vymazať</button>
      <?php
    else:
      echo „<div class=’warning‘ align=’center‘>V adresári nemáte žiadne záznamy.</div>“;
    endif;
  else:
    db_connect();
    $query = „delete from address where userid = ‚$userid‘ and address = ‚$address'“;
    $result = mysql_query($query);
    if(!$result)
    {
      echo „<div class=’warning‘ align=’center‘>Záznam sa nepodarilo vymazať.</div>“;
      return;
    }
    else echo „<div class=’middle‘ align=’center‘>Záznam bol úspešne vymazaný.</div>“;
  endif;
}

Vymazávanie prebieha tiež veľmi jednoducho – kontakt, ktorý chceme vymazať, vyberieme z formulárového prvku select a formulár odošleme. Funkcia ako v predošlom prípade aj v tomto funguje na princípe, že ak sme niečo posielali, tak sa spracuje, pokiaľ nie, tak sa zobrazí formulár.

Adresár slúži hlavne k výberu adries prijímateľov správy. To sa odohráva v súbore select_address.php:

<?php
  session_start();
  require „./functions.php“;
  html_header();
  select_address($_GET);
  html_footer();
?>
// functions.php
function select_address($form)
{
  global $userid;
  $address = trim($form[‚address‘]);
  if(empty($address)):
    db_connect();
    $query = „select * from address where userid = ‚$userid'“;
    $result = mysql_query($query);
    $num_result = mysql_num_rows($result);
    if($num_result>0):
      ?>
      <form action=’send_to_address.php‘ method=’post‘>
      <div class=’middle‘>
      <?php
      for($i=0;$i<$num_result;$i++):
        $name = mysql_result($result,$i,“name“);
        $address = mysql_result($result,$i,“mail“);
        echo „<input type=’checkbox‘ name=’adresy[]‘ value=’$address‘ />$name &lt;“.$address.“&gt; <br />“;
      endfor;
      ?>
      </div>
      <button class=“button“ type=“submit“>Poslať</button>
      </form>
      &nbsp;
      <?php
    else:
      echo „<div class=’warning‘ align=’center‘>V adresári nemáte žiadne záznamy.</div>“;
    endif;
  else:
    db_connect();
    $query = „delete from address where userid = ‚$userid‘ and address = ‚$address'“;
    $result = mysql_query($query);
    if(!$result)
    {
      echo „<div class=’warning‘ align=’center‘>Záznam sa nepodarilo vymazať.</div>“;
      return;
    }
    else echo „<div class=’middle‘ align=’center‘>Záznam bol úspešne vymazaný.</div>“;
  endif;
}

Výber adries sa realizuje zaškrtnutím prvku checkbox. Ten má názov adresy[], čím docielime to, aby na výstupe bolo pole, ktoré bude obsahovať adresy prijímateľov.

Posledný súbor týkajúci sa adresáru je send_to_address.php, ktorý je vizuálne totožný s new.php, kde sa píše nová správa. Tento súbor len vytvára adresu odosielateľa z výberu adries z predošlej stránky select_address.php.

<?php
  session_start();
  require „./functions.php“;
  html_header();
  $to = get_address($_POST[‚adresy‘]);
  show_form($to);
  html_footer();
?>
// functions.php
function get_address($adresy)
{
  $count = count($adresy);
  if($count==0) return “;
  for($i=0;$i<$count;$i++):
    if($i==($count-1)) $to .= $adresy[$i];
    else $to .= $adresy[$i].“,“;
  endfor;
  return $to;
}

Funkcia get_address e-mailové adresy zoradí za sebou, oddelí čiarkou a uloží do premennej $to. Túto potom predá funkcií show_form(), ktorú sme si popísali už v prvom článku.

Čítanie odoslaných mailov (sent.php)

Webmail nám dovolí si čítať aj odoslané e-mailové správy. Tieto sa budú ukladať do databázy. Kód súboru sent.php k zobrazovaniu a čítaniu odoslaných mailov vyzerá nasledovne:

<?php
  session_start();
  require „./functions.php“;
  html_header();
  list_sent($_GET);
  html_footer();
?>
// function.php – funkcia list_sent();
function list_sent($form)
{
  global $userid;
  if(empty($form[‚orderby‘])) $form[‚orderby‘] = „date“;
  db_connect();
  $query = „select * from sent where userid = ‚$userid‘ order by $form[orderby] desc“;
  $result = mysql_query($query);
  $num_result = mysql_num_rows($result);
  if($num_result>0):
    echo „<table cellpadding=’0′ cellspacing=’0′ border=’0′>“;
    echo „<tr>“;
    echo „<td width=’150′><div class=’middle‘ align=’center‘><a href=’sent.php?orderby=to‘ title=’attachment‘>Príjmateľ</a></div></td>“;
    echo „<td width=’200′><div class=’middle‘ align=’center‘><a href=’sent.php?orderby=subject‘ title=’attachment‘>Predmet</a></div></td>“;
    echo „<td width=’100′><div class=’middle‘ align=’center‘><a href=’sent.php?orderby=date‘ title=’attachment‘>Odoslané</a></div></td>“;
    echo „</tr>“;
    for($i=0;$i<$num_result;$i++):
      $id = mysql_result($result,$i,“id“);
      $to = mysql_result($result,$i,“to_address“);
      $subject = mysql_result($result,$i,“subject“);
      $date = mysql_result($result,$i,“date“);
      $date = date(„j.m.Y H:i:s“,$date);
      if($i%2==0) echo „<tr bgcolor=’#CCCCCC‘>“;
      else echo „<tr bgcolor=’#DDDDDD‘>“;
      echo „<td><div class=’middle‘ align=’left‘><a href=’read_sent.php?id=$id‘>&nbsp;$to</a></div></td>“;
      echo „<td><div class=’middle‘ align=’left‘><a href=’read_sent.php?id=$id‘>&nbsp;$subject</a></div></td>“;
      echo „<td><div class=’middle‘ align=’left‘><a href=’read_sent.php?id=$id‘>&nbsp;$date</a></div></td>“;
      echo „</tr>“;
    endfor;
    echo „</table>“;
  else:
    echo „<div class=’warning‘ align=’center‘>V odoslanej pošte nemáte žiadne správy.</div>“;
  endif;
}
// read_sent.php – čítanie odoslaného mailu
<?php
  session_start();
  require „./functions.php“;
  html_header();
  show_sent_message($id);
  html_footer();
?>
// function.php – funkcia show_sent_message();
function show_sent_message($id)
{
  global $userid;
  if(isset($id)):
    db_connect();
    $query = „select * from sent where userid = ‚$userid‘ && id = ‚$id'“;
    $result = mysql_query($query);
    $num_result = mysql_num_rows($result);
    if($num_result>0):
      $id = mysql_result($result,0,“id“);
      $to = mysql_result($result,0,“to_address“);
      $subject = mysql_result($result,0,“subject“);
      $message = mysql_result($result,0,“message“);
      $date = mysql_result($result,0,“date“);
      $date = date(„j.m.Y H:i:s“,$date);
      // zobrazíme správu
      ?>
      <table cellpadding=“0″ cellspacing=“0″ border=“0″ width=“100%“>
      <tr>
        <td width=“25%“><div class=“middle“ align=“left“>Príjmateľ:</div></td>
        <td width=“25%“><div class=“middle“ align=“left“><?php echo $to?></div></td>
        <td></td>
      </tr>
      <tr>
        <td><div class=“middle“ align=“left“>Kópia:</div></td>
        <td><div class=“middle“ align=“left“><?php echo $cc?></div></td>
        <td></td>
      </tr>
      <tr>
        <td><div class=“middle“ align=“left“>Predmet:</div></td>
        <td><div class=“middle“ align=“left“><?php echo $subject?></div></td>
        <td></td>
      </tr>
      <tr>
        <td><div class=“middle“ align=“left“>Dátum:</div></td>
        <td><div class=“middle“ align=“left“><?php echo $date?></div></td>
        <td></td>
      </tr>
      <tr><td height=“15″></td></tr>
      <tr><td colspan=“3″>
      <div class=“text“>
      <?php
      echo nl2br($message);
      ?>
      </div>
      </td></tr>
      </table>
      <?php
    else:
      echo „<div class=’warning‘ align=’center‘>Správa nebola nájdená.</div>“;
    endif;
  else:
    echo „<div class=’warning‘ align=’center‘>Správa nebola nájdená.</div>“;
  endif;
}

Doplnkové funkcie

Na záver ešte nesmú chýbať spomínané doplnkové funkcie:

function address()
{
  global $userid;
  db_connect();
  $query = „select * from accounts where userid = ‚$userid'“;
  $result = mysql_query($query);
  $num_result = mysql_num_rows($result);
  if($num_result>0) $address = mysql_result($result,0,“address“);
  return $address;
}
function name()
{
  global $userid;
  db_connect();
  $query = „select * from accounts where userid = ‚$userid'“;
  $result = mysql_query($query);
  $num_result = mysql_num_rows($result);
  if($num_result>0) $name = mysql_result($result,0,“name“);
  return $name;
}

Funkcia address() vyberie z databázy vašu e-mailovú adresu, ktorá je potrebná pri odosielaní e-mailov. Funkcia name() vyberá z databáze meno, ktoré sa zobrazí prijímateľovi správy.

K dispozícii sú vám zdrojové súbory celého webmailu. Môžete k nemu jednoducho prirobiť prihlasovací systém s registráciou, kde budete môcť vytvoriť viacero e-mailových kônt pre viacerých užívateľov.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *