▼ 2008/10/12(日) ただ簡単にメールを送りたいだけだったのにPHP
PHPで簡単にメールを送りたいだけなのに。から、半年。
次回のメジャーバージョンアップは、絵文字ですが、本業が忙しく、しばらく後になりそうです。
それ以外は機能拡張の予定もなくなってきました。後は安定性の向上です。
日本語高機能PHPライブラリQdmailはそれなりに進化しました。
当初は、日本語を簡単に扱いたいという点からはじまり、途中からCakePHP対応、デコメ対応、そして電子署名。
動機は単純でした。
あるサイトのメールフォームに打ち込んでもらったメールアドレスに、添付ファイルを送信する、というサービスを作るのに、なんと苦労したことか。
mail関数、mb_send_mail関数も、デフォルトでは役に立たず、Pear::Mailは、メールの内部構造(マルチパート構成)をきちんと理解しなければ使いこなせず。。。。
まずは、マルチパートの理解、文字コードの理解(特に改行コード!)、SMTPの理解、各種RFCの理解、MTAの実装の理解(未だ足りない)、各種メーラーの実装の把握、プログラミングテクニックにおけるセキュリティの問題、効率的コードの問題、メンテナンス性の髙コードの構築、利用されるOSの理解、PHP4とPHP5の違い、PHPフレームワークの理解
それらでもうまくいかず、多くの方からフィードバック、エラー報告などをいただきました。
一部はまだ未解決ですが、それなりに他のPHPメールライブラリよりも、「文字化けしない」「簡単」という点は、ライバルを大きく引き離したのではないかと自負しています。
次回のメジャーバージョンアップは、絵文字ですが、本業が忙しく、しばらく後になりそうです。
それ以外は機能拡張の予定もなくなってきました。後は安定性の向上です。
日本語高機能PHPライブラリQdmailはそれなりに進化しました。
当初は、日本語を簡単に扱いたいという点からはじまり、途中からCakePHP対応、デコメ対応、そして電子署名。
動機は単純でした。
あるサイトのメールフォームに打ち込んでもらったメールアドレスに、添付ファイルを送信する、というサービスを作るのに、なんと苦労したことか。
mail関数、mb_send_mail関数も、デフォルトでは役に立たず、Pear::Mailは、メールの内部構造(マルチパート構成)をきちんと理解しなければ使いこなせず。。。。
ただ、日本語で添付ファイルを送りたいだけなのに。文字コードなんて気にせずに。それをかなえるための努力は日曜プログラマにしては、相当困難な道のりでした。
まずは、マルチパートの理解、文字コードの理解(特に改行コード!)、SMTPの理解、各種RFCの理解、MTAの実装の理解(未だ足りない)、各種メーラーの実装の把握、プログラミングテクニックにおけるセキュリティの問題、効率的コードの問題、メンテナンス性の髙コードの構築、利用されるOSの理解、PHP4とPHP5の違い、PHPフレームワークの理解
それらでもうまくいかず、多くの方からフィードバック、エラー報告などをいただきました。
一部はまだ未解決ですが、それなりに他のPHPメールライブラリよりも、「文字化けしない」「簡単」という点は、ライバルを大きく引き離したのではないかと自負しています。
▼ コメント(0件)
▼ 2008/10/01(水) PHPフレームワークで日本語メール送信。Qdmailが5種フレームワークに対応
■Qdmailが主要5フレームワークに対応。
Qdmailは、バージョン1.1.3bをもって、PHPの主要フレームワーク5種に対応しました。Symfony,CakePHP,ZendFramework,CodeIgniter,Ethnaの5つです。
▼ 2008/09/30(火) Ethnaで日本語メール送信
PHPフレームワークEthnaにも、MailSenderという名の、メール送信ライブラリがあります。シンプルでわかりやすいのですが、送信文字コードがiso-2022-jpだけなど機能が限られます。
高機能日本語メールライブラリQdmailを使えば、様々な文字コード、Base64エンコード、HTMLメール、デコメなど、多彩なメールをEthnaから送信することができます。
高機能日本語メールライブラリQdmailを使えば、様々な文字コード、Base64エンコード、HTMLメール、デコメなど、多彩なメールをEthnaから送信することができます。
▼ 2008/09/27(土) Simfonyで日本語メール送信
QdmailがSymfony対応となりました。
Symfonyで日本語メールbyQdmail
今回、初めてSymfonyを触りましたが、ちょっとややこしや~という感想。
大規模サイトならいいのでしょうかね。
でも、PHP5専用だけあって、コードはCakePHPよりもはるかに綺麗で読みやすい。
やはりPHP4に対応させるのは大変なんですよね。。。。
今後、Qdmailのメジャーバージョンアップ時には、PHP5専用にしようかと。
ともあれ、Symfonyで簡単に日本語メールを送信したい方、デコメを送信したい方にQdmail。
電子署名だってOKっすよ。
Symfonyには、すでにjpMailPluginというプラグインを公開している方がいらっしゃいます。
Symfonyu使いの方なので、Symfonyの機能を上手に利用し、シンプルで大変すぐれたライブラリです。
しかし、ISO-2022-JP以外のメールや、デコメなどを送信しようとするとさらなる改造が必要になります。シンプルメールで力強いメールは、jpMailPluginにお任せし、Qdmailはオールマイティを目指していきます。(その分、重くなるけど)
日本語メール送信(その1 symfony編)-LinuxなWEBデザイナーの覚書き。
symfonyのjpMailPlugin(メール送信プラグイン)の使い方のまとめ-アシアルブログ
Symfonyで日本語メールbyQdmail
今回、初めてSymfonyを触りましたが、ちょっとややこしや~という感想。
大規模サイトならいいのでしょうかね。
でも、PHP5専用だけあって、コードはCakePHPよりもはるかに綺麗で読みやすい。
やはりPHP4に対応させるのは大変なんですよね。。。。
今後、Qdmailのメジャーバージョンアップ時には、PHP5専用にしようかと。
ともあれ、Symfonyで簡単に日本語メールを送信したい方、デコメを送信したい方にQdmail。
電子署名だってOKっすよ。
Symfonyには、すでにjpMailPluginというプラグインを公開している方がいらっしゃいます。
Symfonyu使いの方なので、Symfonyの機能を上手に利用し、シンプルで大変すぐれたライブラリです。
しかし、ISO-2022-JP以外のメールや、デコメなどを送信しようとするとさらなる改造が必要になります。シンプルメールで力強いメールは、jpMailPluginにお任せし、Qdmailはオールマイティを目指していきます。(その分、重くなるけど)
参考にさせていただいたサイト
symfonyでの日本語メール送信-ぬかるむ日々日本語メール送信(その1 symfony編)-LinuxなWEBデザイナーの覚書き。
symfonyのjpMailPlugin(メール送信プラグイン)の使い方のまとめ-アシアルブログ
▼ 2008/09/23(火) ZendFrameWorkで日本語完璧メール-Qdmailを利用する
ZendFrameWorkには、Zend_Mailというライブラリがありますが、日本語の処理に難点があるようです。
そこで、PHP日本語多機能メールコンポーネントQdmailをZendFrameWorkで使用してみましょう。
そこで、PHP日本語多機能メールコンポーネントQdmailをZendFrameWorkで使用してみましょう。
▼ 2008/09/11(木) dateヘッダーは送信日時ではない
■Dateヘッダーの意味
メールのDateヘッダーは、通常「送信日時を表す」としか、書いていないことが多い。しかし、RFC2822によれば
http://www.puni.net/~mimori/rfc/rfc2822.txt
いかなる場合でも、特にメッセージが実際に配送されている時間を含むことを意味せず、むしろ人またはメッセージの人以外の著者がメッセージを最終形にした、配送の準備ができたという時間を示す。メーラーの実装も様々で、「後で送信する」のボタンを押した日時であったり、実際に中継サーバーに送信した日時であったり、切り替えができるものもあったりするようである。
.....complete and ready toenter the mail delivery system.
RFC2822を解釈すると、「(A)出来上がって 、かつ、(B)送信準備ができた」時刻ということである。
厳密に考えれば、「後で送信する」のボタンを押した時が、もっともRFC2822には合致する。
しかし、多くの人が、「メールの配信開始時刻」つまり、インターネットに放たれた時刻、と考えているために、RFCは無視し、実際に中継サーバーに送信した日時をつけるメーラーもあるのだろう。
Dateヘッダーを付け忘れたら?
最初のSMTPサーバー自動的に付けるのが慣例です。そこでQdmailは
Qdmail 1.1.1b から、タイムゾーンを設定すれば、dateヘッダーを自動的につけるようにしました。▼ 2008/09/11(木) 「SafeMode力」を鍛える
PHP日本語メール送信ライブラリQdmailを1.1.1bにバージョンアップして、SafeMode時には、mail関数の第5引数を指定しないようにしました。
私自身はSafeModeって使ったことないのだけれど、レンタルサーバーでは、SafeModeになっていることもあるそうな。
本当にいろんな環境があるもので。。。
Qdmailで日本語のメール送信-CakePHPクッキング
私自身はSafeModeって使ったことないのだけれど、レンタルサーバーでは、SafeModeになっていることもあるそうな。
SafeModeの検出方法
if(ini_get('safe_mode')){
// SafeMode時の処理
}
本当にいろんな環境があるもので。。。
Thanks to
こちらでご指摘ありがとうございました。Qdmailで日本語のメール送信-CakePHPクッキング
▼ 2008/09/06(土) Qdmailが電子署名に対応(S/MIME)
■S/MIME方式に対応
PHP日本語メールライブラリQdmailが電子署名に対応しました。S/MIME方式というもので、最近の銀行からのお知らせメールなどは皆、この方式です。
一般の企業が使用している例は多くはありませんが、メールの暗号化と異なり、最近急速に普及しているようです。
特にID,パスワードを扱っているサイトは、悪質な第三者によるフィッシングサイト被害を心配しないといけませんが、常に自社から顧客に出すメールには電子署名をつける、という対応をしておくと、お客様も安心です。
使い方などはこちら
Qdmailの電子署名説明 Qdmail電子署名使用方法
なお、この機能を使用するには、OpenSSLモジュールがPHPに組み込まれている必要があります。
▼ 2008/09/05(金) 電子署名をなんとか理解する
■電子署名をプログラマ的に理解する
初心者PHPプログラマが理解した電子署名の理解の仕方をここに記します。もし、間違ったことを書いていたら、ぜひご指摘ください。
「ある文章」のハッシュ値をとる。
$hash = sha1('「ある文章」');
この$hashを、スポックの秘密鍵で暗号化する。$hash_angou = himitukagi_de_angou( $hash );「ある文章」の後に、$hash_angouとスポックの公開鍵を並べたファイル。
それが、署名された文章である。
署名された文章
| 「ある文章」 | スポックの公開鍵+スポックの名前 | $hash_angou |
▼ 2008/09/04(木) 電子署名ではまったopenssl_pkcs7_sign。また改行コードかよ。
PHPのopenssl_pkcs7_signでS/MIMEの電子署名をして、送信したところ、OoutlookExpressでは、「メッセージが改ざんされています。」のエラーがでた。
秀丸メールや、Beckeyではエラーが出ない。なんでやねん。とかなり長考。
そこで、OutlookExpressから電子署名付きで送ったメールと、openssl_pkcs7_signで作成したメールの中身を比べてみた。
様々な違いがあったのだが、結局、原因は、以下のとおり。
つまり、openssl_pkcs7_signは悪くない(この場合は)。
ただ、openssl_pkcs7_signに突っ込んだメール本文の最後に改行がない場合、OutlookExpressでは、メッセージの検証ができないようだ。
よくみるとPHPマニュアルにつぎの記述があった。
秀丸メールや、Beckeyではエラーが出ない。なんでやねん。とかなり長考。
そこで、OutlookExpressから電子署名付きで送ったメールと、openssl_pkcs7_signで作成したメールの中身を比べてみた。
様々な違いがあったのだが、結局、原因は、以下のとおり。
メッセージ本文の最後の行に改行がついているかいないかだった。(PHP4.2.5)
つまり、openssl_pkcs7_signは悪くない(この場合は)。
ただ、openssl_pkcs7_signに突っ込んだメール本文の最後に改行がない場合、OutlookExpressでは、メッセージの検証ができないようだ。
よくみるとPHPマニュアルにつぎの記述があった。
▼ 2008/09/03(水) PHPで電子署名openssl_pkcs7_signのはまりどころ
現在、Qdmailを電子署名できるように作業中。
Qdmailの当初リリース時は、PGP対応にしようと思っていたのだけれど、PHPでは、S/MIMEの方が簡単に対応できるのと、どうもPGPよりS/MIMEの方が最近は優勢のようなので、S/MIMEにまずは対応させようとしている。
が、そこではまったことが。。。。
Qdmailの当初リリース時は、PGP対応にしようと思っていたのだけれど、PHPでは、S/MIMEの方が簡単に対応できるのと、どうもPGPよりS/MIMEの方が最近は優勢のようなので、S/MIMEにまずは対応させようとしている。
が、そこではまったことが。。。。
▼ 2008/09/02(火) わたしが知らないメールの重要度は、きっとあなたが読んでいる
メールの重要度というのがあります。私はほとんど使わないのですが、たまに「重要」なメールを受け取ることがあります。
重要度もヘッダーに、値を設定するだけなのですが、歴史的経緯から、メーラーが独自に設定しているものもあり、結構面倒です。
というわけで、Qdmailでは、メール重要度メソッド、priority() で、上記の4つのヘッダーを一気に設定するようになっています。
しかし、「重要」なメールは何度も受け取ったことがあるのですが、「重要度低」というメールは受け取ったことがありません。使う人はいるのでしょうか。
重要度といっても、結局はメーラーがどう解釈するかなので、まあ気休めに近いかも知れないですね。Subjectヘッダーに【重要】とか入っている方が、よっぽど重要っぽいです。
それにつけても、ホッテントリメーカーさんはすごいですなあ。
重要度もヘッダーに、値を設定するだけなのですが、歴史的経緯から、メーラーが独自に設定しているものもあり、結構面倒です。
メールの重要度ヘッダー
| 重要度 | 高 | 中 | 低 |
| X-Priority | 1,2 | 3 | 4,5 |
| Priority | urgent | normal | non-urgent |
| X-MsMail-Priotiry | High | Normal | Low |
| Importance | High | Normal | Low |
しかし、「重要」なメールは何度も受け取ったことがあるのですが、「重要度低」というメールは受け取ったことがありません。使う人はいるのでしょうか。
重要度といっても、結局はメーラーがどう解釈するかなので、まあ気休めに近いかも知れないですね。Subjectヘッダーに【重要】とか入っている方が、よっぽど重要っぽいです。
参考にさせていただいたサイト
PHPでメールの重要度を設定する-Shin x blogそれにつけても、ホッテントリメーカーさんはすごいですなあ。
▼ 2008/09/01(月) Docomoテンプレートでauにデコメ送信
Qdmail 1.0.7b以降では、デコメテンプレートを本文として入力すると、それを解析してデコメとして送信する機能があります。(ただし、Qdmailreceiverが必要)。
これで何がいいかというと、ドコモ(Docomo)のテンプレで、au端末やソフトバンク端末にデコメを送ったりできるということです。
もちろん、auテンプレートでドコモやSoftbank端末にデコメを送ることもできます。
つまり、ひとつのテンプレートで全キャリアの端末にデコメを送ることができるということです。
それどころか、テンプレートでなくても、ひとつのデコメから、全キャリアに応じたデコメマルチパートに変換できるわけで、テンプレートの様式の幅が広がる、というわけです。
普通のMHTL(インラインHTML)メール本文を引数にすれば、それでもOK。
なんか。。。マニアですなあ。
これで何がいいかというと、ドコモ(Docomo)のテンプレで、au端末やソフトバンク端末にデコメを送ったりできるということです。
もちろん、auテンプレートでドコモやSoftbank端末にデコメを送ることもできます。
つまり、ひとつのテンプレートで全キャリアの端末にデコメを送ることができるということです。
それどころか、テンプレートでなくても、ひとつのデコメから、全キャリアに応じたデコメマルチパートに変換できるわけで、テンプレートの様式の幅が広がる、というわけです。
普通のMHTL(インラインHTML)メール本文を引数にすれば、それでもOK。
なんか。。。マニアですなあ。
▼ 2008/08/31(日) ke-tai.orgが想像以上に凄い件について
ke-tai.orgさんにQdmailを紹介していただいた。
全キャリア対応のデコメールの作成・変換が行えるPHPライブラリQdmail-ke-tai.org
携帯関連の情報が豊富なので、よく参照させていただいておりました。
Qdmailでデコメ関連の機能を強化したので、掲載依頼をしたら、快諾していただけました。多謝。多謝。
全キャリア対応のデコメールの作成・変換が行えるPHPライブラリQdmail-ke-tai.org
携帯関連の情報が豊富なので、よく参照させていただいておりました。
Qdmailでデコメ関連の機能を強化したので、掲載依頼をしたら、快諾していただけました。多謝。多謝。
▼ 2008/08/27(水) デコメテンプレート変換はじめてガイド
デコメ(デコメール)のテンプレートはキャリア毎に仕様が異なる。今回のqdmailバージョンアップでは、デコメテンプレート変換をできるようにした。
しかもテンプレート変換だけでなく、通常のメールや受け取ったデコメデータから、テンプレートを作成してくれるスグレモノ(のはず)。
なお、QdmailReceiverというQdシリーズのメールでコードソフトが必要です(使い方は簡単)。
使い方は、Qdmailデコメテンプレート変換マニュアルをご覧下さい。
その際には、ご自分のPCメールアドレスにCCしてください(しなくてもいいけど)。
PCメールから普通にメールしていただいても大丈夫です。なんとなく怖い方は(メルアドの収集なんてしていないですから安心はして欲しいのですが)、捨てアドから、以下のメールになんでもいいのでメールしてみてください。
すると。。。。
携帯アドレスとCcアドレスに、その送ったデコメが、ドコモ(Docomo)、au、ソフトバンク(Softbank)の3つのキャリアのデコメテンプレートに変換され、その変換されたファイルが添付されたメールが送られてくるはずです。
お試しあれ。

