チュートリアル

チュートリアル – Mail_Queue についてのチュートリアル

シンプルな例を用いた Mail_Queue の使い方

ここでは、例として DB コンテナと mysql データベースを使用します。 mysql データベースに、(キューに追加される)メッセージをストアしておくための テーブルを作成する必要があります。

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 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)
);

定義が必要なオプションがあります。 それらは 2 回必要となりますので(一回はメッセージをキューへ追加する時、 もう一回はメッセージを送信する時)、 設定ファイルにまとめて記述するのが良いでしょう。 ここでは、その設定ファイルを config.php と名付けます。

config.php

<?php

require_once "Mail/Queue.php";

// メッセージをストアするためのオプション。
// type は使用しているコンテナで、今のところ 'creole'、'db'、'mdb' そして 'mdb2' が利用可能。
$db_options['type']       = 'mdb2';
// その他は使用しているコンテナのためのオプション。
// これらは db のためのオプション。
$db_options['dsn']        = 'mysql://user:password@host/database';
$db_options['mail_table'] = 'mail_queue';

// これらはメッセージ自身を送信するためのオプション。
// Mail-Classで必要とされるオプションや特に Mail::factory()
// で使用されるオプションがある
$mail_options['driver']    = 'smtp';
$mail_options['host']      = 'your_server_smtp.com';
$mail_options['port']      = 25;
$mail_options['localhost'] = 'localhost'//オプションの Mail_smtp パラメータ
$mail_options['auth']      = false;
$mail_options['username']  = '';
$mail_options['password']  = '';

?>

それでは、設定が終わったので、使ってみましょう。 最初にメールメッセージを構築し、キューに追加する必要があります。

add_message.php

<?php
include './config.php';
/* db_options と mail_options をここで使用する */
$mail_queue =& new Mail_Queue($db_options$mail_options);


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

$hdrs = array( 'From'    => $from,
               
'To'      => $to,
               
'Subject' => "test message body"  );

/* 有効なメールを構築するため、Mail_mime() を使用する */
$mime =& new Mail_mime();
$mime->setTXTBody($message);
$body $mime->get();
$hdrs $mime->headers($hdrs);


/* メッセージをキューに追加する */
$mail_queue->put$from$to$hdrs$body );

?>

よろしいでしょうか。ここでは、メッセージのキューへの追加をシンプルな方法で行いました。 より高度なオプションの指定も可能ですので、put 関数のドキュメントを参照してください。 次いで、(キューに追加した)メッセージを送信する必要があります。これには、cron を用いて メッセージを送信するスクリプトを定期的に実行させて行うことが一般的です。 以下が、メッセージ送信を行うシンプルなスクリプトです。

send_messages.php

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

/* スクリプトがコールされるたびに何通のメールを送信するか */
$max_amount_mails 50;

/* 設定から db_options と mail_options を再び使用する */
$mail_queue =& new Mail_Queue($db_options$mail_options);

/* メッセージを実際に送信する */
$mail_queue->sendMailsInQueue($max_amount_mails);
?>

これで完了です。 上記のスクリプトを定期的に実行し、必要なときにメールをキューに追加します。

Mail_Queue v.1.1 以降、preload() メソッドは、全てのメールを一度にプリロードせずに、 毎回数通だけをメモリにプリロードします。 バッファが空になると、自動的に再びプリロードされます。新しく加えられた setBufferSize() メソッドを通してバッファのサイズをセットすることができます。

また、キューにストアされたメールを一通ずつ送信することもできます。 以下がそれを行うシンプルなスクリプトです。

send_messages_one_by_one.php

<?php
// メモリリソースに応じて内部バッファを
// セットする (数値は、一回に付き、
// 何通のメールがバッファに
// 保持されるかを表す)

$mail_queue->setBufferSize(20);

// キューのサイズを設定する (すなわち、送信するメール数)
$limit 50;
$mail_queue->container->setOption($limit);

// ストアされたメール分だけループし、それらを送信する
while ($mail $mail_queue->get()) {
    
$result $mail_queue->sendMail($mail);
}
?>
Mail_Queue - メールキュー管理のための基本クラス (Previous) Mail_Queue のコンストラクタ (Next)
Last updated: Wed, 23 Apr 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.