mail関数とエラーメール

2008/06/03 | PHPの基本

PHPからはmail関数やmb_send_mail関数を使えば、簡単にメールを送信することができる。しかし、そもそもこれらの関数だけで、RFCに沿った日本語メールを送信することはできない(らしい)。「RFCに厳密に沿って」作るのが一番いいのは間違いないが面倒なので、mb_send_mail関数を使う際のオプション類についてメモしておく。
mb_send_mail関数は標準で引数3つ、オプションであと2つの引数、合計5つの引数をとることができる。標準の3つの引数はメール送信時には必須の「宛先メールアドレス」「タイトル」「本文」。残りの2つのオプションが重要だ。

第4引数:メールの追加ヘッダ
ここで指定した文字列をメールのヘッダとして追加してくれる。標準の3つの引数だけでメールを送信すると、到着メールの送信者欄が「apache@example.net」みたいになってしまうので、以下のように設定すればよい(行末は改行で複数行のヘッダを指定できる)。
“From: hoge@example.net¥r¥n”

第5引数:MTAへのオプション指定
上記で送信者メールアドレスを指定することはできる。しかし宛先メールアドレスが間違っているなどの場合には、残念ながら上記で設定したFromメールアドレスにエラーメールは返ってこない。エラーメールはFromヘッダには返されないことがほとんどなのだ。ではどういったヘッダを加えるかということになるが、メールソフトなどで受信したメールのヘッダを覗いてみるといい。Return-Pathというヘッダがあるはずだ。実はこのヘッダのメールアドレス宛にエラーメールが返されている(ようだ)。では「Return-Pathを第4引数に」と思うのだが、実は早計で、Return-Pathは特別なヘッダなのだ。
では、どうするか。それを解決するのが第5引数だ。第5引数に以下のように与えればよい。
“-f hoge@example.net”
第5引数はMTA(メールサーバソフト)に、メール送信時のオプション指定をするためのもので、そこで指定するのが正しい。これでエラーメールが届く(確率が上がる)。

実はエラーメールの配送は、自分のサーバや相手先サーバの使用に依存することが多いので上記の設定でもエラーを拾うことができない場合が多々あると思われる。そんな場合は・・・都度原因を追うしかないだろうな。

構文記述方法のことで

2008/05/27 | PHPの基本

PHPで画面出力部分を取り扱う場合はテンプレートエンジンを使うことが多いのだが、管理者向け画面などは凝ったデザインの必要がないので、PHP直書きで記述することも多い(直書きであってもテンプレートとして別ファイルにしているが)。そういった場合での、テンプレート内に制御構造を記述する際のメモ。

「テンプレートエンジンと使わない」といっても、何でもかんでもプログラム本体と同様にprint()とか書いていると当然読みにくくなるので、省略形などを使う。例えば、

「<?php print($str); ?>」のかわりに「<?=$str ?>」とか。

あと制御構造も、

<?php
if($condition){
  print(‘hoge’);
}else{
  print(‘fuga’);
}
?>

などと書くとやっぱりわかりづらいので、以下のように記述している。

<?php if($condition): ?>
hoge
<?php else: ?>
fuga
<?php endif; ?>

でも上記のように制御構造を記述する場合、if節の中にif節という具合に入れ子にできないのが難点だ。だって、どの「endif」がどれに対応しているのかわからなくなるから。

これって回避方法はあるんだろうか。マニュアルを見ても書いてなさそうだったんだよね。

文字型関数(ctype)を使った変数チェック

2008/05/26 | PHPの基本

変数チェックで、また自分の知らない(使ったことがない)関数とであった。与えられた変数の値がどのような文字列で構成されているかをチェックするための関数群ctypeだ。以前は正規表現で書いていたりしたのだが、こちらの関数のほうがお手軽で簡単だ。マニュアルには「ctype 関数は、正規表現よりもつねに好ましく、さらに str_* および is_* のような いくつかの等価な関数よりも好ましいことに注意してください。 これは、ctype 関数がネーティブな C ライブラリを使用しており、処理が著しく 高速であるためです。」と書いてある。まぁ、当然ダイレクトにCのライブラリを呼ぶのだから、正規表現との速度の差は明らかだろう(といってもアクセス数が少なければ、そのオーバーヘッドはわからないだろうけど)。

■ ctype_alnum
英数字かどうかを調べる

■ ctype_alpha
英字かどうかを調べる

■ ctype_cntrl
制御文字かどうかを調べる

■ ctype_digit
数字かどうかを調べる

■ ctype_graph
空白以外の印字可能な文字かどうかを調べる

■ ctype_lower
小文字かどうかを調べる

■ ctype_print
印字可能な文字かどうかを調べる

■ ctype_punct
空白、英数字以外の出力可能な文字かどうかを調べる

■ ctype_space
空白文字かどうか調べる

■ ctype_upper
大文字かどうか調べる

■ ctype_xdigit
16 進数を表す文字かどうかを調べる

「ctype_digit」は見たことがあったけど、他にもこんなにあったんだ。さらにマニュアルを読むと「PHP 4.2.0以降、これらの関数はデフォルトで有効となりました。」とあるので昔はモジュールをロードしなくてはいけなかったのね。どうりで知らないわけだ。

Zend Frameworkでping送信

2008/05/23 | Zend Framework

今やブログでおなじみになったping送信。しかしXML-RPCという特性上(かどうかは知らないけれど)、ping送信を実現するためのPHPスクリプトのサンプルを提供しているサイトはほとんどない。やっぱり少しだけ敷居が高いためだろうか。
かくいう自分もping送信はよく理解できなかったのだが「案ずるより産むが易し」で、どこからかサンプルを探してきて、試しているうちに理解できるようになった。
ping送信は生のPOSTデータを取り扱うので、一から自分で書くとPHPやWeb、XML-RPCに関する理解が深まるが、やはりお気楽にプログラムを書きたいところ。今まではPEARなどのライブラリを使って書いていたのだが、それでも結局10行以上書かなくてはならなかった記憶がある。

で、革命。Zend_XmlRpcを使うとたった3行でping送信ができる。サンプルスクリプトはこんな感じ。

require_once ‘Zend/XmlRpc/Client.php';
$client = new Zend_XmlRpc_Client($server);
$client->call(‘weblogUpdates.ping’, array($title, $url));

$serverはping送信先URL、$titleにはブログタイトル、$urlにはブログURLを代入すればいい。1行目はライブラリの読み込みなのだから実質2行でping送信ができるわけだ。

これには参った。ほんと、よくできてるよ、Zend Framework。

変数チェック

2008/05/22 | PHPの基本

最近便利に使っている変数チェック用の関数にemptyがある(なぜ今まで使っていなかったのかが、われながら不思議)。emptyは、その引数である変数が、文字通り「空」であったときにtureを返すわけだが、厳密には以下の場合にtrueを返す(一部マニュアルから抜粋)。

■ “” (空文字列)
$value=”; と定義された場合

■ 0 (0 は整数)
$value=0; と定義された場合

■ “0” (0は文字列)
$value=’0′; と定義された場合

■ NULL
$value=NULL; として定義された場合

■ FALSE
$value=FALSE; として定義された場合

■array() (空の配列)
$value=array(); として定義された場合

■ var $var;(変数が宣言されているが、値が設定されていない)
クラス内で値が設定されていない場合

あと、もう一個便利なのが「未定義の変数を引数として渡した場合」もundefinedなエラーではなく、trueを返してくれる。

便利だ。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net