うまく読み取れない方は、decotest987 あっとまーく hal456 ドット netまでデコメを送ってみて下さい。
ちなみに、デコメでなくても、普通のメールを送っても、デコメテンプレートになって返ってきます。
このサービスのサンプルコードはこちら
しかもテンプレート変換だけでなく、通常のメールや受け取ったデコメデータから、テンプレートを作成してくれるスグレモノ(のはず)。
なお、QdmailReceiverというQdシリーズのメールでコードソフトが必要です(使い方は簡単)。
使い方は、Qdmailデコメテンプレート変換マニュアルをご覧下さい。
これを使った試験サービス--デコメを3キャリ対応デコメテンプレートに変換
この記事の最後のQRコードを読み取って、携帯電話からメールを送ってみて下さい。その際には、ご自分のPCメールアドレスにCCしてください(しなくてもいいけど)。
PCメールから普通にメールしていただいても大丈夫です。なんとなく怖い方は(メルアドの収集なんてしていないですから安心はして欲しいのですが)、捨てアドから、以下のメールになんでもいいのでメールしてみてください。
すると。。。。
携帯アドレスとCcアドレスに、その送ったデコメが、ドコモ(Docomo)、au、ソフトバンク(Softbank)の3つのキャリアのデコメテンプレートに変換され、その変換されたファイルが添付されたメールが送られてくるはずです。
お試しあれ。
うまく読み取れない方は、decotest987 あっとまーく hal456 ドット netまでデコメを送ってみて下さい。
ちなみに、デコメでなくても、普通のメールを送っても、デコメテンプレートになって返ってきます。
このサービスのサンプルコードはこちら
▼ 2008/08/20(水) タイポが止まらない
Qdmailでまたもやタイポミス。
相当長い間気づかなかった。
メールヘッダーのContent-type:の構築にて、attachmentとすべきところをattachementとしていた。。。。
これって、一番最初のバージョンからだよね。
このせいで、携帯端末のauでは添付ファイルが正常に認識されなかった模様。
指摘していただいたユーザーに感謝。指摘がなければずっと気づかなかっただろう。
でもだいぶすっきりした感じ。
ユーザーにおかれましては、最新版にアップデートしてください。
Qdmailは常に最新版推奨です。
相当長い間気づかなかった。
メールヘッダーのContent-type:の構築にて、attachmentとすべきところをattachementとしていた。。。。
これって、一番最初のバージョンからだよね。
このせいで、携帯端末のauでは添付ファイルが正常に認識されなかった模様。
指摘していただいたユーザーに感謝。指摘がなければずっと気づかなかっただろう。
でもだいぶすっきりした感じ。
ユーザーにおかれましては、最新版にアップデートしてください。
Qdmailは常に最新版推奨です。
▼ 2008/08/18(月) テストの限界
Qdmailの開発でえらいポカをした。
単純なテストを忘れたために、一番基本的な使い方でエラーがでるバグ。
複雑な指定ができるインターフェイスを設計した場合、一番複雑なパターンでテストはするのだけれど、今回は、最も単純なパターンでのテストを忘れていた。
今回のバグは、qd_send_mailの第1引数が配列でなく、単純なstringタイプの時にエラーが出ていた。
機械的にすべてのパターンを試すようなテストのためのプログラムを組めばいいのだろうけど。。。。。
今後の開発ツールとしては必要なのだろうけれど、おそらく大幅な改編はしないであろうQdmailにそこまでの労力を注ぎ込むかどうか。。。。
ぼちぼち本業サイトの繁忙期でもあるし、どうしましょう。
単純なテストを忘れたために、一番基本的な使い方でエラーがでるバグ。
複雑な指定ができるインターフェイスを設計した場合、一番複雑なパターンでテストはするのだけれど、今回は、最も単純なパターンでのテストを忘れていた。
今回のバグは、qd_send_mailの第1引数が配列でなく、単純なstringタイプの時にエラーが出ていた。
機械的にすべてのパターンを試すようなテストのためのプログラムを組めばいいのだろうけど。。。。。
今後の開発ツールとしては必要なのだろうけれど、おそらく大幅な改編はしないであろうQdmailにそこまでの労力を注ぎ込むかどうか。。。。
ぼちぼち本業サイトの繁忙期でもあるし、どうしましょう。
▼ 2008/08/14(木) メールのデータサイズを知る
高機能メールコンポーネントQdmailの1.0.3bから、メールのデータサイズ(バイト数)を取得できるようにしました。
http://hal456.net/qdmail/size
デコメなどでは、容量制限を守らなくてはいけない場合があり、メール送信前に、制限値を超えているかどうかを確認する必要もあるのかな、と思って実装してみました。
http://hal456.net/qdmail/size
デコメなどでは、容量制限を守らなくてはいけない場合があり、メール送信前に、制限値を超えているかどうかを確認する必要もあるのかな、と思って実装してみました。
▼ 2008/08/13(水) エラーの隠蔽
高機能メールコンポーネントQdmailでは、発するエラーを画面に表示しないこともできます。
Qdmailのエラー処理
そうしないと、残念ながらこうなってしまいます。
http://www.namikawa.co.jp/dataupload/registration_send.php
(エラーの画面なので、いつなくなるかわかりません。)
でも、運用時には必ず、
これで画面にエラー出力をすることはありません。他でエラーを検知する必要はありますが。
というか、これをデフォルトにしたほうがいいのだろうか。。。。
Qdmailのエラー処理
そうしないと、残念ながらこうなってしまいます。
http://www.namikawa.co.jp/dataupload/registration_send.php
(エラーの画面なので、いつなくなるかわかりません。)
Qdmail error: Must Header is not exist 'TO' line -> 1537 Qdmail error: No Receipt line -> 2159 Qdmail error: No send . Because PHP mail function replied error line -> 1500 Qdmail error: Send Error line -> 1436 Qdmail error: No send . Because PHP mail function replied error line -> 1500 Qdmail error: Send Error line -> 1436このエラーの例をみて、ああ、エラー出力にも、Qdmailのバージョンを表示させたほうがいいな、と思い、あるバージョンからは、エラー時にバージョンも表示するようにしています。
でも、運用時には必ず、
$mail -> errorDisplay( false );としたほうがいいですね。
これで画面にエラー出力をすることはありません。他でエラーを検知する必要はありますが。
というか、これをデフォルトにしたほうがいいのだろうか。。。。