Tutorial

Tutorial – Un tutorial pour Mail_Queue

Utilisation de Mail_Queue avec un exemple simple

Nous utilisons pour cet exemple le db-container et une base de donnée mysql. Vous devez créer quelques tables dans cette base de donnée pour stocker les messages :

mysql.sql

#
# `mail_queue`
#

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 text NOT NULL,
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)
);

#
# `mail_queue_seq`
#

CREATE TABLE mail_queue_seq (
id int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY  (id)
);

#
# Données pour `mail_queue_seq`
#

INSERT INTO mail_queue_seq (id) VALUES (1);

Premièrement, il faut définir certaines options. Comme vous avez besoin d'eux deux fois (une fois pour ajouter des messages, une fois pour envoyer les messages), il est toujours bon de les ajouter à un fichier de configuration. Nous l'appellerons config.php.

config.php

<?php

require_once "Mail/Queue.php";

// Options  pour stocker les messages
// Le type, c'est le container utilisé, 
// pour le moment on peut choisir entre 'creole', 'db', 'mdb' et 'mdb2'
$db_options['type']       = 'mdb2';
// the others are the options for the used container
// here are some for db
$db_options['dsn']        = 'mysql://user:password@host/database';
$db_options['mail_table'] = 'mail_queue';

// Voici les options pour envoyer les messages eux-mêmes
// ce sont les options requises pour la classe mail,
// particulièrement utilisé pour Mail::factory()
$mail_options['driver']   = 'smtp';
$mail_options['host']     = 'votre_serveur__smtp.tld';
$mail_options['port']     = 25;
$mail_options['localhost'] = 'localhost'//optional Mail_smtp parameter
$mail_options['auth']     = false;
$mail_options['username'] = '';
$mail_options['password'] = '';

?>

Voilà la configuration faite, passons à l'utilisation. Premièrement il faudra construire un message et l'ajouter à la file:

add_message.php

<?php
include './config.php';
/* nous utilisons db_options et mail_options ici */
$file_denvoi_de_mail =& new Mail_Queue($db_options$mail_options);

$from 'user@server.com';
$destinataire "user2@server.com";
$message 'Hi! This is test message!! :)';

$entetes = array( 'From'    => $from,
   
'To'      => $destinataire,
   
'Subject' => "Message de test"  );

/* nous utilisons Mail_mime() pour construire un email valide */
$mime =& new Mail_mime();
$mime->setTXTBody($message);
$corps $mime->get();
$entetes $mime->headers($entetes);


/* Placer le message dans la file */
$file_denvoi_de_mail->put$from$destinataire$entetes$corps );

?>

Ok, là nous avons utilisé la voie simple pour ajouter un message... Il y a des options plus avancées, consultez la documentation des fonctions d'ajout pour cela. Maintenant nous devons envoyer des messages. C'est la plupart du temps fait par un cron qui exécute régulièrement un script pour envoyer les messages. Et maintenant ce petit script d'exemple :

send_messages.php

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

/* Combien de courrier pourrons-nous envoyer chaque appel du script */
$nombre_max_de_mails 50;

/* Nous utilisons de nouveau db_options et mail_options de la config */
$file_denvoi_de_mail =& new Mail_Queue($db_options$mail_options);

/* Envoi effectif des messages */
$file_denvoi_de_mail->sendMailsInQueue($nombre_max_de_mails);
?>

Voilà c'est fait. Maintenant exécutez le script régulièrement et ajoutez vos mails à la file .

Depuis Mail_Queue v.1.1, la méthode preload() peut ne plus précharger TOUS LES courriers dans la mémoire, mais juste quelques uns à la fois. Quand le buffer est vide, il est automatiquement re-rempli. Vous pouvez fixer la taille du buffer par l'intermédiaire de la nouvelle méthode setBufferSize().

Vous pouvez aussi envoyer les emails stockés un par un. Voici un petit exemple pour illustrer cela :

send_messages_one_by_one.php

<?php
/* fixe la taille du tampon interne en fonction        */
/* des ressources mémoire disponible sur la machine    */
/* Le nombre indique la quantité maximum de mail qu'on */
/* peut placer dans la file.                           */

$file_denvoi_de_mail ->setBufferSize(20);

// Donnez une taille à la file
// (p.e. le nombre de mail à envoyer)
$limite 50;
$file_denvoi_de_mail->container->setOption($limite);
/* Boucler sur le lot de mail et les envoyer           */
while ($mail $file_denvoi_de_mail->get())
{
 
$result $file_denvoi_de_mail->sendMail($mail);
}
?>
Mail_Queue - classe de base pour la gestion de file pour mail. (Previous) Mail_Queue constructor (Next)
Last updated: Sun, 29 Aug 2010 — 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.