ようこそゲストさん

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

データベースから一気に差し込み

データベース連動

データベースから、データをフェッチ(Fetch)した場合、多くの場合、次のようなデータ構造になっているはずです。
(もちろん、フィールド名やデータは例です。)
$data = array(
	array('name'=>'スポック','id'=>1,'mail'=>'spok@example.com',
              'age'=>'24','address1'=>'東京都品川区','address2'=>'三田0-0-0',
              'tel'=>'03-0000-0000',),
	array('name'=>'カーク','id'=>2,'mail'=>'kirk@example.com',
              'age'=>'20','address1'=>'大阪府大阪市','address2'=>'難波0-0-0',
              'tel'=>'06-0000-0000',),
	array('name'=>'ウフーラ','id'=>3,'mail'=>'urhoora@example.com',
              'age'=>'22','address1'=>'愛知県名古屋市','address2'=>'中央区近衛0-0-0',
              'tel'=>'045-0000-0000',),
	array('name'=>'マッコイ','id'=>4,'mail'=>'maccoy@example.com',
              'age'=>'50','address1'=>'鹿児島県鹿児島市','address2'=>'中区聖0-0-0',
              'tel'=>'092-0000-0000',),
);
このデータを一気に、Qdmailに差し込むことで、上記のデータの場合、4人にそれぞれ個人別にカスタマイズしたメールを一度に送信することができます。
通常、$to として、宛先を指定する引数に、$dataをします。
そして、件名や本文で、置き換えたい項目を%記号で囲みます。
サンプルをみるのが早いでしょう。上記の$dataが入っているものとします。
上記の$dataのメールアドレス部分を自分が管理している別のメールアドレスに入れて試してください。
require_once('qdmail.php');

$subject="こんにちは、%name%さん。";

$body="%name%さんの登録内容をお送りします。

名前:%name%
id: %id%
メールアドレス:%mail%
年齢:%age%
住所:%address1% %address2%
TEL: %tel%
専用URL:http://example.com/login/?id=%id%

このように、qd_send_mailでは、簡単にインサートメールを送信することができます。";

$from = array( 'from@example.com' , '送り元日本語名' );
$option = array('type'=>'text','option'=>array('simpleReplace'=>true));

$flag = qd_send_mail( $option , $data , $subject , $body , $from );
この
$option = array('type'=>'text','option'=>array('simpleReplace'=>true));
の部分が、SimpleReplace機能をONにする箇所です。

フィールド名と連動

%でデータベースのフィールド名を囲めば(%フィールド名%)、自動的にリプレースされるわけですが、どのフィールドのデータをメール宛先の送信者表示名にするか、どれが送信先のメールアドレスなのかを指定する必要があります。
デフォルトでは、次のようになっています。
フィールド名意味
mail送信先メールアドレス
name送信先表示名
しかし、あなたのデータベースでは、必ずしも、上記のフィールド名になっておらず、メールアドレスが、mail_address だったり 表示名が pen_name だったりするかも知れません。
その時、SimpleReplaceは、正常に動作しますが、Qdmailは肝心の送信先アドレスを見失ってしまいます。
ですので、mail,nameではなない場合は、次の指定を加えてください。
$op = array( 'simpleReplace'=>true,
             'addressField'=>array('mail_address','pen_name')
 );

$option = array('type'=>'text','option'=>$op);

# ほげお 2008年09月11日(木) 深夜0時44分

メールを一通しか送らないのですが、メール内で変数との置き換えをしたいのです。
この通りやっていますが、うまく動作しないですね…


dmail error: Illegal Mail Address "" line -> 2539
Qdmail error: Error happen, see upper line -> 1957
Qdmail error: Error 'TO' Separate mode in Sendbase function , the Address is -> hoge@example.com line -> 1879
Qdmail error: Send Error line -> 1898

PHP4.3.11
Qdmail ver 1.1.0b


$mail -> send() 型では、どうやるのでしょうか?

