当前位置: 首页 > 知识库问答 >
问题:

php imap邮件正文编码

赵英范
2023-03-14

我正在为我的Web应用程序构建一个邮件模块。在我目前的位置上,我正在尝试获取邮件正文并正确解码。但是,当我在邮件中遇到国际字符时,它无法正确解码它们。

例如。我有一个原始的电子邮件正文:

--001a11c126f6bd3aa804f575bd85 Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding: quoted-printable ss -- s Niels S=F8nderb=E6k --001a11c126f6bd3aa804f575bd85 
Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

ss
-- s
Ni= els S=F8nderb=E6k
--001a11c126f6bd3aa804f575bd85--

这是解码后的结果:

ss
-- s
Niels S�nderb�k

Niels S nderb k应该是Niels Sønderbæk。我只在处理国际字符时见过这个问题。有人知道如何修复它吗?我在下面包含了我的解码代码。它取自http://www.sitepoint.com/exploring-phps-imap-library-1/.

<?php

$imap = imap_open(...);

$uid = ...

function getBody($uid, $imap) {
    $body = get_part($imap, $uid, "TEXT/HTML");
    // if HTML body is empty, try getting text body
    if ($body == "") {
        $body = get_part($imap, $uid, "TEXT/PLAIN");
    }
    return $body;
}

function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false) {
    if (!$structure) {
           $structure = imap_fetchstructure($imap, $uid, FT_UID);
    }
    if ($structure) {
        if ($mimetype == get_mime_type($structure)) {
            if (!$partNumber) {
                $partNumber = 1;
            }
            $text = imap_fetchbody($imap, $uid, $partNumber, FT_UID);
            switch ($structure->encoding) {
                case 3: return imap_base64($text);
                case 4: return imap_qprint($text);
                default: return imap_utf8($text);
           }
       }

        // multipart 
        if ($structure->type == 1) {
            foreach ($structure->parts as $index => $subStruct) {
                $prefix = "";
                if ($partNumber) {
                    $prefix = $partNumber . ".";
                }
                $data = get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}

function get_mime_type($structure) {
    $primaryMimetype = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");

    if ($structure->subtype) {
       return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype;
    }
    return "TEXT/PLAIN";
}

echo getBody($uid,$imap);
?>

共有1个答案

花烨
2023-03-14

是的,标题说它是iso8859-1字符集编码,但您只撤消了传输编码。您仍然需要执行从电子邮件到Web应用程序字符集的字符集转换,可能是utf8。

 类似资料:
  • 我正在开发一个应用程序,在这个应用程序中,我不使用IOS邮件API发送邮件(邮件是使用SES amazon服务的发件人,不需要用户和附加文件的交互…)。在我的API中,我必须发送带有所有MIME协议的编码邮件(这不是问题)。我用字符集ascii和我在base64中附加的pdf对正文进行编码: 当我用gmail或邮件应用程序(OSX或IOS)打开邮件时,一切都很完美,但当我用windows mail

  • 我也遇到了一个问题,而发送邮件正文的日语。 我使用了mimeutility.encodeText(subject,“UTF-8”,“B”),但这只适用于subject而不适用于邮件正文中的日语文本。 我正在使用阿帕奇骆驼邮件。 请帮忙

  • 我的代码如下: 属性包括: 主机=smtp.gmail.com mail.smtp.auth=true mail.smtp.starttls.enable=true mail.smtp.host=smtp.gmail.com mail.smtp.port=587 mail.mime.charset=UTF-8 注意:文本在发送之前没有损坏。message.getSubject()打印出来的是干净的

  • 我一直在与Gmail API的意外行为作斗争。 到目前为止,我都是通过邮件获取每封邮件的正文。有效载荷。部分[0]。身体数据,其中包含base64中的消息体。在这种情况下,零件的MimeType为text/plain。 问题是,当我检索的邮件有附件时,parts[0]MimeType是“multipart/alternative”,它的主体只有空字段。 如果邮件正文有附件,我该如何获取它? 谢谢

  • 我有下面的代码,用于使用带有附件和正文部分(消息部分)的Java mail API发送邮件,但我只得到附件,而不是正文消息。 如有任何帮助或意见,将不胜感激。

  • 问题内容: 发送电子邮件时,我遇到一些外来字符的麻烦。有人可以建议我该怎么做吗?我怀疑问题可能是三件事之一。 html页面编码不正确。(这会影响表单中的POST数据吗?) 邮件功能没有任何编码。因此,该程序不知道如何读取它。(最有可能的) 文件本身没有正确的编码,因此出现了问题。(可能不太可能) 还有其他可能的原因吗? 我试图将它们一一淘汰,直到发现问题。我认为选项2是最可能的原因。如何为邮件功能