2011-05-26 98 views
6

我有一个主题行发送电子邮件作为如何解码电子邮件中的主题?

[BILLING #PHY-945-49853]: [Ticket #12622] Payment Method 

但在消息的源行是像下面

Subject: =?UTF-8?B?W1NBTEVTICNCQk4tOTM1LTM3OTE3XTogW1RpY2tldCAjMTI2MjJdIFBheW1lbnQ=?= 
=?UTF-8?B?IE1ldGhvZA==?= 

它以Base64编码。我如何使用php将它解码回原来的主题行?我已经尝试使用php base64_decode($subject),但它不会将其解码为原始主题([BILLING#PHY-945-49853]:[Ticket#12622] Payment Method)

我还附加了一封示例电子邮件消息:

Return-Path: ......... 
X-Original-To: .......... 
Delivered-To: ........ 
Received: ...... 
X-DKIM: ........ 
Received:.... 
To: .... 
Subject: =?UTF-8?B?W1NBTEVTICNCQk4tOTM1LTM3OTE3XTogW1RpY2tldCAjMTI2MjJdIFBheW1lbnQ=?= 
=?UTF-8?B?IE1ldGhvZA==?= 
From: =?UTF-8?B?U0FWVllFSE9TVElORyBTQUxFUw==?= 
X-Priority: .. 
X-MSMail-Priority: normal 
X-MimeOLE: Produced By Kayako Fusion v4.01.204 
X-Mailer: Kayako Fusion v4.01.204 
Reply-To: ....... 
Date: ..... 
Content-Type: multipart/alternative; 
boundary="=_1.64496c432f57488924404b338155a2d7" 
MIME-Version: 1.0 
Message-Id: .... 

这是一条MIME格式的消息。如果你看到这个,你的邮件阅读器不支持这种格式。

--=_1.64496c432f57488924404b338155a2d7 
Content-Type: text/plain; 
charset="UTF-8" 
Content-Transfer-Encoding: quoted-printable 
Content-Disposition: inline 


------------------------------------------------------ 
Support Center: 
Content-Type: text/html; 
charset="UTF-8" 
Content-Transfer-Encoding: quoted-printable 
Content-Disposition: inline 

回答

14

您可能正在寻找iconv_mime_decode

从链接:

string iconv_mime_decode (string $encoded_header [, int $mode = 0 [, string $charset = 
ini_get("iconv.internal_encoding") ]]) 

解码MIME头字段。

你举的例子:

echo iconv_mime_decode($string); 

产量:

Subject: [SALES #BBN-935-37917]: [Ticket #12622] Payment 
+0

相关[meta post](http://meta.stackoverflow.com/q/291879/55075)。 – kenorb 2015-05-02 15:01:54

0

我也有这个问题,并想出了一个替代途径来解决这个问题。对于未来的其他人来说,这可能会有一些帮助。

一旦我意识到消息的哪一部分实际上是字符串的Base64部分,我将这些代码拼凑在一起;

if(stripos($subject, "=?utf-8?b?") !== false) { 
    $output = str_ireplace("=?utf-8?B?", "", $subject); 
    $output = str_replace("==?=", "", $output); 
    $output = base64_decode($output); 
}else{ 
    $output = $subject; 
} 

有效地你正在做的是检测到该字符串是在面对base64。然后在解码之前修改标识符base64_decode()

确保您使用字符串函数的不区分大小写的版本,因为并非所有邮件提供者都使用大写或小写字母。

**对不起回复一个老问题,但我发现这是一个更有用的选择。