PHPで送ったメールをOutlookで確認するとヘッダが本文に表示されたり改行が倍になったりする
2014年01月24日 19時53分
サーバ環境が変わったとたんに秘伝のソースプロジェクトから送られたメールをOutlook(報告があったのは2003,2007)で確認すると本文中にメールヘッダが出てきたり、本文中の改行が2倍になったりする症状が発生した。
こんな感じ。
環境の違いはガッツリ変わっててMTAがsendmailからpostfixに変更。
また、phpのバージョンが5.1から5.5になった。
調べてみるとやっぱり同じ症状に悩む人が結構いたらしくすぐ情報が見つかる。
共通して言ってることはqmailやpostfixの場合は改行コードを統一しないとまずいということ。
LFに統一したらすぐ治ったが全くの思い込みでドハマリしたのがヒアドキュメント中の改行コード。
今までコード中の改行コードがそのまま反映されるものと思っていたがどうもPHP_EOLになる挙動をする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
// コード中の改行コードは全てCRLF // ヒアドキュメントのみ $message1 = <<<COUT hello, world! COUT; $inner_message = "hello, world!\r\n"; // ヒアドキュメント中に改行(\r\n)を持つ変数を展開 $message2 = <<<COUT {$inner_message} COUT; var_dump(str_replace(array("\r", "\n"), array("<CR>", "<LF>"), $message1)); var_dump(str_replace(array("\r", "\n"), array("<CR>", "<LF>"), $message2)); var_dump(str_replace(array("\r", "\n"), array("<CR>", "<LF>"), PHP_EOL)); |
Windows(Win7, Apache2.2, PHP5.5)で確認すると改行は全てCRLFで思った通りの改行コードになっている。
|
string(37) "<CR><LF>hello, world!<CR><LF><CR><LF>" // ヒアドキュメントのみ string(37) "<CR><LF>hello, world!<CR><LF><CR><LF>" // ヒアドキュメント中に改行(\r\n)を持つ変数を展開 string(8) "<CR><LF>" // PHP_EOL |
しかし、Linux(CentOS6.5, Apache2.2, PHP5.5)で確認すると変数に入れた\r\nのみCRLFで、ヒアドキュメント中の改行は全てLFになっていた。
|
string(25) "<LF>hello, world!<LF><LF>" // ヒアドキュメントのみ string(29) "<LF>hello, world!<CR><LF><LF>" // ヒアドキュメント中に改行(\r\n)を持つ変数を展開 string(4) "<LF>" // PHP_EOL |
こうなるとMTA側でLFをCRLFに変換した時にCRCRLFという改行コードができてメーラーによってマチマチの挙動になっていたと納得。
後、注意すべき点としてはmb_encode_mimeheaderも長い場合は自動で改行するので引数渡して改行コードを指定し、本文の改行コードと合わせる必要がある。
- PHP: mb_encode_mimeheader
-
http://www.php.net/manual/ja/function.mb-encode-mimeheader.php
CentOS6でyumを使ってmysqlからMariaDBにした(なった)話
2013年12月15日 04時27分
yumのサードパーティ製リポジトリ(CentALT)を追加してうっかりyum update時のパッケージリストを流しで確認する程度に更新したらmysqlがMariaDBになった。
yumのログを確認してみるとmysqlが消されてる。
|
Packages Erased: mysql-libs mysql mysql-server mysql-devel |
mysqlからMariaDBに切り替えるにしても心の準備が整っていなかったので焦る焦る。
とりあえずデーモンが起動していなかったので起動してみる。
問題なくMariaDBが起動した。
wordpress、piwik、mediawiki、redmine、自作アプリは問題なく動いてる。
アプリケーション層はあまり意識する必要はないという噂通りに互換性はバッチリだ。
と一安心していたら日時実行しているmysqlバックアップのバッチ処理がコケた。
|
mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Scheduler were found damaged at server start (1577) |
eventsテーブルがダメージ受けてる?
確認する為にmysql(MariaDB)コンソール使用して以下で確認。
|
MariaDB [(none)]> use information_schema; Database changed MariaDB [(information_schema)]> select * from events; ERROR 1577 (HY000): Cannot proceed because system tables used by Event Scheduler were found damaged at server start |
確かにエラーが発生する。
こんな時はmysql_upgradeを使用する。
|
$ mysql_upgrade -u root -h localhost -p --verbose ... Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13 |
落ちた。
/var/lib/mysql/mysql_upgrade_infoの中身を見たらバージョンが書かれている1行だけのテキストファイルだった。
所有者がrootでパーミッションが644になってたので所有者をmysqlに変更。
それでもダメだったのでパーミッションを666に変えたらエラーなくコマンドが完了した。
気持ち悪いのでパーミッションは元に戻しておいた。
図らずも流行に乗れた感じ。
yumでenablerepoした時は特に気をつけないといけないという備忘録でした。
メール配信が絡む開発やテストで便利なアプリやサービス(Mailtrap, mailcatcher)
2013年12月04日 12時28分
メールの配信テストは失敗して外部アドレスに送ってしまうと取り返しのつかないことになってしまいます。
現に本番データでテストをして(この時点でおかしいが…)顧客にテストメールを誤配信したという現場に居合わせた経験があります。その後のフォローアップは悲惨なものでした。
この事件以来、メール配信が絡む実装やテストに関してはかなり神経使ってテストしています。
ですが毎回オフライン状態にしてテストしたりテストデータを変更して対応するのも非効率なのでなんとかしたい。
またアクティベーションurlを配信してアカウントを有効化する場合、テストの度にアカウントを削除して再度登録しての繰り返しなどしているのではないでしょうか。
配信前にサーバでメールを止めてその内容を確認できたらどんなに楽か。
そんな不満を解決すべく調べたらピッタリのものがあったのでご紹介します。
続きをみる
ImageMagickで余白を付けると画像が切れてしまう
2013年07月18日 13時01分
古いサーバで動いているImageMagickで変わった現象が起きて困った。
そもそもバージョンがとても古い。
ImageMagick: 6.2.8
そして他のサーバ(Version: 6.7.6-9)で確認したところ発生しなかった。
古い環境でアップデートできない時の対処としてのメモ。
続きをみる
crontabでsudoを利用する時の注意点など
2013年05月20日 14時15分
crontabでタスクを実行して日次や週次処理を実行するようなこと多いと思います。
その時に何も考えずにログインしたユーザでcrontabを設定していたらその時に生成されるログファイル等の所有者がapacheでなく仕掛けたユーザになって正常にログが出力されないというとても残念なことになるのでその対応。
|
/bin/env FUEL_ENV=production /usr/bin/php /path/fuelphp/oil refine employee |
これだとcrontabを仕掛けた時のユーザ権限で実行されてしまうのでsudoしました。
|
sudo -u apache /bin/env FUEL_ENV=production /usr/bin/php /path/fuelphp/oil refine employee |
しかしsudoにてパスワードを求められてしまいうまくいかないのでvisudoでsudoに関する設定を変更します。
続きをみる