Tutorial

Tutorial – Bevezetés a Mail_Queue használatába

A Mail_Queue használata egy egyszerű példán keresztül

A példában az e-mailek tárolásához egy adatbázis-alapú konténert használunk, MySQL adatbázissal. Néhány táblát létre kell hoznunk a kiküldendő levelek tárolásához:

mysql.sql

CREATE TABLE mail_queue (
  id bigint(20) NOT NULL default '0',
  create_time datetime NOT NULL default '0000-00-00 00:00:00',
  time_to_send datetime NOT NULL default '0000-00-00 00:00:00',
  sent_time datetime default NULL,
  id_user bigint(20) NOT NULL default '0',
  ip varchar(20) NOT NULL default 'unknown',
  sender varchar(50) NOT NULL default '',
  recipient varchar(50) NOT NULL default '',
  headers text NOT NULL,
  body longtext NOT NULL,
  try_sent tinyint(4) NOT NULL default '0',
  delete_after_send tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (id),
  KEY id (id),
  KEY time_to_send (time_to_send),
  KEY id_user (id_user)
);

Elsőként néhány opciót kell definiálnunk. Mivel ezekre a beállításokra kétszer van szükség (egyszer a levelek hozzáadásánál, egyszer a levelek kiküldésénél), jó ötlet őket egy közös konfigurációs állományban tárolni. Adjuk neki például a config.php fájlnevet!

config.php

<?php

require_once "Mail/Queue.php";

// az &uuml;zenetek t&aacute;rol&aacute;s&aacute;val kapcsolatos be&aacute;ll&iacute;t&aacute;sok
// a type a haszn&aacute;lt kont&eacute;ner t&iacute;pusa, jelenleg db &eacute;s mdb &aacute;ll rendelkez&eacute;sre
$db_options['type']       = 'db';
// a k&ouml;vetkez&#337; be&aacute;ll&iacute;t&aacute;sok pedig a v&aacute;lasztott kont&eacute;nerre vonatkoznak
// a db kont&eacute;ner n&eacute;h&aacute;ny opci&oacute;ja:
$db_options['dsn']        = 'mysql://felhaszn&aacute;l&oacute;n&eacute;v:jelsz&oacute;@hoszt/adatb&aacute;zis';
$db_options['mail_table'] = 'mail_queue';

// a k&ouml;vetkez&#337; konfigur&aacute;ci&oacute;s be&aacute;ll&iacute;t&aacute;sok a levelek kik&uuml;ld&eacute;s&eacute;re vonatkoznak
// ezek tulajdonk&eacute;ppen a Mail oszt&aacute;ly be&aacute;ll&iacute;t&aacute;sai, a Mail::factory() f&uuml;ggv&eacute;ny ig&eacute;nyli &#337;ket
$mail_options['driver']   = 'smtp';
$mail_options['host']     = 'smtp_szerver_cime.com';
$mail_options['port']     = 25;
$mail_options['localhost'] = 'localhost'// opcion&aacute;lis Mail_smtp param&eacute;ter
$mail_options['auth']     = false;
$mail_options['username'] = '';
$mail_options['password'] = '';

?>

Ezzel végeztünk a konfigurálással, próbáljuk is ki. Össze kell állítanunk egy e-mail üzenetet, majd hozzáadni a várakozósorhoz:

add_message.php

<?php
include './config.php';
/* a konfigur&aacute;ci&oacute;s &aacute;llom&aacute;nyban t&aacute;rolt db_options &eacute;s mail_options be&aacute;ll&iacute;t&aacute;sokat haszn&aacute;ljuk */
$mail_queue =& new Mail_Queue($db_options$mail_options);


$felado '[email protected]';
$cimzett "[email protected]";
$uzenet 'Hello! Ez egy teszt &uuml;zenet!! :)';

$fejlecek = array( 'From'    => $felado,
                   
'To'      => $cimzett,
                   
'Subject' => 'a teszt &uuml;zenet t&aacute;rgya' );

/* a Mail_MIME oszt&aacute;lyt haszn&aacute;ljuk &eacute;rv&eacute;nyes e-mail tartalom el&#337;&aacute;ll&iacute;t&aacute;s&aacute;hoz */
$mime =& new Mail_mime();
$mime->setTXTBody($uzenet);
$tartalom $mime->get();
$fejlecek $mime->headers($fejlecek);


/* Hozz&aacute;adjuk a levelet a v&aacute;rakoz&aacute;si sorhoz */
$mail_queue->put$felado$cimzett$fejlecek$tartalom );

?>

Ez volt az e-mail-ek egyszerű hozzáadásának módja. Sokkal összetettebb lehetőségeink is vannak, bővebb információ erről a put() függvény leírásában érhető el. Most ki kell küldenünk az üzeneteket. Ez többnyire egy cron job segítségével működik, ami bizonyos időközönként lefut a háttérben és meghívja az alábbi (példa) szkriptünket:

send_messages.php

<?php
include './config.php';

/* Mennyi e-mailt szeretn&eacute;nk kik&uuml;ldeni a szkript lefut&aacute;sakor */
$max 50;

/* ism&eacute;t a konfigur&aacute;ci&oacute;s f&aacute;jlunkban be&aacute;ll&iacute;tott db_options &eacute;s mail_options
be&aacute;ll&iacute;t&aacute;sokat haszn&aacute;ljuk */
$mail_queue =& new Mail_Queue($db_options$mail_options);

/* az &uuml;zenetek t&eacute;nyleges kik&uuml;ld&eacute;se */
$mail_queue->sendMailsInQueue($max);
?>

Ennyi az egész. Hívjuk meg a fenti szkriptet újra és újra bizonyos időközönként, így a várakozólistában lévő e-mailek sorra kiküldődnek majd.

A Mail_Queue csomag v1.1-es verziójától kezdődően a preload() metódus nem tölti be az összes e-mailt a memóriába, csak néhányat minden alkalommal. Ha a puffer kiürül, újból automatikusan megtöltésre kerül. A puffer méretét az új setBufferSize() metódus segítségével állíthatjuk be.

Az eltárolt e-maileket egyesével is kiküldhetjük. A következő szkript erre mutat példát:

uzenetek_kikuldese_egyesevel.php

<?php
// &aacute;ll&iacute;tsuk be a bels&#337; pufferm&eacute;retet a mem&oacute;ria-er&#337;forr&aacute;sainknak
// megfelel&#337;en (a sz&aacute;m azt adja meg, hogy egyid&#337;ben maximum
// mennyi &uuml;zenet lehet a mem&oacute;ri&aacute;ban a puffer&uuml;nkben).

$mail_queue->setBufferSize(20);

// v&aacute;rakoz&aacute;si sor m&eacute;ret&eacute;nek be&aacute;ll&iacute;t&aacute;sa (a k&uuml;ldend&#337; levelek sz&aacute;ma)
$korlat 50;
$mail_queue->setOption($korlat);

// egy ciklussal v&eacute;gigmegy&uuml;nk az elt&aacute;rolt e-maileken
// &eacute;s kik&uuml;ldj&uuml;k &#337;ket
while ($mail $mail_queue->get()) {
    
$result $mail_queue->sendMail($mail);
}
?>