Zend_Mailで日本語のFrom情報を扱う

以前の記事で、Fromの名前の部分が化けてしまうということを書きましたが、
解決方法がわかったので、ここに残しておきます。

参考になったのは http://iandeth.dyndns.org/mt/ian/archives/000628.html です。
ここに、日本語のヘッダーを扱うためには、ISO-2022-JPに文字コードを変換して、
さらにbase64でエンコードして、さらに “=?ISO-2022-JP?B?”と”?=”で囲む必要があると。
今まで、mb_encode_mimeheaderを何も考えずに使っていましたが、
内部では上記のbase64エンコード以降のことをやってくれていたんですね。

ここまでを踏まえて、Zend_Mailのソースを見たところ、メールヘッダーはすべて、
base64ではなく、printableでエンコードされていました。
文字化けの原因はここでした。日本語に対応した処理でなかったとうことです。

しかし、printableでエンコードしている部分( _encodeHeaderメソッド)を、
base64でエンコードするようにしてしまうと、送信日時等の日本語が入ることがない
ヘッダーが受信側で正確にデコードされなくなってしまいます。

base64でエンコードしないとおかしくなるのは、Fromです。(場合によっては、Subjectも)
なので、setFromメソッドで、_encodeHeaderメソッドを呼び出している部分を、
mb_encode_mimeheaderを使ってエンコードするように変更したらOKです。