$mail -> text($body);
$mail -> toSeparate(true); 

でも同じエラーになります。

$mail->to($data); でエラー。
$mail->to('hoge@example.com'); はOK.

$data = array(
array(
'name' => 'メールテスト',
'mail' => 'hoge@example.com',
)
);

この内容で、上記エラーを吐きます。何が問題でしょうか?

# spok 2008年09月14日(日) 午後4時21分

ほげおさん

このエラーは、メールアドレスがうまく受け渡しされていないために起きるエラーです。
こちらでは、再現しませんので、できましたら、うまくいかない場合の該当部分のソースコードをお教えいただければ幸いです。

# ほげお 2008年09月14日(日) 深夜0時26分

内容は変わっていますが、以下のような感じです。

$from = array( ML_FROM , 'MLメール');
$subject = 'メール';
$data = array(
array(
'name' => 'メール',
'mail' => $to,
'title' => $title,
'url' => $url,
)
);
$body = "%title%
なんとかかんとか
%url%
";

//NG
//$option = array('type'=>'text','option'=>array('simpleReplace'=>true));
//$result = qd_send_mail( $option , $data , $subject , $body , $from );

$mail =& new Qdmail();
//$mail->to($options['to']); // OK
$mail->to($data); // NG
$mail->subject($subject);
$mail->text($body);
$mail->from($from);

$mail->toSeparate(true);

$mail->send();

# spok 2008年09月15日(月) 午前11時34分

ほげおさん

こちらで、$to,$title,$url,ML_FROM を適当に補完して送信したところ、特に異常なく送信できました。

--補完したコード--
$to = 'address@example.com';//実際は実在アドレスにしています。
$title ='test';
$url = 'http://exmaple.com';
$from = array( 'from@example.com' , 'MLメール');
--以上--

おそらく、ML_FROM が正しく定義されていないように思います(想像)。
php.iniのエラー表示に関して

error_reporting = E_ALL

とした上で、実行してみてください。または、ML_FROM が正しく定義されているかどうかご確認ください。

その上で、まだ正常送信できない場合、ML_FROM を 'from@example.com'などと、メールアドレスの形式で直接的に指定してみてください。
また、OOP方式の今回のようなことをやる場合は
$mail ->simpleReplace(true);
が必要ですので、お試し下さい。

その上で、まだ正常送信できない場合は、お手数ですが、今一度ご連絡ください。

# spok 2008年09月15日(月) 午前11時47分

あ、ひょっとしたら、原因は $to の指定のほうかも知れませんので、$toの内容もご確認ください。

なお、見る限り、ソースコードがちょっと足りないように思います。特に

//$mail->to($options['to']); // OK

について、$option の定義はありますが、$options の定義がありません。

次回ご連絡いただくときは、コードのコピペの方が原因を特定しやすいので、できましたら、コピペでお願いします。もちろん、支障あるメールアドレスは、例えば ***@example.com などと変えて下さい。または、非公開コメントにチェックをしていただくと、私以外にはみえませんので、メルアドがそのままでも、大丈夫です(絶対的な保証はできませんが)。

# ほげお 2008年09月16日(火) 午後6時03分

どうやら途中で、$dataに配列を追加しようとして、$data[]['added_data'] = $added_data;ってやったところ、$data の内容がなくなったためのようです。

初歩的なミスで申し訳ありません。
現在は、ちゃんとメールできているようです。

ちなみに、以前はSmartyのテンプレートファイルにメール内容を書いて送るということをしていました。そこでちょっと質問ですが

・ファイルから読み込むテンプレート機能(デコメの場合はあるようですが)
・ファイル内でのif文などの制御文を使う機能

というのは現状できないですよね?

・$body の中身をforeachで回したり、ifで回したりしたい。
・改行を入れると、改行前のスペースがそのままメールに。ソースの方でスペースをなくすと、ソースがぐちゃぐちゃに。

という点が少し気にはなっているので。
もし対処方法などあれば。

