PPPPPRIQIA Press (プププププリッキアプレス)

by 有限会社プリッキア

web・ホームページ・モバイルサイト制作の横浜にある制作会社PRIQIA(プリッキア)のスタッフブログです。

PHPMailerにハマッタ

投稿者: shimojoカテゴリ: CMS, プログラミングタグ:,

私事ですが、本日は私の誕生日でした。\(^◇^)/

社内の人たちに祝ってもらい、本日のブログネタ完成!
・・・と思ったのですが、写真は撮ってないし、
ブログとしてはちょっと文字数が足りないということで、
前回(2/22)に引き続き、技術系の話をします。

今回は開発者向けのコアな内容にします。
お題はPHPのメール送信ライブラリであるPHPMailer。

事の発端は弊社CMS担当から
「MODxでフォームからメールを送信すると送信者名が文字化けします」
の一言。

私もMODxで組んだフォームからメールを送信したことがありますが、
一度も文字化けが発生したことがありませんでした。

とはいえ実際に文字化けしたメールがある以上調査をせねば
ということでまずは文字化けしたメールを確認。

送信者名が↓の様になっています。

ここに非常に長い名前のメール送信者名\r\n を設定してみます

これを見てピンとくる人もいるかもしれませんが、
どうやら文字化けというより、改行コードがそのまま表示されている模様。
ということでそのあたりを中心に調査開始。

普段メールを使用していても、知っている人は少ないと思いますが、
メールの送信者名は文字をそのまま送っているのではなく、
Base64という方式に変換されて送信されています。
これは送る文字が日本語などであってもすべて英数字+α(64種類)
だけを使用して表すことができるというものです。
たとえば、問題の送信者名を変換すると

=?ISO-2022-JP?B?GyRCJW8hPCVrJUkbKEIgGyRCJW8lcxsoQiAbJEIlSCVsITwlRyUjGyhC?=

といった感じになります。(長いので一部抜粋)

この方式の難点は、64種類であらわすため文字の長さが約33%増加するところで、
メールの規格で定められた“78文字で改行するべき”という規格に簡単に接触し改行が行われます。

ということでこの改行を行っているところを調査すると、以下の記述を発見!

$encoded = addcslashes($str, “\0..\37\177\\\”");

これがなにをしているかというと
文字コードの0~31番(8進数で0~37)と127(8進数で177)と\と”を
文字コードから文字列に変換しますという処理。
改行コード(と再起コード)である10番(と13番)は0~31番に含まれるわけで・・・
しかもマルチバイト文字の場合のみ通るというピンポイント処理。

これを対処するには以下の三つが考えられます。
1.addcslashesの処理を改変する
2.処理を行っているメソッドをオーバーライドする。
3.あきらめて長文にならないようにする。

今回は自分で作成したフォームからの送信なので、
手軽さを考え1の対処をしました。↓

$encoded = addcslashes($str, “\0..\11\13..\14\16..\37\177\\\”");

とりあえず、これで問題なく送信されていますが、
オープンソースのコードは過信してはいけないようです。

と書いたのはいいのですが、つい先日このメールフォームスニペットの
新バージョンが出たようで、その中ではこの問題は対処されているそうですorz
あと一週間くらい早く出してほしかった・・・

TinyMCEには隠し設定がある!?

投稿者: shimojoカテゴリ: CMSタグ:

技術系の話がほとんど無いというのもどうかと思うので、今回はそれ系の話をしようと思います。

最近弊社では、modxというCMSを用いたサイトの管理を提案させて頂いています。
提案する側として、常により良い使い方を求めて日々勉強していますが、
ごく最近まで知らなかった設定の謎についてお話します。

modxでは1つのページをパーツごとに分割して作成することが出来ます。
例えば、ヘッダー、コンテンツ、フッターを別々に作成するなんてことが可能です。
また、作成画面はリッチテキストエディターを使用するため、
↓の図のようにグラフィカルな表示になっているので、直感的に操作ができてとても便利です。

blog0223_02

しかし、当然のことながら各パーツを別々に作るということは、ヘッダーで定義されたCSSファイルの情報は、
コンテンツの作成には反映されないという状態になります。
そのため、作成画面を開くと↓の図のように残念な感じで表示されてしまいます。

blog0223_04

そんなときのために、modxには作成画面に反映させるCSSを指定する設定が用意されています。

blog0223_03

これを指定すればすべて解決・・・と思っていたのですが、実はこれを指定しても作成画面には反映されないのです。

その原因を探るため、ググること約1ヶ月。
やっと見つけた答えは、リッチテキストエディターの設定情報がmodxのCSS指定を上書きしていたというものでした。。

このリッチテキストエディターは、modxをインストールするときに一緒にインストールされるもので、
元々modxの設定を上書く様になっているんです。
しかもそんな注意書きはどこにも書いてないし o(`ω´*)o

こんな隠し設定のようなものをなんで作るんでしょうか(-_-)

デフォルトの設定は信用してはいけないんですね。。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes