Paypal 捐赠邮件出现奇怪的电子邮件解析错误

Weird E-Mail parsing error with Paypal Donation Mail

我想自动处理从 Paypal 收到的用于向我的电子邮件地址捐款的电子邮件。 (通过 cronjob 和 php 脚本) 到目前为止,一切都很好。我做了一次测试捐赠,为了进一步测试,我用 Outlook 将这封邮件多次复制到收件箱。 复制的邮件一切正常(我正在检查电子邮件正文中的字符串) 但现在我又做了一次测试捐赠,但没有用。 结果是电子邮件正文没有被正确解析。 我已经在 Delphi 中尝试使用 Ararat Synapse,但结果相同。

复制邮件中的正确电子邮件正文如下所示:

Guten Tag Peter Meier ! Diese E-Mail bestätigt den Erhalt einer Spende über €1,50 EUR von Peter Meier (peter.meier@gmx.de ). Sie können die Transaktionsdetails online abrufen . Spendendetails Gesamtbetrag: €1,50 EUR

但是来自 Paypal 的原始邮件被解析为

PGh0bWwgPgogICA8aGVhZD4KICAgCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUi IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CiAgIAkJPG1ldGEgbmFtZT0i dmlld3BvcnQiIGNvbnRlbnQ9ImluaXRpYWwtc2NhbGU9MS4wLG1pbmltdW0tc2NhbGU9MS4w LG1heGltdW0tc2NhbGU9MS4wLHdpZHRoPWRldmljZS13aWR0aCxoZWlnaHQ9ZGV2aWNlLWhl aWdodCx0YXJnZXQtZGVuc2l0eWRwaT1kZXZpY2UtZHBpLHVzZX...

以此类推,copiedmail.html是3KB,原来是28KB。

我的代码:

$connection = imap_open("{imap.gmx.net:993/imap/ssl}", "peter.meier@gmx.de", "password"); //connect
$count = imap_num_msg($connection); //get E-Mail count in INBOX
for($msgno = 1; $msgno <= $count; $msgno++)  //walk through INBOX mails
{
  $headers = imap_headerinfo($connection, $msgno); //read E-Mail header
  $subject = $headers->subject; //read subject
  //decode subject
  $elements = imap_mime_header_decode($subject);
  $decodedsubject="";
  for ($i=0; $i<count($elements); $i++) 
  {
    $decodedsubject = $decodedsubject.$elements[$i]->text;
  }
  $body = imap_fetchbody ($connection, $msgno, 1); //read body
  echo $body; <--- Here I get long cryptic Text in original Mail
}

感谢 NineBerry, 我发现 paypal 对他们的邮件使用 base64 编码。 所以正文被这段代码正确解析了

$body = imap_fetchbody ($connection, $msgno, 1); //read E-Mail-Body
$body = imap_base64($body);
echo $body;

要按照建议检查编码,您可以这样做:

$structure = imap_fetchstructure($connection, $msgno);
$encoding = $structure->encoding;
$body = imap_fetchbody ($connection, $msgno, 1);
$body=decodebody($encoding, $body);
echo $body;

function decodebody($encoding, $body)
{
switch ($encoding) 
{
    # 7BIT
    case ENC7BIT:
        echo "7BIT<br>";//
        return $body;
        break;
    # 8BIT
    case ENC8BIT:
        echo "8BIT<br>";//
        return quoted_printable_decode(imap_8bit($body));
        break;
    # BINARY
    case ENCBINARY:
        echo "BINARY<br>";//
        return imap_binary($body);
        break;
    # BASE64
    case ENCBASE64:
        echo "BASE64<br>";//
        return imap_base64($body);
        break;
    # QUOTED-PRINTABLE
    case ENCQUOTEDPRINTABLE:
        echo "QUOTED<br>";//
        return quoted_printable_decode($body);
        break;
    # OTHER
    case ENCOTHER:
        echo "OTHER<br>";//
        return $body;
        break;
    # UNKNOWN
    default:
        echo "UNKNOWN<br>";//
        return $body;
        break;
}
}

当然函数中的echo只是供你查看而已。 顺便说一句,我将我的原始问题的片段粘贴到这个在线解码器: https://www.base64decode.org 而且它也有效 :)