2017-02-22 3 views
1

Я хочу автоматически обрабатывать электронные письма, которые я получаю от Paypal за пожертвования на мой E-Mail-адрес. (через скрипт cronjob и php) Пока все так хорошо. Я сделал тестовое пожертвование и для дальнейшего тестирования, я копирую эту почту с Outlook в INBOX несколько раз. Все работало нормально с копируемой Почтой (я проверяю строку в теле E-Mail) , но теперь я сделал еще одно тестовое пожертвование, и он не работал. Оказалось, что E-Mail-Body не обрабатывается правильно. Я уже пробовал с Ararat Synapse в Delphi, но тот же результат.Ошибка синтаксического анализа Weird E-Mail с почтовой почтой Paypal

Правильный E-Mail Body от скопированной почты выглядит следующим образом:

Guten Tag Питер Майер! Diese E-Mail bestätigt den Erhalt einer Spende über € 1,50 EUR фон Питер Майер ([email protected]). Sie können die Transaktionsdetails online abrufen. Spendendetails Gesamtbetrag:

Но € 1,50 EUR оригинал почта от Paypal обрабатывается как

PGh0bWwgPgogICA8aGVhZD4KICAgCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUi IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI + CiAgIAkJPG1ldGEgbmFtZT0i dmlld3BvcnQiIGNvbnRlbnQ9ImluaXRpYWwtc2NhbGU9MS4wLG1pbmltdW0tc2NhbGU9MS4w LG1heGltdW0tc2NhbGU9MS4wLHdpZHRoPWRldmljZS13aWR0aCxoZWlnaHQ9ZGV2aWNlLWhl aWdodCx0YXJnZXQtZGVuc2l0eWRwaT1kZXZpY2UtZHBpLHVzZX ...

И так далее, copiedmail .час tml - 3 КБ, оригинал - 28 КБ.

Мой код:

$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 решение из сообщения дает мне следующее: Примечание: Неопределенная переменная: часть в C: \ xampp \ htdocs \ test \ stackoverflow.php в строке 34 Примечание: попытка получить свойство не объекта в C: \ xampp \ htdocs \ test \ stackoverflow.php в строке 34 Примечание: неопределенная переменная: сообщение в C: \ xampp \ htdocs \ test \ stackoverflow.php в строке 37 – computerjulian

ответ

1

Благодаря 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; 
} 
} 

Конечно эхо в функции только для вас, чтобы проверить. Кстати, я вставил фрагмент из моего оригинального вопроса к этому онлайн-декодеру: https://www.base64decode.org и он также работал :)

Смежные вопросы