ようこそゲストさん

CPA-LABテクニカル

メッセージ欄

2008年4月の日記

2008/04/30(水) Qdmailの構造-環境に応じて承継クラスを変更する

はてなブックマークの情報 はてなブックマークに登録 はてなブックマーク数 qdmailspok
高機能日本語PHPメールライブラリ-Qdmailは、ひとつのファイルで、通常の関数、クラスライブラリ、CakePHPコンポーネントの3種類を使い分けることができる、ハイブリッド型になっています。

クラスの構成としてはこんな感じ。
qdmail_uml.jpg

CakePHPの定数が定義されているかどうかによって、CakePHPの存在を認知しています。
CakePHPのコンポーネントとして読み込まれていれば、CakephpのObjectクラスを承継するようにしています。
(それ以外の時に、Objectクラスを承継しようとしても、Objectクラスが存在しないためエラーとなる。)

ただ、いきあたりばったりで作った面もあり、QdmailBaseの中身はもっと、OOP的な方法で出来たような気がします。
いずれ時間があったら、リファクタリングなるもので、もっとスマートに作り替えてみたいと思います*1

*1 : いつになることやら

2008/04/28(月) ウィルコムのデコメは、SoftbankMobileと同じ

こちらで、デコメール携帯4社MIMEマルチパート比較においてウィルコム等のデコメ*1の情報を求めていたけれども、ありがたいことに情報をいただいた。
WX330Kの実機から、デコメを送っていただき、その解析結果をここに書きたいと思う。
(情報提供:悩める技術者さん)

続きを読む

2008/04/24(木) CakePHP高機能メールコンポーネント-Qdmail

はてなブックマークの情報 はてなブックマークに登録 はてなブックマーク数 qdmailspok
QdmailをCakePHP対応にしてみました。

特徴

  • CakePHP1.1 & 1.2 の両方に対応
  • ひとつのファイルで、通常の使い方もCakePHPのコンポーネントとしても動作可能
  • CakePHPのビュー機構を利用可能
  • CakePHP1.2デフォルトのemailコンポーネントに比べ、マルチバイト処理に優れている
  • Semailコンポーネントに比べ、汎用性が高い
  • インラインHTMLメール機能があり、デコメも送信可能

余談

意外にすんなりとCakePHP対応ができたような気がします。
ただ、1.1は使ったことがなかったので、ちょっと戸惑いました。1.2と微妙に違うんですよね。
CakePHPと通常ライブラリの共用ファイルにできたのでほっとしています*1
普通のライブラリとしても使えるので、他のフレームワークでも問題なく使えると思います。

Semailは、emailコンポーネントの改良版でしたが、Qdmailは、すべてゼロからのコード書き下ろしです。
ライセンスについては迷いましたが、AGPLv3です。CakePHPのライセンスとは異なりますので、ご留意ください。(追記:ライセンスはMITライセンスに変更しました。CakePHPと同じです。)
個人的には、もはやSemailを使う理由はないような気がします。実行速度以外のすべての面においてQdmailが勝ります。(単純なテキストメールだけであれば、Semailの方が軽くていいかも知れない)
SemailとQdmailを立て続けにリリースし、メールオタクのようになってしまいました*2
もう疲れたので、今後はゆっくりペースにします*3
コメントいただいた方にはすごく感謝しております。
アクセス数はそれなりにあるのですが、あまりリアクションもないので、まあ、そんなに需要はなかったということなのでしょう。自己満足ですが、ただ単に「簡単にメールを送りたい」というだけだったんですけどね。

*1 : 2つにしたら、今後それぞれのお守りをしなくちゃいけなくなるので

*2 : もともとさして詳しくなかったのですが

*3 : 本業もありますので

2008/04/23(水) PHP-mail関数よりSMTP送信の方が高速

はてなブックマークの情報 はてなブックマークに登録 はてなブックマーク数 qdmailspok
現在、QdmailのSMTP対応の作業中です。
ちまたでは、mail関数は、ソケット通信をその都度、ONOFFするので、SMTP送信の方が早い、と言われているようです。

Qdmailで100通のメールを自分あてに送ってみると以下のような結果になりました。

続きを読む

  • SMTP送信を使うべき3つの理由-PHP CPA-LABテクニカル spok
    ■さらば、mail,mb_send_mail関数SMTP送信を使うべし!mail,mb_send_mailはトラブルの元改行コードこちらmail関数のハマりどころ でも書いたように、mail関数は、改行コードが難解である。mb_send_mailも、文字化...

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日本語マルチバイトメールクラスライブラリ(別サイトです。)
  • デコメ。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/数...

2008/04/12(土) デコメール携帯4社MIMEマルチパート比較

デコメールの仕様の違いを明らかにする

携帯端末でのメールにデコメールなるものがある。
会社によって、デコレーションメール(au,EM)やら、デコレメール(SB)やら、デコラティブメール(WL)などの呼び名が違う。
呼び名が違えど、規格はいっしょ。ならば話は簡単なのだけど、そうは問屋がおろさない。
技術的に微妙に違う部分があり、現在開発中のメールラッパーも苦戦した。
デコメ対応高機能日本語メールライブラリQdmailとして公開しています。)
デコメールは、いわゆるHTMLメールの一類型といえるが、一般的なHTMLメールともMIMEのマルチパート構成が違うので、これもまたやっかいな問題であった。
せっかくなので、ここにまとめておく。

続きを読む

メールのマルチパートの構成

続きを読む

留意点

続きを読む

あなたの端末からデコメールを送って下さい!

続きを読む

  • ウィルコムのデコメは、SoftbankMobileと同じ CPA-LABテクニカル spok
    こちらで、デコメール携帯4社MIMEマルチパート比較においてウィルコム等のデコメ*1の情報を求めていたけれども、ありがたいことに情報をいただいた。WX330Kの実機から、デコメを送っていただき、その解析結果をここに書きたいと思う。(情報提供:悩める技術者さ...
  • デコメはQuoted-Printableエンコードで送られてくる。 CPA-LABテクニカル spok
    Eメールのエンコード方式にはいくつかある。7bit,8bit,Base64,Quoted-Printableと、主だったもので4種類。この中で、Quoted-Printableは、日本ではあまりポピュラーでなく*1未対応のメーラーもあるようだ。しかし、、、...

2008/04/09(水) 開発中・マルチバイト新メールライブラリ-PHP

はてなブックマークの情報 はてなブックマークに登録 はてなブックマーク数 qdmailspok
以前は、CakePHPのEmailコンポーネントを改造して、Semailを作ったけど、やはり、Emailコンポーネントの初期の実装に不満があるところがあり、ゼロから自分で、メールラッパーを作っている。
CakePHPに限らず、通常のPHPで使えるようにがんばっているけれど、意外にPHP4とPHP5の両方に対応させるのが大変。
最初からPHP4で作ればよかったのだけど、PHP5で作りはじめてしまったため、ダウングレード作業が思ったより手間がかかる。
また、「初心者には簡単に、上級者には詳細に」のコンセプトのため、入力されたパラメータの解析ルーチンが、大変面倒。たぶんコードの3分の2は、ユーザーインターフェース用で占められることになりそうだ。

開発状況

続きを読む

# 通りすがり 『かげながら応援しております。 頑張ってください! 』 (2008/04/22 13:43)

# spok 『ありがとうございます。なんとか形になってきたと思います。 http://www.cpa-lab.com/tech/0132』 (2008/04/24 23:52)

2008/04/05(土) PHPで簡単にメールを送りたいだけなのに。

はてなブックマークの情報 はてなブックマークに登録 はてなブックマーク数 qdmailspok
ユーザーからのアクションをきっかけにちょっとしたメールを送りたいことがある。

追記PHP高機能日本語メールライブラリQdmail完成しました。

それは、ユーザー登録の認証だったり、サンクスメールだったり、確認メールだったり。
しかし、PHPの mb_send_mail は、toヘッダへの日本語がうまく通らなかったり(上手にやればできるけど)、添付ファイルはかなり工夫しないと送れない。

続きを読む

そこで、なるべく簡単な、「日本語で、from,to,subject,添付ファイル、認証用url置換」ができるメールクラスを

作っている最中です。
どうなることやら。

ごついこといってしょぼいスクリプトしかでてこなかったらごめんなさい。


追記PHP高機能日本語メールライブラリQdmail完成しました。