我們有一個自定義的PHP電子郵件營銷應用程序和一個有趣的問題: 如果郵件的主題行包含帶有重音符的單詞,它會「吞下」它與下一個單詞之間的空格。 一個例子:短語電子郵件主題中斷的重音詞 - 我該如何阻止?
安赫爾Ríos的escuchaýsorprende
被示出(由至少Gmail的和Lotus Notes),爲
ÁngelRíosescuchaýsorprende
的特定線在消息源中顯示:
Subject: =?ISO-8859-1?Q?=C1ngel?= =?ISO-8859-1?Q?R=EDos?= escucha y sorprende
(半滿頭):
Delivered-To: [email protected]
Received: {elided}
Return-Path: <[email protected]>
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" <[email protected]>
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: <[email protected]>
編輯:
應用程序使用的是舊版本的Html啞劇郵件的準備的消息,我會嘗試升級到新版本。無論如何,這是編碼主題的功能:
/**
* 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']);
}
,事實上,該方案並沒有對上述案例的空間進行編碼。 The accepted answer解決了我的問題,經過微小的修改(在對該答案的評論中提到),因爲安裝的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;
}
整齊地解決了這個問題,並下MEM限制留了下來。
你在使用,如果有的話,做的主題行和/或發送電子郵件的編碼? – Joe 2009-08-18 14:01:44
你是否嘗試過編碼空間?或者整個主題一次? – Gumbo 2009-08-18 14:44:02