【问题标题】:Weird E-Mail parsing error with Paypal Donation MailPaypal 捐赠邮件出现奇怪的电子邮件解析错误
【发布时间】:2017-07-12 21:27:05
【问题描述】:

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

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

古腾标签彼得迈耶! 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 在线 abrufen 。 Spendendetails Gesamtbetrag:1.50 欧元

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

PGh0bWwgPgogICA8aGVhZD4KICAgCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUi IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI + CiAgIAkJPG1ldGEgbmFtZT0i dmlld3BvcnQiIGNvbnRlbnQ9ImluaXRpYWwtc2NhbGU9MS4wLG1pbmltdW0tc2NhbGU9MS4w LG1heGltdW0tc2NhbGU9MS4wLHdpZHRoPWRldmljZS13aWR0aCxoZWlnaHQ9ZGV2aWNlLWhl aWdodCx0YXJnZXQtZGVuc2l0eWRwaT1kZXZpY2UtZHBpLHVzZX ... P>

以此类推,copymail.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
}

【问题讨论】:

  • 除了处理特定 PayPal 电子邮件的任何问题之外,您应该知道 PayPal 实际上有几种不同格式的确认电子邮件并定期更改它们 - 新图像、不同布局等。所以一旦你让它“完美”工作,您需要包含一些错误检查以捕获格式更改并将这些消息保存为新的/更新的处理脚本。
  • @NineBerry 帖子中的解决方案给了我这个:注意:未定义的变量:第 34 行的 C:\xampp\htdocs\test\stackoverflow.php 中的一部分注意:试图获取非第 34 行 C:\xampp\htdocs\test\stackoverflow.php 中的对象 注意:未定义变量:第 37 行 C:\xampp\htdocs\test\stackoverflow.php 中的消息
  • @manassehkatz 谢谢,我已经讨厌贝宝给我这个垃圾了:D

标签: php imap


【解决方案1】:

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

$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 in function 仅供您检查。 顺便说一句,我将原始问题中的 sn-p 粘贴到这个在线解码器中: https://www.base64decode.org 它也有效:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多