この記事を三行にまとめると
メールのヘッダ情報に関するお話もう一息じゃ! 改行を"\n"に!
いいですとも!
またしてもCakePHPでメール送信の開発をしてるときの話っす。こないだからこの話ばっかりやわ。
メールにはヘッダ情報ってやつが含まれておりまして……通常、メールの本文には出て来ないんですが、そのヘッダ情報には誰から送られてきたとか、何月何日の何時何分何秒地球が何回まわったときに送られてきたとか、文字コードは何だろうとか、そういった情報が入っております。
正確には、地球が何回まわったかって情報は入ってないです。嘘つきました、ごめんなさい。
で、このヘッダ情報なんですが、使っているメーラーによっては、うっかり本文に出ちゃうことがあるみたいです。ちゃんと検証し尽くしたわけじゃないから、どれがどうってのははっきりとは言えないんですけど、たぶん、Windows系のやつ。WindowsLiveメールとか。
どうやら改行コードの問題らしくて、CakePHPのQdmailとかCakeEmailとかでメールを送信するとき、改行が「\r\n」になってると、うっかりしちゃうことがあるらしい。「\n」だと大丈夫みたい。
ってことは、もしヘッダ情報が本文に出ちゃうようだったら、改行コードを修正してやれば良いっつーわけっすね。
早速やってみましょう。
この「”\r\n”」を「”\n”」に変えるだけ。
よくよく見ると、ご丁寧にコメントが添えてあるんですけどね。だから素直に従っとけば良い。フースーヤにWメテオを使うと言われたときのゴルベーザのごとく、従っとけば良い。
フースーヤ「もう一息じゃ! 改行を”\n”に!」
ゴルベーザ「いいですとも!」
こーゆーの。この中にある「mb_encode_mimeheader()」ってやつをちょっといじる。
このmb_encode_mimeheader()ってのは第4引数に改行を指定できるんですが、デフォルトだと「\r\n」になってるようなんで、自分で「\n」を指定すれば良いです。
これで必ず直るかは分からないんですが、僕の場合は、email.phpの設定を以下のようにしたら直りました。
email.phpの設定で、transportってやつを「Mail」から「Smtp」にしたら、ヘッダ情報が本文に出なくなった。
何でこうすると出なくなるのかは、ぶっちゃけよく分かりません。メールサーバーの問題でしょうか? よく分かりません。
とりあえず直ったからこれでオーライってことにしちゃいましたが、まあ、暇があればちゃんとその辺のことも調べとこうと思います。この記事を読んだ人からコメントもらえたりするのが一番ありがたいですけどね。
何せモットーは他力本願なものですから……ふふふ。
つい先日、はてブか何かに上がってた記事で、これからの時代に生き残れるエンジニアはフルスタックエンジニアだ、みたいな記事を読みましたが、僕みたいに、プログラム以外のことがほとんど分からない上、しかも知ってる言語はPHPだけで、しかしそのPHPすらどこまでちゃんと使いこなせてるか分からないようなやつは、この先も生き残って行くのは難しいんですかね。
っていうか、フルスタックエンジニアってやつが何なのかも、よく分かってないんですけど……自分^^;
メールにはヘッダ情報ってやつが含まれておりまして……通常、メールの本文には出て来ないんですが、そのヘッダ情報には誰から送られてきたとか、何月何日の何時何分何秒地球が何回まわったときに送られてきたとか、文字コードは何だろうとか、そういった情報が入っております。
正確には、地球が何回まわったかって情報は入ってないです。嘘つきました、ごめんなさい。
で、このヘッダ情報なんですが、使っているメーラーによっては、うっかり本文に出ちゃうことがあるみたいです。ちゃんと検証し尽くしたわけじゃないから、どれがどうってのははっきりとは言えないんですけど、たぶん、Windows系のやつ。WindowsLiveメールとか。
どうやら改行コードの問題らしくて、CakePHPのQdmailとかCakeEmailとかでメールを送信するとき、改行が「\r\n」になってると、うっかりしちゃうことがあるらしい。「\n」だと大丈夫みたい。
ってことは、もしヘッダ情報が本文に出ちゃうようだったら、改行コードを修正してやれば良いっつーわけっすね。
早速やってみましょう。
Qdmailの場合
qdmail.phpの100行目付近に、こんなのがあると思うんですよ。var $LFC = "\r\n";//Notice: CRLF ,If you failed, change to "\n"
この「”\r\n”」を「”\n”」に変えるだけ。
よくよく見ると、ご丁寧にコメントが添えてあるんですけどね。だから素直に従っとけば良い。フースーヤにWメテオを使うと言われたときのゴルベーザのごとく、従っとけば良い。
フースーヤ「もう一息じゃ! 改行を”\n”に!」
ゴルベーザ「いいですとも!」
CakeEmailの場合
バージョンによって違うかもだけど、CakeEmail.phpの1200行目付近に、「_encode()」っていうメソッドがある。protected function _encode($text) {
$internalEncoding = function_exists('mb_internal_encoding');
if ($internalEncoding) {
$restore = mb_internal_encoding();
mb_internal_encoding($this->_appCharset);
}
if (empty($this->headerCharset)) {
$this->headerCharset = $this->charset;
}
$return = mb_encode_mimeheader($text, $this->headerCharset, 'B');
if ($internalEncoding) {
mb_internal_encoding($restore);
}
return $return;
}
こーゆーの。この中にある「mb_encode_mimeheader()」ってやつをちょっといじる。
$return = mb_encode_mimeheader($text, $this->headerCharset, 'B');
→$return = mb_encode_mimeheader($text, $this->headerCharset, 'B', "\n");
このmb_encode_mimeheader()ってのは第4引数に改行を指定できるんですが、デフォルトだと「\r\n」になってるようなんで、自分で「\n」を指定すれば良いです。
もし直らない場合
CakeEmailを使っている場合に、もし上記の方法で改行を修正しても、何も変化しない場合。相も変わらずヘッダ情報が本文に出てしまう場合。これで必ず直るかは分からないんですが、僕の場合は、email.phpの設定を以下のようにしたら直りました。
class EmailConfig {
public $default = array(
'transport' => 'Mail',
→'transport' => 'Smtp',
〜 以下略 〜
email.phpの設定で、transportってやつを「Mail」から「Smtp」にしたら、ヘッダ情報が本文に出なくなった。
何でこうすると出なくなるのかは、ぶっちゃけよく分かりません。メールサーバーの問題でしょうか? よく分かりません。
とりあえず直ったからこれでオーライってことにしちゃいましたが、まあ、暇があればちゃんとその辺のことも調べとこうと思います。この記事を読んだ人からコメントもらえたりするのが一番ありがたいですけどね。
何せモットーは他力本願なものですから……ふふふ。
つい先日、はてブか何かに上がってた記事で、これからの時代に生き残れるエンジニアはフルスタックエンジニアだ、みたいな記事を読みましたが、僕みたいに、プログラム以外のことがほとんど分からない上、しかも知ってる言語はPHPだけで、しかしそのPHPすらどこまでちゃんと使いこなせてるか分からないようなやつは、この先も生き残って行くのは難しいんですかね。
っていうか、フルスタックエンジニアってやつが何なのかも、よく分かってないんですけど……自分^^;