$this->_encodeHeader(‘”‘.$name.'”‘)

  ↓

mb_encode_mimeheader(‘”‘.$name.'”‘, ‘ISO-2022-JP’)

mb_encode_mimeheaderについては、下記をご参照ください。
http://phpspot.net/php/man/php/function.mb-encode-mimeheader.html

プログラムを設置しているサーバからZend_Mailだけを使って送信する場合は、
必ず文字化けするようなので、この対応は必須です。
メールサーバにSMTP認証して送信する場合(Zend_Mail_Transport_Smtp利用)は、
上記対応をしなくても、文字化けしていない場合もありました。
メールサーバ側で、うまいことやってくれているのかもしれません。

instanceof って便利

Zendを使うようになってから、同時に利用するようになったもの。
if 文での instanceof 判定。判定対象のオブジェクトの型を判定してくれる。

Dbから値を取得した際の処理に便利。

if ($rows instanceof Zend_Db_Table_Row)  の場合、
if ($rows instanceof Zend_Db_Table_RowSet) の場合。両方の処理を準備する。

Zend_Db_Table_Rowsetの場合は、Zend_Db_Table_Rowの場合の処理を
再帰的に呼び出すことでOKな場合も多々あります。

感覚でいうと1次元配列、2次元配列を気にせずに処理できるメソッドができる。
1次元配列と2次元配列を簡単に判定する方法を知らないから、とても便利に感じる。
たとえば、Dbから取得したカラム毎の合計値を取得するなら、
下記のように処理すればOKです。

public function getSumList($rows, $sumList=null)
{
 if (is_null($sumList)) $sumList = $this->getInitial();

 if (!is_null($rows)){
  if ($rows instanceof Zend_Db_Table_Row){
   $list = $rows->toArray();
   foreach ($list as $key => $value) $sumList[$key] += $value;
  }else if ($rows instanceof Zend_Db_Table_Rowset){
   foreach ($rows as $row) $sumList = $this->getSumList($row, $sumList);
  }
 }

 return $sumList;
}

$this->getInitial()は、$sumListに初期値を設定する関数です。
+= するためにnullだと気持ちが悪いので、0を設定しているだけの処理です。
カラム名は、Zend_Db_Table_Abstractクラスのinfo()関数で簡単にとってこれます。

カラム名の取得については、
http://framework.zend.com/manual/ja/zend.db.table.html#zend.db.table.info
10.5.10. テーブルのメタデータ情報の取得 を見てみてください。

桜の開花時期

土曜日、鎌倉に行ってきた。
電車に揺られるのもいいし、緑に囲まれるのもいいと思ったから。

銭洗弁財天、鶴岡八幡宮、小町通り。どれもいい気分になれた。
小道を歩くときに、道に沿って流れいてる用水路(地元では溝って言ってた)。
私は、これが好きだ。水が流れる音も気分を落ち着かせてくれる。

そんな道をずいぶん歩いてから、遅いランチを食べたお店のおじさんが教えてくれた。
鎌倉の桜が咲く時期は、東京より1週間遅いんだということを。
鎌倉の方が南なのに、東京より遅いんですよって、少しうれしそうに。
なんでうれしそうだったんだろう?今だにわからない。

桜の満開は今週金曜くらいかな。ということは鎌倉は来週の金曜日。
渋谷はもう8分咲きくらいでした。目黒川の桜をみながら夜の散歩をしよう。

NEW A4 国内デビュー

先週の話ですが、いつも楽しく見させてもらっているcarview.co.jpに、
新しい Audi A4 の記事がのっていました。
ついに、日本国内でも発売されるようです。

Audiは、気になる自動車メーカーの1つです。TT、A3、A4、A5あたりを魅力的に感じます。
R8もかっこいいとは思いますが、自分が乗る姿がイメージできないのです。
何か1つを選べといわれたら、TTを選びます。純粋に乗ってみたいです。
カッコよさでいえば、A5が出たときには、何度も記事を読み返した程もっていかれました。

そんな中、A5のテイストを受け継いでデザインが一新された、Audi のベースグレード A4。
記事の中でも、前モデルよりも確実な進化をしていることが書かれています。

欧州仕様のA4の試乗レポートは、こちら
車の写真は、こちらの方がかっこよく見えます。

車が必要と感じられるようになったら、候補の中の1台になることは確実です。

JUGEMの管理画面リニューアル

このブログを書き始める前、DJのことを中心にJUGEMでブログ書いてました。
JUGEMがわからないって方は、JUGEMのページをご覧ください。

自分でサーバ借りて、Movable Typeを触ってみようってところから始まったこのブログ。
デザインとか、相変わらずさっぱりいじってませんが、ぼちぼち続けれています。
そんな中、久々にJUGEMの管理者画面にログインしてみたら、右上に
【新管理者ページに変更】ってリンクができてました。
クリックしてみると、今までの管理画面がとてもシンプルに見えるくらい、
ぱっと明るくて、今までポータル(http://jugem.jp)に行かないと
見れなかったような情報も多少みることができます。

まだ使っていないので、使い心地はわかりませんが、
パッと見は新しい管理画面の方がいいなーと感じました。

このブログとはまた別に、何か書いてみようという気になるくらい。
なんについて書きたくなるか、まだ分からないけれど。

Windows開発環境

http://gigazine.net/index.php?/news/comments/20080324_vertrigoserv/

XAMPPみたいなものだけど、より使いやすいように見える。
全部、同じ設定画面内でいじれるってのは便利そう。

セパレーターがWindowsとサーバ(Linux)で異なるのが嫌で、VMWareを立ち上げたのだけど、
パスの設定をほぼいじることのない開発の時期になると、
これでもいいのかなと思ったりもします。

とりあえず、インストールして触ってみよう。

【メモ】多次元配列のソート

phpで、多次元配列をできるだけ簡単にソートする方法を探していた。

連想配列がさらに配列になっている場合に、連想配列の指定したキーにて
連想配列の並びをソートしたい。これがやりたいこと。

検索してたら、使えそうな関数を見つけた
usortとarray_multisort

http://jp.php.net/manual/ja/function.usort.php
http://jp.php.net/manual/ja/function.array-multisort.php

先にやらないといけない仕事がはいったので、後でちゃんと調べるためのメモ。

そういえば、ZendFrameworkの新しいバージョンが出てた。1.5.0。
いま使ってるのは、1.0.3。beta版として1.0.4が出てたのに、次が1.5.0。
いったんここで、安定したってことなのかな。

英語のドキュメントは苦手なので、いまいちわからん。
でも、きっとそうだと思う。1.0.4までで試したことの安定板のはず。
マルチパートメールの受信が簡単にできるようになっていたらいいな。
送信簡単だったのに、受信は自作しないといけなかったから。

還暦祝い2

両親からメールがきた。
還暦祝いにプレゼントした、ペアの腕時計は喜んでもらえたようだ。

母からのメールにハートマークがついていたのが、印象的。
なんで、息子にハートマークなのか。
お礼にしては、ポップすぎる。でも、おもしろい。

母なりに、がんばってメールをうったんだろう。
携帯電話の電話帳からアドレスを読みだすことすらままならない母ですから。

ブラウザからのファイルダウンロード

http://tkoshima.net/wp/archives/48

IEでだけ、ブラウザ経由のファイルダウンロードがうまくいきませんでした。
ネットで検索して、見つけたのが上記のリンク。
httpヘッダのキャッシュ設定を public にしないと正常にダウンロードできないとのこと。
下記ソースの※の部分を追加したら、IEでも正常に動作するようになりました。
(このソースは、Zend FrameWorkのActionコントローラ内に記述しています)

$fileName は、ダウンロードダイアログに出力するファイル名、
$path は、ダウンロード対象ファイルへのパスになります。

$fileNameは、ブラウザがIEの場合 SJIS に変換しないと日本語が文字化けします。

$this->getResponse()
   ->setHeader("Cache-Control", "public") ※
   ->setHeader("Pragma", "public")        ※
   ->setHeader("Content-Type", "application/octet-stream; name=\"$fileName\"")
   ->setHeader("Content-Disposition", "attachment; filename=\"$fileName\"")
   ->setHeader("Content-Length", filesize($path))
   ->setBody(file_get_contents($path));

初FRAMES

たぶん、初めて。

代官山のやつに1回行ったような記憶はあるが、AIRを抜け出してとかそういうの。
FRAMESだけに行ったのは、しかもご飯を食べにいったのは、今回が初めて。

そこで食べた、フェットチーネとジャンクポテト。
ジャンクポテトは名物なんだそう。
スイートチリソースと、サワークリームの味がおいしい。
帰りに中目黒で、CALDI寄ったらどっちも置いてあったので、
あとはジャガイモさえあれば、似たようなものが家でも楽しめます。

私が一番おいしいなと思ったのは、フェットチーネ。
もちもちとしてたし、ソースもしつこくなくて、ペロっと食べることができました。
あれだけ2皿食べてもいいかなと思えるくらい。
舞茸よりも、厚めに切ってあるベーコンが印象に残っています。

鶏のドラゴン揚げもおいしかったけど、もっとかみごたえがある肉が好みです。
あまり、脂身が多かったり、サシが入っているお肉よりも、
ササミみたいな噛み応えのある食感が欲しい。
よだぎんぽや、あきらで食べたチキン南蛮は、もっとおいしかった。

最近、家で食べた肉じゃがも相当においしかったです。
じゃがいも、玉ねぎ、こんにゃく、お肉、汁。すべて。
次の日、弁当にも入れてもっていったくらい気に入りました。

話がだいぶそれましたね。FRAMESへ行ったら、ジャンクポテトはマストで!!