ようこそゲストさん

Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

SMTPの玄人的操作法

必ずバージョン0.9.0a以降でご使用ください。

QdSmtpをQdmailから操作する。

QdSMTPを利用して、Qdmailからメールを送る基本的な方法は、QdSmtpでのSMTP送信をご覧ください。

ここでは、メールを送るだけではなくて、QdSmtpの機能をフル活用したいという人のためのコーナーです。

QdSmtpオブジェクトの取得方法

Qdmail&QdSmtpで、SMTP送信する場合は、インクルードできる場所にqdsmtp.phpファイルさえ置いてあれば、Qdmail側で勝手にインクルードして、勝手にオブジェクト生成(インスタンス)を行います。
これはこれで便利だと思うのですが、QdSmtpオブジェクトは、Qdmailによって隠蔽されているので、QdSmtpの機能を余すことなく利用するのが若干難しくなります。

Qdmailでは、SMTPオブジェクトの明示的取り扱いについて、以下の2つの方法があります。
  1. Qdmailが内部生成したQdSmtpインスタンスをユーザーに渡す。
  2. QdSmtpインスタンスをユーザー側でnewし、それをQdmailに渡す。
(※ ここではあくまでもQdSmtpオブジェクト(インスタンス)を明示的に扱いたい場合であって、簡単にsmtp送信するだけならQdSmtpでのSMTP送信の方法の方が簡単かと思います。)


まず、1の方法を説明します。
(ここではPOP BEFORE関連のみを記しますが、他のQdSmtpメソッドに応用可能です。)

1. Qdmailが内部生成したQdSmtpインスタンスをユーザーに渡す。

サンプルコード
必ずバージョン0.9.0a以降でご使用ください。
$param = array(
    'host'=>'smtp.example.com',
    'pop_host'=>'pop.example.com',
    'port'=> 25 ,
    'from'=>'from@example.com',
    'protocol'=>'POP_BEFORE',
    'pop_user'=>'pop_user_id',
    'pop_pass' => 'pop_password',
);

$mail -> smtp(true);
$mail -> smtpServer($param);

$smtp=& $mail->smtpObject();                        // QdSmtpのオブジェクトを取得
$smtp -> pop3TimeFilename( 'henkou_filename.txt' ); // POP制御のためのファイル名変更
$smtp -> pop3ValidMinute( 5 );                      // POP間隔の変更


$message=$itsme.$sender_mess."ここに本文を書きます。";

$flag=$mail ->easyText('address@example.com','宛先','タイトル',$message,'from@example.com');
(PHP5の場合は、& は必要ありません。)

これで、$smtpには、Qdsmtpのオブジェクト(インスタンス)が代入されておりますので、Qdsmtpのメソッドを使用することができます。
この
$smtp=& $mail->smtpObject();                        // QdSmtpのオブジェクトを取得
$smtp -> pop3TimeFilename( 'henkou_filename.txt' ); // POP制御のためのファイル名変更
$smtp -> pop3ValidMinute( 5 );                      // POP間隔の変更
の部分が、QdSmtpを操作している部分ですが、PHP5の場合は、わざわざ、$smtpという変数にいったん代入しなくても、以下のようにすることもできます。
$smtp -> $mail->smtpObject() -> pop3TimeFilename( 'henkou_filename.txt' ); 
$smtp -> $mail->smtpObject() -> pop3ValidMinute( 5 );
続いて、2の方法を説明します。

2. QdSmtpインスタンスをユーザー側でnewし、それをQdmailに渡す。

require_once('qdmail.php');
$message='<font color="red">メールの中身を書きます。</font>';
$mail ->to('address@example.com');
$mail ->subject('メールのテスト');
$mail ->from('from@example.com');
$mail ->html($message);
//ここまでは通常のQdmailの操作

//ここからQdSmtpの操作
require_once('qdsmtp.php');
$smtp = & new qdsmtp;
$param = array(
    'host'=>'smtp.example.com',
    'pop_host'=>'pop.example.com',
    'port'=> 25 ,
    'from'=>'from@example.com',
    'protocol'=>'POP_BEFORE',
    'pop_user'=>'pop_user_id',
    'pop_pass' => 'pop_password',
);
$smtp -> server($param);
$smtp -> pop3TimeFilename( 'henkou_pop_file.txt' );
$smtp -> pop3ValidMinute( 5 ); 

$mail->setSmtpObject($smtp);//QdmailにQdSmtpのインスタンスを渡す

$flag=$mail ->send();    
なお、
$mail->setSmtpObject($smtp);//QdmailにQdSmtpのインスタンスを渡す

$flag=$mail ->send();    
の部分は、PHP5であれば、以下のように書くこともできます。
$flag=$mail -> send($smtp);
このsend($smtp)式は、PHP4でも送信できますが、$smtpインスタンスがディープコピー(clone copy)されるので、若干メモリの無駄使いとなります。

# KUNO 2010年01月26日(火) 午後3時29分

PHP5以上でqdmailとqdsmtpの連携をしようとすると、以下のソースのところでオブジェクトが渡されずにSMTPで送信できません。

2053 $this->smtp_object = & $option;
2054 $this->smtp = true;
2055 $option = null ;

リファレンスの&を取るか、2055行を削除する必要があります。
Return-Pathがヘッダに渡されない理由を5時間くらい悩んだ結果たどり着きました。

また、最新版の仕様ですと、そもそもこのマニュアルにあるsetSmtpObject()は使えませんよね?


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/040/tb/