カスタム php 電子メール マーケティング アプリと興味深い問題があります。メッセージの件名にアクセント付きの単語が含まれている場合、それと次の単語の間のスペースが「飲み込まれて」しまいます。例: フレーズ
Ángel Ríos escucha y sorprende
として表示されます (少なくとも gmail と Lotus Notes によって)
ÁngelRíos escucha y sorprende
メッセージ ソースの特定の行は次のように表示されます。
Subject: =?ISO-8859-1?Q?=C1ngel?= =?ISO-8859-1?Q?R=EDos?= escucha y sorprende
(セミフルヘッダー):
Delivered-To: me@gmail.com
Received: {elided}
Return-Path: <return@path>
Received: {elided}
Received: (qmail 23734 invoked by uid 48); 18 Aug 2009 13:51:14 -0000
Date: 18 Aug 2009 13:51:14 -0000
To: "Adriano" <me@gmail.com>
Subject: =?ISO-8859-1?Q?=C1ngel?= =?ISO-8859-1?Q?R=EDos?= escucha y sorprende
MIME-Version: 1.0
From: {elided}
X-Mailer: PHP
X-Lista: 1290
X-ID: 48163
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Message-ID: <kokrte.rpq06m@example.com>
編集:
このアプリは古いバージョンの Html Mime Mail を使用してメッセージを作成します。新しいバージョンにアップグレードしてみます。とにかく、これはサブジェクトをエンコードする関数です:
/**
* Function to encode a header if necessary
* according to RFC2047
*/
function _encodeHeader($input, $charset = 'ISO-8859-1')
{
preg_match_all('/(\w*[\x80-\xFF]+\w*)/', $input, $matches);
foreach ($matches[1] as $value) {
$replacement = preg_replace('/([\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value);
$input = str_replace($value, '=?' . $charset . '?Q?' . $replacement . '?=', $input);
}
return $input;
}
そして、これはサブジェクトがエンコードされているコードです:
if (!empty($this->headers['Subject'])) {
$subject = $this->_encodeHeader($this->headers['Subject'],
$this->build_params['head_charset']);
unset($this->headers['Subject']);
}
要約
問題は、実際、プログラムが前述のケースでスペースをエンコードしていなかったことです。インストールされているPHPのバージョンが特定の実装の詳細をサポートしていなかったため、受け入れられた回答は私の問題を解決しました。
最終的な答え
受け入れられた回答は問題を解決しましたが、何千もの電子メールと相まって、サーバーで利用可能なすべてのメモリを食い尽くしていることがわかりました. このメールフレームワークの元の開発者のウェブサイトを確認したところ、次のように機能が更新されていることがわかりました。
function _encodeHeader($input, $charset = 'ISO-8859-1') {
preg_match_all('/(\w*[\x80-\xFF]+\w*)/', $input, $matches);
foreach ($matches[1] as $value) {
$replacement = preg_replace('/([\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value);
$input = str_replace($value, $replacement , $input);
}
if (!empty($matches[1])) {
$input = str_replace(' ', '=20', $input);
$input = '=?' . $charset . '?Q?' .$input . '?=';
}
return $input;
}
問題をきちんと解決し、メモリ制限内にとどまりました。