ようこそゲストさん

CPA-LABテクニカル

2008/04/17(木) PHP日本語高機能メールライブラリ-Qdmail-デコメ対応-文字化けフリー

はてブ情報 はてブに登録 はてブ数 qdmailspok

Qdmailとは

Qdmailとは、PHPのマルチバイト環境(特に日本語)にて、「文字化けしない」「簡単に"デコメ"(デコメール)やHTMLメール等の電子メールを送信することができる」メールクラスライブラリです。(PHP4,PHP5の両方対応)
「初心者には簡単に、上級者には多彩に」のポリシーのもとに開発しました。
設定次第では、日本語だけでなく各国語対応ができる(はず)。
PHPには、"mb_send_mail"というメール関数もありますが、残念ながら、機能が限定的です。多くのマルチバイト圏言語の人々は、自国語でメールを送ることに、かなり苦労しているようです。

Qdmial-PHP日本語マルチバイトメールクラスライブラリ(別サイトです。)

参考:携帯4社デコメ・マルチパート比較

開発の背景

mb_send_mail
PHPには、mb_send_mail というマルチバイト用のメール関数がありますが、使い勝手が悪く、利用している人は少数かと思います。
かといって、Pear::Mailは仰々しいし、自分で英語圏用mail関数を使いこなすのも面倒だ。。。特に、ヘッダーのMIMEエンコード処理は間違いがちで、知らず知らずのうちに文字化けメールを送っていることも。。。。
CakePHPでの経験
CakePHPで遊んでいるうちに、CakePHP1.2ベータのe-mailコンポーネントに出会いました。
しかし、これもマルチバイトに弱く、文字化け多発です。しょうがないので、自分でe-mailコンポーネントを改良し、Semailというものを作りました。
しかし、もともとのe-mailコンポーネントの実装が柔軟性に欠ける感じだったので、限界がありました。
また、当然のことですが、CakePHPのコンポーネントであるため、CakePHPを使うまでもない時や、ちょこっと日本語メールを送りたい時には、不便です。
そこで一般的なWEBアプリケーションでも使えるような、本当のmb_send_mailが欲しいな、と思っていました。
現在のQdmailは、そのままではCakePHPのコンポーネントとしては動作しませんが、コントローラーの中でインクルードして、viewの出力を突っ込めば、使えるはずです。それはCakePHPのみならず、他のフレームワークでも同じです。

簡単にメールを送りたい
そもそもメール機能なんて、「使う側からみれば」、当たり前の機能なのに、なんでこんなに大変な思いをしなければならないのか。
(技術的にはいろいろあって大変なのはわかるけど)
携帯にデコメを送りたい
ふと携帯にデコメを送るには、を調べていると、インラインHTMLメールというものの存在を知りました。恥ずかしながら、それまでよく知りませんでした。
調べると、htmlとmhtlのあいのこのようなもので、なかなかおもしろい構造でした。
しかし、Semailではもう限界であり、新たなメールクラスライブラリを作ろうと思い立ったのです。
まあしかし
どこまで需要があるのかわかりませんが、一応、AGPLv3というFSF(フリーソフトウエア財団)のライセンスを適用して公開してみました。(追記:もっと緩やかなMITライセンスに変更しました。)
手間はむちゃくちゃかかった
コアの部分は、2日間の休みをつぶして、すぐにできたのですが、ユーザーインターフェイスで苦しみました。コードの半分は、ユーザーインターフェイスです。
かつての私のように、オブジェクト指向って何?の状態の人でも使えるようにするためには、どうすればいいのか、という点に悩みました。
ファイル1個にこだわった。
Pearもそうですが、初心者にとって、たくさんのファイルを適切な場所に配置し、適切にインクルードして使うのは、結構たいへんです。
なので、「ファイルは1個だけ」、ということにこだわりました。
これは上級者にとってみても、手間がかからない、という点で利点だと思っています。
コードが2000行を超え、決してスマートではありませんが、これからもできるだけファイル1個に納めたいです。
PHP4対応は異常に大変
当初PHP5でコードを書いていたせいもあるのですが、PHP5のオブジェクト指向的書き方に慣れてしまうと、もうPHP4には戻りたくありません。
途中からPHP4にして開発しましたが、「あ、これもダメなんだっけ。あれもダメなんだっけ。」とイライラがつのるばかり。
しかし、未だPHP5に切り替わっていないレンタルサーバーもあるようなので、ふんばってみました。PHP5だけの対応なら、コードの量は、2/3になっていたでしょう。
個人的に気に入っているのは。
デコメ対応と、インテリジェントワードラップ、simpleReplace*1です。
おいおい、あちらのサイトで説明を書いていこうと思います。(その前に、バグ出まくりだったりして。)
あと、送信ログ、エラーログ機能もあるので、万が一、外部からスパムなどに使われても、ログをチェックすれば、すぐにわかるようになっています。


