サーバーの事情でEUC-JPで運用しているCakePHP2なのですが、
2.2.xから2.3.5にアップデートしたところ、
行レベルで「社」以降がなくなったり、「–」が置換されたり、
エンコードに失敗している様子。
結局、2.2.xの最新版の2.2.8に戻しで一旦対応。
[追記 05/20]
以下、lib/Cake/Network/Email/CakeEmail.php line:1570- が悪さをしてます。
1 2 3 4 5 | foreach ($rendered as $type => $content) { $rendered[$type] = $this->_wrap($content); $rendered[$type] = implode("\n", $rendered[$type]); $rendered[$type] = rtrim($rendered[$type], "\n"); } |
この中で重要なのは、$this->_wrap で、 コメントは”Wrap the message to follow the RFC 2822 – 2.1.1″となってます。
調べたところ、emailに関する文字列長の規定の話らしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | /** * Wrap the message to follow the RFC 2822 - 2.1.1 * * @param string $message Message to wrap * @return array Wrapped message */ protected function _wrap($message, $wrapLength = CakeEmail::LINE_LENGTH_MUST) { $message = str_replace(array("\r\n", "\r"), "\n", $message); $lines = explode("\n", $message); $formatted = array(); foreach ($lines as $line) { if (empty($line)) { $formatted[] = ''; continue; } if (!preg_match('/\<[a-z]/i', $line)) { $formatted = array_merge( $formatted, explode("\n", wordwrap($line, $wrapLength, "\n")) ); continue; } $tagOpen = false; $tmpLine = $tag = ''; $tmpLineLength = 0; for ($i = 0, $count = strlen($line); $i < $count; $i++) { $char = $line[$i]; if ($tagOpen) { $tag .= $char; if ($char === '>') { $tagLength = strlen($tag); if ($tagLength + $tmpLineLength < $wrapLength) { $tmpLine .= $tag; $tmpLineLength += $tagLength; } else { if ($tmpLineLength > 0) { $formatted[] = trim($tmpLine); $tmpLine = ''; $tmpLineLength = 0; } if ($tagLength > $wrapLength) { $formatted[] = $tag; } else { $tmpLine = $tag; $tmpLineLength = $tagLength; } } $tag = ''; $tagOpen = false; } continue; } if ($char === '<') { $tagOpen = true; $tag = '<'; continue; } if ($char === ' ' && $tmpLineLength >= $wrapLength) { $formatted[] = $tmpLine; $tmpLineLength = 0; continue; } $tmpLine .= $char; $tmpLineLength++; if ($tmpLineLength === $wrapLength) { $nextChar = $line[$i + 1]; if ($nextChar === ' ' || $nextChar === '<') { $formatted[] = trim($tmpLine); $tmpLine = ''; $tmpLineLength = 0; if ($nextChar === ' ') { $i++; } } else { $lastSpace = strrpos($tmpLine, ' '); if ($lastSpace === false) { continue; } $formatted[] = trim(substr($tmpLine, 0, $lastSpace)); $tmpLine = substr($tmpLine, $lastSpace + 1); $tmpLineLength = strlen($tmpLine); } } } if (!empty($tmpLine)) { $formatted[] = $tmpLine; } } $formatted[] = ''; return $formatted; } |
取り急ぎの対応としては、上の呼び出し部のforeachのコードをコメントアウトすることかと思います。
※当然、処理が迂回されます。2.2系では入っていないコード