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
【php】PDOでsql serverにWindows認証で接続する
2014年01月06日 20時15分
今までsql server認証でしか接続したことなかったので微妙にはまったので備忘録。
確認環境
php : 5.4
PDO Driver : Microsoft Drivers 3.0 for PHP for SQL Server
|
$pdo = new \PDO("sqlsrv:server=database-server;database=database-name", 'username', 'password', array( \PDO::ATTR_EMULATE_PREPARES => false, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC )); |
の’username’と’password’をnullにする。
それかオプションが不要なら接続文字列だけにすればOKだった。
|
$pdo = new \PDO("sqlsrv:server=database-server;database=database-name", null, null, array( \PDO::ATTR_EMULATE_PREPARES => false, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC )); |
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した時は特に気をつけないといけないという備忘録でした。
Security Casual Talks (すみだセキュリティ勉強会その2)に参加してきました
2013年12月07日 18時09分
亀戸で行われたSecurity Casual Talks (すみだセキュリティ勉強会その2)に参加してきました。
羽の生えた親子亀。地名が亀戸だけありますな。
前回はすみだセキュリティ勉強会だったのですが今回からはSecurity Casual Talksになったそうです。
個人的にはすみだセキュリティ勉強会の方が下町っぽくて好きですがまぁ気にしない。
この勉強会は開催時間が 10:00 〜 12:00 なのでだらだらしがちな週末をシャキッと朝から活動的にしてくれます。健康的で良いですね。Jリーグ最終節の日でも安心して参加出来ました。
発表内容もユニークで個人的に一押しな勉強会です。
それではローカルにあるmemo.txtを元に記憶を掘り返す作業をしていきます。
続きをみる
メール配信が絡む開発やテストで便利なアプリやサービス(Mailtrap, mailcatcher)
2013年12月04日 12時28分
メールの配信テストは失敗して外部アドレスに送ってしまうと取り返しのつかないことになってしまいます。
現に本番データでテストをして(この時点でおかしいが…)顧客にテストメールを誤配信したという現場に居合わせた経験があります。その後のフォローアップは悲惨なものでした。
この事件以来、メール配信が絡む実装やテストに関してはかなり神経使ってテストしています。
ですが毎回オフライン状態にしてテストしたりテストデータを変更して対応するのも非効率なのでなんとかしたい。
またアクティベーションurlを配信してアカウントを有効化する場合、テストの度にアカウントを削除して再度登録しての繰り返しなどしているのではないでしょうか。
配信前にサーバでメールを止めてその内容を確認できたらどんなに楽か。
そんな不満を解決すべく調べたらピッタリのものがあったのでご紹介します。
続きをみる