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);
}
?>
Mail_Queue - alaposztály e-mail várólista kezeléséhez. (Previous) Mail_Queue konstruktor (Next)
Last updated: Tue, 21 Oct 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: santiago@vuelocreativo.com
Where´s the function get_mail_queue_row???
Note by: tbauserman@clickedstudios.com
In the example for send_message.php It doesn't delete the message from the queue. With the example it would keep sending the queued messages over and over again. I had to add change the sendMail function in Queue.php
from this
if (!PEAR::isError($sent) && $sent && $set_as_sent) {
$this->container->setAsSent($mail);
}

to this
if (!PEAR::isError($sent) && $sent && $set_as_sent) {
$this->container->setAsSent($mail);
if($mail->isDeleteAfterSend()) {
$this->deleteMail($mail->getId());
}
}
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.