【问题标题】:How to get special characters of the body of an email using imap with PhP?如何使用 imap 和 PhP 获取电子邮件正文的特殊字符?
【发布时间】:2015-02-02 12:01:30
【问题描述】:

我正在使用 imap 和 php 来获取我的电子邮件正文。

到目前为止,我没有得到特殊字符和奇怪的格式。例如,如果我给自己发一封电子邮件(使用 Apple Mail 等常规电子邮件客户端),上面写着:

用字符 é à 和一些 !那块石头。

我用 php 得到的是:

用字符 =C3=A9 =C3=A0 和一些 !那块石头。=

我已经尝试通过带有这些标头的 php 的邮件功能重新发送正文,但我仍然遇到同样的问题。

$headers="From: address@email.com" . "\r\n" . "MIME-Version: 1.0" . "\r\n" . "Content-type:text/html;charset=UTF-8";
mail($sendTo, $message, $noBody, $headers);

我试过addslashes(),也没有用。

这里是我的代码示例:

$imapLink=imap_open("{".$mailbox."}INBOX",$username,$password);
$mailBoxInfos = imap_check($imapLink);
$mailList = imap_fetch_overview($imapLink,"1:".$mailBoxInfos->Nmsgs);
if(isset($mailList))
{
    $numMess = imap_num_msg($imapLink);
    while($numMess>0) {
        $message = imap_body($imapLink, $numMess);
        $numMess --;
    }
}
$imapClose = imap_close($imapLink);

希望你能帮助我!

提前致谢!

亚瑟

【问题讨论】:

    标签: php email character-encoding


    【解决方案1】:

    您在文本中看到的=XX 称为“引用打印内容”。用于显示7位无法显示的字符。

    您可以使用quoted_printable_decode() 将其转换回可读字符串。

    所以这应该有效:

    $message = imap_body($imapLink, $numMess);
    $message = quoted_printable_decode($message); // <-- add this line
    $numMess --;
    

    【讨论】:

    • 完美运行,非常感谢好友!如果我通过电子邮件发送特殊字符,我想在标题中显示“Content-type:text/html;charset=UTF-8”吗?它适用于我的电子邮件提供商 (GMAIL),但有些人显然看不到我通过我的系统发送的电子邮件的重音...
    • 使用 charset=UTF-8 时,您不需要使用带引号的可打印编码进行编码。所以 $message 将只包含有效的 UTF-8 字符。但是,如果您想通过 PHP 显示这些字符,您还需要输出 UTF-8(或转换为您的 PHP 当时使用的编码)。例如,如果您使用 ISO-8859-1 作为 PHP 输出,您可以使用 utf8_decode() 将 UTF-8 转换为 ISO-8859-1。 (1/2)
    • (2/2) 或者您可以将 PHP 转换为 UTF-8 输出,在 php.ini 中使用 default_charset = "utf-8"; 并在 php 顶部使用 header('Content-Type: text/html; charset=utf-8');。欢迎来到编码的世界;)
    • 天哪,没想到编码这么复杂...非常感谢 Rik,它帮了很多忙!祝你好运;)
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多