<!-- -*- mode:text coding:euc-jp -*-
   $FML: chapter.sgml,v 1.18 2009/12/26 13:33:25 fukachan Exp $
-->


<chapter id="delivery">
	<TITLE>
	&fml8; のメール配送システム
	</TITLE>


<sect1 id="delivery.fml8-and-fml4-difference">
	<title>
	&fml4; と &fml8; の相違点
	</title>

<para>
&fml8; 最大の目的の一つは、メンバーリストの取得操作におけるコードの
統合と抽象化です。
</para>

<para>
配送システムも抽象化された IO 層を利用して配送先の情報を取得しています。
</para>

<para>
配送には抽象化された Mail::Delivery クラスを次のように使っています。
</para>

<para>
Mail::Delivery::* に属するクラスは SMTP および LMTP 配送へのインターフェ
イスを提供します。
つまり
Mail::Delivery は
Mail::Delivery 以下の派生クラス
SMTP、ESMTP
へのインターフェイスを提供するアダプター層です。
</para>

<para>
たとえば次のように使います。
<screen>
    use Mail::Delivery::SMTP;
    my $service = new Mail::Delivery::SMTP;
    if ($service->error) { Log($service->error); return;}

    $service->deliver(
                      {
                          mta             => '127.0.0.1:25',

                          smtp_sender     => 'rudo@nuinui.net',
                          recipient_maps  => $recipient_maps,
                          recipient_limit => 1000,

                          mesage          => $message
                      });
</screen>
ここで $message は
<link linkend="module.mail.message">
Mail::Message
</link>
オブジェクトです。
</para>

</sect1>


<sect1 id="delivery.message-object">
	<title>
	<link linkend="module.mail.message">
	Mail::Message
	</link>
	オブジェクト
	</title>

<para>
このオブジェクトはメールを解析し、
<screen>
header -> body
header -> preamble -> part1 -> part2 -> trailor (multipart)
</screen>
のようにオブジェクトが「じゅずつなぎ」になったデータ構造を作ります。
</para>

<para>
<link linkend="module.mail.message">
Mail::Message
</link>
クラスはこのようなデータ構造を操作するメソッドを提供しています。
</para>

</sect1>


<!-- mail queue -->
&sect.mailqueue;


<sect1 id="delivery.qmgr">
	<title>
	キュー管理システム
	</title>

<!--
   XXX-TODO: もっと、キュー管理システムについて詳しく書いて！
-->

<para>
2004 夏以降、&fml8; の配送システムはキュー管理システムのもとで動いてい
ます。これにより &fml8; 自力での再送処理が可能となりました。
別の言い方をすれば、
実質的に &fml8; をメールサーバと言ってよくなったわけです。
</para>

</sect1>


<sect1>
	<title>
	議論: FML::Mailer は必要か？
	</title>

<para>
FML::Process::QueueManager が使っているのみなので
独立したモジュールである必要があるだろうか？という疑問です。
</para>

<para>
現状 reply_message() メソッドが何でもしてしまうので、
FML::Mailer を呼ぶことはないかもしれません。
もっとも reply_message() 以外の送信メソッドがあり得るかもしれません。
</para>

<para>
将来、どうも使ってないようなら
FML::Process::QueueManager に合併するべきなのでしょう。
</para>

<para>
ねんのため、HOOK などでは FML::Mailer は使わないようにして下さい。
</para>

</sect1>


<sect1 id="recipes.delivery">
	<title>
	配送に関する TIPS 	
	</title>

<!-- TABLE_OF_RECIPES -->
<qandaset>

&recipes.delivery;

</qandaset>

</sect1>


</chapter>