本業が繁忙期に入っており、今後、どこまで使い方の説明やら、保守ができるかどうかわかりませんが。。。。

*1 : 簡易テンプレート機能

Qdmailの特徴(機能)Feature

  • PHPの対応バージョン
    • PHP4,PHP5の両方に対応
  • 簡単にできること
    • 日本語メール(日本語本文、日本語ヘッダー)
    • 日本語以外のマルチバイト各国語メール
    • 添付ファイル(日本語添付ファイル名OK)
    • 携帯デコレーションメール対応(携帯4社自動判別対応。たぶん)(日本のみ)
    • インテリジェント・ワードラップ(http://の列は、折り返しをしない等が指定できる)(文字数でなく、文字幅での折り返しも可能。英数字と日本語が混ざっても綺麗!)
    • 簡易テンプレート機能(名前やアドレス等の置き換えが可能)
    • オブジェクト指向がわからなくても、関数ライクに各種設定可能(配列地獄形式)

  • 自動でやってくれること
    • 文字コード判別
    • MIME判定
    • HTMLメール時の代替テキスト文生成機能
    • 様々な指定省略時のデフォルト設定
  • 多彩にできること
    • 宛先分離機能(複数宛先に1通づつ送付する機能)
    • 複雑なMIMEタイプ指定
    • 複雑なマルチパート構成
    • 複雑なワードラップ
    • 多彩な指定方法
    • 常に管理者にBCC可能
    • iso-2022-jp以外にも、utf-8,Shift-JIS等の文字セット可能
    • ヘッダー、本文、添付ファイルの文字コードをそれぞれ別に指定可能
    • 本文base64エンコードの指定可能
    • 本文Quoted-printableエンコード指定可能
    • 送信ログ、エラーログ作成機能
    • 不具合時のデバッグログ作成機能
    • 新たな方式のデコメ対応機種がでても簡単に追加可能
    • 独自のメールアドレスチェック(バリデーション)関数を指定可能
    • デコメ、インラインHTMLメール時のContent-Idを任意に指定可能
    • sendmailへのオプション渡し可能

  • デフォルト設定(変更可能です)
項目設定値
文字コードiso-2022-jp(jis)
エンコード7bitノーマル
自動MIME判定ON
インテリジェントワードラップON
簡易テンプレート機能OFF
宛先分離機能OFF
HTMLメール時の代替テキスト文生成ON
デコメ自動判定ON
  • 今後の課題
    • SMTP送信
    • CakePHP対応
    • デコメ・テンプレート解析機能
    • PGP対応
Qdmial-PHP日本語マルチバイトメールクラスライブラリ(別サイトです。)

名前:  非公開コメント   

  • TB-URL  http://cpa-lab.com/tech/0127/tb/
  • デコメ。auのContent-IDの制約。@はひとつだけ。 CPA-LABテクニカル spok
    ■デコメはどうやって、画像を特定するのか通常のhtmlメールで例えばgif画像を指定するには、次のようにする。<img src="http://example.com/hoge/images/filename.gif">このファイル名でどの画像...
  • 弘法もメールの誤り? CPA-LABテクニカル spok
    とある、逆引き~PHPをWEBで発売している会社さんから、改訂版のお知らせが届いた。~がバージョンアップいたしましたので、ご連絡申し上げます。最新版は下記 URL よりダウンロードください。http://www.example.com/hogehoge/数...