2017-02-22 43 views
1

我想自动处理我从PayPal获得的电子邮件,用于捐款给我的电子邮件地址。 (通过cronjob和php脚本) 到目前为止,这么好。我做了一次测试捐赠并进行进一步测试,我将这封邮件与Outlook复制到INBOX几次。 一切工作正常与复制邮件(我在检查电子邮件正文中的字符串) 但现在我做了另一个测试捐款,它不工作。 原来,电子邮件正文未正确解析。 我已经在Delphi中尝试了Ararat Synapse,但结果相同。贝宝捐赠邮件奇怪的电子邮件解析错误

从复制邮件正确的电子邮件的正文是这样的:

Guten标签彼得·梅尔! Diese电子邮箱地址电子邮件地址Erhalt einer Spendeüber€1,50 EUR通过Peter Meier([email protected])。 Siekönnendie Transaktionsdetails online abrufen。 Spendendetails Gesamtbetrag:€1,50 EUR

但贝宝的原邮件被解析为

PGh0bWwgPgogICA8aGVhZD4KICAgCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUi IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI + CiAgIAkJPG1ldGEgbmFtZT0i dmlld3BvcnQiIGNvbnRlbnQ9ImluaXRpYWwtc2NhbGU9MS4wLG1pbmltdW0tc2NhbGU9MS4w LG1heGltdW0tc2NhbGU9MS4wLHdpZHRoPWRldmljZS13aWR0aCxoZWlnaHQ9ZGV2aWNlLWhl aWdodCx0YXJnZXQtZGVuc2l0eWRwaT1kZXZpY2UtZHBpLHVzZX ...

等等,copiedmail 。H tml是3KB,原始是28KB。

我的代码:

$connection = imap_open("{imap.gmx.net:993/imap/ssl}", "[email protected]", "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 
} 
+0

[PHP IMAP解码消息](可能的重复http://stackoverflow.com/questions/15539902/php -imap-decoding-messages) – NineBerry

+0

除了处理特定PayPal电子邮件的任何问题之外,您应该知道PayPal实际上有几种不同格式的确认电子邮件并定期更改它们 - 新图像,不同布局等。因此,一旦您让它“完美地”工作,需要包含一些错误检查以捕获格式更改并将这些消息保存为新的/更新的处理脚本。 – manassehkatz

+0

@NineBerry从帖子的解决方案给我这个: 注意:未定义的变量:在第34行的C:\ xampp \ htdocs \ test \ stackoverflow.php中的一部分 注意:尝试获取非对象的属性在C: \ xampp \ htdocs \ test \ stackoverflow.php on line 34 注意:未定义的变量:消息在C:\ xampp \ htdocs \ test \ stackoverflow.php上行37 – computerjulian

回答

1

感谢NineBerry, 我发现,贝宝使用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; 
} 
} 

当然呼应的功能是只为你检查。 BTW,我从粘贴我原来的问题的段将在线解码器: https://www.base64decode.org而且还曾:)