previousClass Summary Mail_Queue (Previous) (Next) constructor Mail_Queue::Mail_Queuenext

View this page in Last updated: Sun, 18 Oct 2009
English | Brazilian Portuguese | Chinese | Dutch | French | German | Hungarian | Japanese | Polish | Russian | Spanish | Turkish

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 'user@server.com';
$cimzett "user2@server.com";
$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);
}
?>
previousClass Summary Mail_Queue (Previous) (Next) constructor Mail_Queue::Mail_Queuenext

Download Documentation Last updated: Sun, 18 Oct 2009
Do you think that something on this page is wrong? Please file a bug report or add a note.
User Notes:
Note by: kguest
the mime encoding of the attachments plus message and ancillary data stored in the mailbody may push the size of required storage of that which might be used for the raw data that you may be storing elsewhere in the database.

in other words - always make sure the fields in your database are
[more than] large enough for the data going in: if you are storing raw data in a blob and mail_queue is not delivering the constructed mails properly, perhaps you should use a longblob as the datatype for the body field in the mail_queue table.