導入案内

導入案内 --  SMTP プロトコルの実装の提供

Net_SMTP の導入案内

Net_SMTP パッケージは、SMTP 認証規格 (RFC-2554 で定義されているもの) に対応しています。 Net_SMTP がサポートする認証方式は DIGEST-MD5 や CRAM-MD5、LOGIN そして PLAIN といったものです。

依存性

PEAR_Error クラス

Net_SMTP パッケージは、すべてのエラー処理に PEAR_Error クラスを使用しています。

Net_Socket パッケージ

Net_Socket パッケージを、すべてのネットワーク通信の基盤として使用しています。

Auth_SASL パッケージ

Auth_SASL パッケージは必須ではありません。もしこのパッケージが存在すれば、 Net_SMTP パッケージで DIGEST-MD5 や CRAM-MD5 SMTP 認証方式を使用できるようになります。 存在しない場合は LOGIN と PLAIN しか使用できません。

エラー処理

Net_SMTP クラスのすべての public メソッドは、 エラーが発生した場合に PEAR_Error オブジェクトを返します。PEAR_Error オブジェクトかどうかを調べる一般的な方法は、 PEAR::isError() を使用することです。

SMTP 認証

Net_SMTP パッケージは、SMTP 認証規格 (RFC-2554 で定義されているもの) に対応しています。 Net_SMTP がサポートする認証方式は以下のとおりです。 これは優先度順に並んでいます。

DIGEST-MD5

DIGEST-MD5 認証方式は、RSA Data Security Inc. の MD5 Message Digest アルゴリズムを使用します。 これは、SMTP の認証方式のなかで最もセキュアなものであるとみなされています。

注意 DIGEST-MD5 認証方式は AUTH_SASL パッケージが存在する場合にしか使用できません。

CRAM-MD5

CRAM-MD5 認証方式は、セキュリティの観点では DIGEST-MD5 方式に劣ります。これは、 新しい DIGEST-MD5 アルゴリズムに対応していない 昔の SMTP サーバとの互換性のために用意されています。

注意 CRAM-MD5 認証方式は AUTH_SASL パッケージが存在する場合にしか使用できません。

LOGIN

LOGIN 認証方式は、ユーザのパスワードを Base64 符号化方式で暗号化します。 Base64 で暗号化された文字列を復号するのはたやすいことなので、 LOGIN はセキュアな認証方式であるとはいえません。 この方式は避けるべきです。

PLAIN

PLAIN 認証方式は、ユーザのパスワードを平文で送信します。 この方式による認証はセキュアではなく、避けるべきです。

セキュアな接続

secure socket transports が PHP で使用可能な場合は、 リモートの SMTP サーバとの間にセキュアな接続を確立することができます。

$smtp = new Net_SMTP('ssl://mail.example.com', 465);

この例では、mail.example.com のポート 465 (標準の SMTPS ポート) に ssl:// トランスポートで接続します。

データのクォート

デフォルトでは、送信される文字列データは SMTP 標準にあわせてクォートされます。つまり、Unix (\n) や Mac (\r) のネイティブの行末コードが Internet の標準である CRLF (\r\n) に変換されるということです。 また、SMTP プロトコルでは行頭の単一のピリオド (.) がメッセージデータの終了を意味するので、データ文字列の中に 行頭の単一のピリオドがあった場合はそれが "二重に" なります (つまり ".." となります)。

これらの文字列変換処理は、大量のデータを扱う際には負荷が高くなります。 たとえば、Net_SMTP パッケージは MIME パートには対応していません (MIME メッセージも、単なる巨大なメッセージ文字列として処理します)。 そのため、テキストではない添付ファイルの部分 (クォートが必要な文字がない部分) を読み飛ばすといったことができないのです。

このような理由から、Net_SMTP クラスを継承して自前のクォート処理を実装することができるようになっています。 そのためには、Net_SMTP を継承したクラスを作成して quotedata() メソッドを再実装します。

require 'Net/SMTP.php';

class Net_SMTP_custom extends Net_SMTP
{
    function quotedata($data)
    {
        /* 自前のクォート処理 */
    }
}

quotedata() 関数の $data パラメータは参照で渡されることに注意しましょう。 つまり、$data を直接操作することができるということです。 巨大な $data 文字列を quotedata() メソッドにコピーしたりすると、 それもまたオーバーヘッドになってしまいます。

デバッグ

Net_SMTP パッケージには、デバッグ出力用のルーチンが組み込まれています (デフォルトでは無効になっています)。デバッグ出力を行うには、 setDebug() メソッドを使用します。

$smtp->setDebug(true);

デバッグメッセージは、標準出力ストリームに送られます。

次のスクリプトは、シンプルなメールを Net_SMTP パッケージで送信する方法を示すものです。

<?php
require 'Net/SMTP.php';

$host = 'mail.example.com';
$from = 'user@example.com';
$rcpt = array('recipient1@example.com', 'recipient2@example.com');
$subj = "Subject: Test Message\n";
$body = "Body Line 1\nBody Line 2";

/* 新しい Net_SMTP オブジェクトを作成します */
if (! ($smtp = new Net_SMTP($host))) {
    die("Unable to instantiate Net_SMTP object\n");
}

/* SMTP サーバに接続します */
if (PEAR::isError($e = $smtp->connect())) {
    die($e->getMessage() . "\n");
}

/* SMTP コマンド 'MAIL FROM:' を送信します */
if (PEAR::isError($smtp->mailFrom($from))) {
    die("Unable to set sender to <$from>\n");
}

/* 受信者のアドレスを指定します */
foreach ($rcpt as $to) {
    if (PEAR::isError($res = $smtp->rcptTo($to))) {
        die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
    }
}

/* メールの本文を設定します */
if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
    die("Unable to send data\n");
}

/* SMTP サーバとの接続を切断します */
$smtp->disconnect();
?>