# spok 2008年09月16日(火) 午後11時17分


ほげおさん

メールが送れるようになってよかったです。

私の理解不足で申し訳ありませんが、以下の事は、何をしようとしているのか、ちょっとわからないので、とんちんかんなお応えかもしれませんが、回答しておきます。

>・ファイルから読み込むテンプレート機能(デコメの場合はあるようですが)

ファイルに%name%などと書いて、それをfile_get_contents( 'filename.txt' ); し、それをsimpleReplaceで置換する、
とか
ob_start http://php.morva.net/manual/ja/function.ob-start.php
などで、いったん画面バッファリングし、それを $mail -> text( $buffer ); とするのでは不十分でしょうか。

>・ファイル内でのif文などの制御文を使う機能
>・$body の中身をforeachで回したり、ifで回したりしたい。
eval http://jp.php.net/manual/ja/function.eval.php
を使用するのでは不足でしょうか。

smartyは使ったことありませんが、
fetch http://sunset.freespace.jp/smarty/SmartyManual_2-6-7J_html/api.fetch.html
などは、画面出力を変数に取り込めるようですので、これでは不足でしょうか。

>・改行を入れると、改行前のスペースがそのままメールに。ソースの方でスペースをなくすと、ソースがぐちゃぐちゃに。

すいませんが、どのような現象を示しているのかわかりませんので、実例で説明していただければ幸いです。

# kt 2008年10月01日(水) 午前10時44分

データベースから一気に差し込む場合、BCCやCCの設定はどうすればいいのでしょうか?
「mail」の箇所をCC・BCC用のメールアドレスにすれば送信出来ますが、TO形式で送信されます。

送信方法はqd_send_mail方式で、バージョンは1.1.5bを利用しています。

# spok 2008年10月01日(水) 午前11時41分

ktさん

確認ですが、「どのtoの宛先でも同じcc,bcc」をご希望ですか?
それとも「それぞれのtoの宛先に合わせて、それぞれ異なるcc,bcc」をご希望ですか?

# spok 2008年10月01日(水) 午前11時49分

つまり、ccやbccもデータベースから突っ込みたいのか、それとも、常に管理者にbccするような機能がいいのか、ということです。現行バージョンで、できることできないことがあり、ちょっとした改造で、できること、できないことがあります。

# kt 2008年10月01日(水) 午後0時05分

「どのtoの宛先でも同じcc,bcc」です。
用途として「管理者にコピーメールを送信」みたいな事に使いたいと思いまして。
bccは常に管理者に連絡する方法でいけるかと思いますが、
ccは転送先のメールアドレスがメールソフトで表示されて欲しいので、
cc送信も出来ればと表います。

# spok 2008年10月01日(水) 午後2時19分

ktさん

現行バージョンでは、simpleReplace時に、できるのは、常にあるアドレスにBccだけです。
CCについては、現行バージョンでは対応していません。ただ需要があることがわかりましたので、次回更新時には、ちょっと考えてみます。

常にbccは以下を参考にしてください。
通常のbcc,ccメソッドは、simpleReplace時にはセキュリティ上、効かなくなるようになっていますが、allwaysBccメソッドは使用可能です。


$option = array('type'=>'text',
'option'=>array(
'simpleReplace'=>true,
'allwaysBcc'=>'admin@example.com'
)
);

ただし、試してみるとわかりますが、simpleReplaceを使って、allwasyBccすると、差し込んだすべてのパターンのメールをbccで受けますので、多くの通数の差し込みメールを一気に送ると、かなりの数のメールを受け取ることになることにご留意ください。

# spok 2008年10月01日(水) 午後9時50分


ktさん

1.1.7b 以降にて修正しました。

allwaysBcc の代わりに、cc,bccとしていただければ、大丈夫だと思います。

$option = array('type'=>'text',
'option'=>array(
'simpleReplace'=>true,
'bcc'=>'admin@example.com',
'cc'=>array('admin@example.com','日本語CC')
)
);

