2017-02-22 167 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而且還曾:)