pukiwiki でのメール機能について

2014/01/08 22:07:59

pukiwiki でのメール機能

はじめに

pukiwiki でのメール機能が必要であったので調べてみた。

  • 管理人にメールで通知する機能が欲しい
    • 毎日更新を見張るのは大変であるため
  • 更新のたびにメールする必要はない
    • 煩雑であるため

ごく簡単に調べた結果 pkwkmail2.inc.php というプラグインが見つかった。 pkwkmail.inc.php を前身にもつプラグインである。設置は簡単と書いてある割に、少し迷うところがあったので記述しておきたい。

準備

  1. pkwkmail2.inc.php から pkwkmail2_088.zip (執筆時)をダウンロードし、php ファイルを plugin ディレクトリに移動させておく。
  2. 以下の注意があるため、アクセス制限を設定する。「手っ取り早く試してみる方法」を参考にしてもよい。

    このプラグインは pukiwiki.ini.php で $modifier として設定されている人が BASIC 認証に入っていないと編集できないようにしています。 また、設定情報を :config/plugin ... 以下の wiki ページに書き込むので、管理者以外が :config 以下を編集できるような環境では用いないでください(ページ名称がコロンで始まるページに編集認証をかけるなどしてください。

  3. 好きなページに(ページAとする)
    #pkwkmail2(0)

    と書く。

  4. ページAを凍結する。
  5. ページAに「管理画面」へのリンクが現れるので、設定を行う。
  6. テストでメールを送信してみる。

これで終了…のはずなのだが、メールアドレスが正しいものか判定する正規表現に誤りがあり、例えば"+"の文字が含まれるメールアドレスに送信しようとすると、「エラーで送信できなかった」旨が表示される。

メールアドレスの正規表現の訂正

メールアドレスを表す現実的な正規表現 にも

せめて + をlocal-partに含むメールアドレスを拒否するサービスがこの世から絶滅しますように。

とあるように、"+"の文字が含まれるメールアドレスが拒否されることは良くある。しかし、gmail を利用するときに、"id @gmail.com" 以外に "id+好きな文字@gmail.com" というメールアドレスが利用できるのは便利であるから、利用したい。これには、mail_chk_regex 関数の正規表現の部分を訂正すればよい。

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

が短くてよいが、「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ によれば、

/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$/

が正しいとのことである。もともとの正規表現

/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/

を上記のものに書き換えればよい。具体的には

 if( ! preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/i",$mailadrs ) ) {

を ” と / を適切にエスケープした

if( ! preg_match("/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+))*)|(?:\"(?:\\[\
^\r\n]|[^\\\"])*\")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+\/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\\
x5e-\x7e])*\])))$/i" ,$mailadrs) ) {

にする。PHPで(できるだけ)正しいメールアドレスをチェックする正規表現

http://fdays.blogspot.jp/2007/10/rfc-2822-j0hn-d0e-10-pregmatch-9.html

も参考にしたい。

misc

Posted by tako