# spok 2008年10月01日(水) 午後9時50分

ps 今まで通り、allwaysBccも使用可能です。

# kt 2008年10月03日(金) 午後6時11分

動作テストさせていただきました。問題なく送信できました。
要望を実現していただき、ありがとうございます。

ただ、細かい事ですが、bccとcc両方入力していないと、エラーになります。

私はシステムと連動している為、以下のように記述しています。

'bcc'=>$bcc_mail,
'cc'=>array($cc_mail,$cc_name)

これらはメール送信前に入力値を確認して振り分ければいい事ですが、
もし出来たら「bccかccの入力値が無くても送信できる」という形であれば
より使い勝手が良くなると思いました。

# spok 2008年10月04日(土) 午後4時24分


ktさん

1.1.8b以降にバージョンアップした上で、下記をお試し下さい。
デフォルトでは、空文字やnullがアドレスに入力されると、不正なメールアドレスとして認識するようになっています。
それをユーザーの設定で変更する方法はいくつかありますが、推奨するのは、アドレスバリデーション(判定)の変更です。

http://hal456.net/qdmail/validation
のサンプル2を参考にしてください。

$option = array('type'=>'text',
'option'=>array(
'varidateAddressRegex'=>'/([^@]+@[^@]+)|(^$)/',
'simpleReplace'=>true,
)
);

ということです。これにccなり、bccを付け加えてみて下さい。

ただし、この方式はメールアドレス全般にかかる判定の変更ですので、toやfromに空文字、nullが入力された場合には、別のエラーがでることになります。お気を付け下さい。

# kt 2008年10月07日(火) 午後4時19分

返信が遅れましたが、、確認させていただきました。
希望通りの処理になりました。

また何かありましたら、よろしくお願いします。

# msd 2009年10月08日(木) 午後4時58分

メール送信するプログラムを組む時、Qdmailを使わせていただいております。
便利なライブラリ、有難うございます。

addressFieldメソッドに関してなのですが、OOPで利用する際、fromやtoの指定を行う前に指定しなければならない、
というルールに気がつくのに小一時間かかってしまいました。
もしよろしければマニュアルページに、記載していただけると幸いです。

# まこぶらっく 2010年09月20日(月) 午後5時05分

はじめまして。
qdmail&qdsmtpを利用し、テンプレートファイルを読み込んで
差し込み送信を実装しようと考えているのですが、
下記のようなやり方で差し込み送信しようとした場合、
どのようなコーディングにすればよいかあれこれ悩んでしまっております。

初歩的なところでつまづいてしまい、申し訳ないのですが
アドバイスいただけないでしょうか。



/*メール送信ここから*/
$mail = & new Qdmail();

$mail -> smtp(true);

$param = array(
'host'=>'メールサーバー(外部サーバ)',
'port'=> 25 , //SendMail Port
'from'=>'abc@sample.com',
'protocol'=>'SMTP'
);
$mail -> smtpServer($param);

$message = @file_get_contents('../sample.txt');

$mail ->to('toアドレス(DBなどから取得)','●●様');
$mail ->subject('連絡ありがとうございました');
$mail ->from('abc@sample.com');
$mail ->text($message);

$replace_data = array(
array(
'xxxxx'=>'こんにちは',
)
);

$return_flag = $mail ->send();
/*メール送信ここまで*/



sample.txtの中身
-----------------------------------
ここにメール本文を書きます。

%xxxxx% ←差し込みたいところ
-----------------------------------


※ちなみに、上記の状態ではtoアドレス宛に
メール自体は送信されます。
差し込み部はそのままですが…




$dataの部分をどのように渡したらよいか、また
$option = array('type'=>'text','option'=>array('simpleReplace'=>true));
をそのまま書いておくだけでよいのか、
などがよくわかっていません…

あと、差し込みに必要なのはxxxxxだけでいいのですが
その場合でもmailやnameは必要になるのでしょうか?


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