在PHP Gmail API中解码电子邮件正文?

3

我正在尝试使用Gmail API读取电子邮件正文

我之前使用IMAP,但由于性能原因(在IMAP中读取电子邮件需要太长时间),所以我不得不转向Gmail API,后者的速度更快。

问题在于,当我尝试解码正文时,使用IMAP很简单,只需从imap_fetchstructure返回的传输编码中读取并使用适当的函数进行解码即可(如imap_qprint、imap_7bit等)。

Gmail则需要:

        $message = $service->users_messages->get($user, $msg->id, ["format"=>"full"]);

        $payload = $message->getPayload();
        $mime = $payload->getMimeType();
        $body = $payload->getBody();
        $headers = $payload->getHeaders();
        $content = $body->getData();
        $decoded = base64_decode($content);

变量$contents是base64编码的主体内容,但如果我解码它,会出现奇怪的字符,比如��ѽ���,这种情况在IMAP中没有发生过。内容是纯文本UTF-8,没有附加部分或附件,只有纯文本。而且HTML也会出现这种情况。

以下是相关头文件:

     [{"name":"MIME-Version","value":"1.0"},
{"name":"Content-Type","value":"text\/plain; charset=utf-8"},
{"name":"Content-Transfer-Encoding","value":"quoted-printable"}]

我认为问题在于正文是quoted-printable编码,但即使我对解码后的base64使用imap_qprint或quoted_printable_decode,这些奇怪的字符仍然存在。


Hi, is quoted-printable - undefined
使用imap_qprint或quoted_printable_decode解码正文内容。 - undefined
似乎与此相关:http://php.net/manual/zh/function.imap-base64.php#102766 - undefined
3
问题在于变量$ content不是base64,而是base64url, https://developers.google.com/gmail/api/v1/reference/users/messages/get?hl=es-419 使用以下内容进行修复: http://php.net/manual/es/function.base64-decode.php#118244 然后使用imap_qprint - undefined
1个回答

10
我曾经遇到过同样的问题...Felipe Morales找到了解决方案...但为了更加清晰明了,以下是详细步骤:
从API响应中获取base64-url编码字符串,并将其运行通过此函数:
function gmailBodyDecode($data) {
    $data = base64_decode(str_replace(array('-', '_'), array('+', '/'), $data)); 
    //from php.net/manual/es/function.base64-decode.php#118244

    $data = imap_qprint($data);
    return($data);
} 

表现出色...


2
非常好!只有一个评论,"impa_qprint"函数可以被PHP基线函数"quoted_printable_decode"替代。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接