Мне нужно остановить imap_body от добавления разрывов строк и вставки символов - PullRequest
0 голосов
/ 09 мая 2019

Я получаю электронную почту в формате XML ADF из учетной записи Gmail. Я использую imap_body для получения писем. Глядя на учетную запись электронной почты, я вижу, что электронные письма принимаются двумя способами. Первый начинается так:

<?xml version="1.0" encoding="UTF-8"?>
<?adf version="1.0"?>

<adf>
  <prospect status="new">
    <id sequence="1" source=...

Второй тип начинается как:

<?xml version="1.0" encoding="UTF-8"?><?adf version="1.0"?><adf><prospect status="new"><id sequence="1" source=...

Для второго типа возвращаемые значения imap_body фиксируются до 75 символов. 75-й символ вставляется как знак равенства (=). Кроме того, символы 3D добавляются после появления нормальных знаков равенства:

<?xml version=3D"1.0" encoding=3D"UTF-8"?><?adf version=3D"1.0"?><adf><pros=
pect status=3D"new"><id sequence=3D"1" source=3D...

Я могу исправить строки, используя цикл для 75-го символа, но если 74-й символ является знаком равенства, знак равенства и пробел вставляются перед не вставленным знаком равенства.

Ex.

<name part=3D"full" type= 
=3D"business"

Это сбрасывает счет. Я также хотел бы компенсировать это, но хотел бы попытаться исправить фактический запрос imap_body, если это возможно.

//Retrieve emails, make corrections if needed, convert to array
$inbox = imap_open($cred['host'],$cred['user'],$cred['pass']);
if(!$inbox){
    $output = ['success' => false,'error' => "Unable to connect to host. ".imap_last_error()];
}else{
    /* Get email list */
    $emails = imap_num_msg($inbox);
    /* Cycle through each email based on count */
    if($emails > 0){
        for($key = 1;$key <= $emails;$key++) {
            /* Retrieve the email body */
            $pull = imap_body($inbox,$key);
            $init = str_replace(["\r","\n"],'',stripslashes($pull));
            //Clears the breaks having the = character and clears the added characters 3D
            if(substr($init,14,2) == "3D" && substr($init,75,1) == "="){
                $max = strlen($init);
                $cnt = 75;//First = character occurance
                while($cnt < $max){
                    $init = substr($init,0,$cnt).substr($init,$cnt + 1);//remove =
                    $cnt += 75;//Set for next iteration
                }
                $init = str_replace("3D",'',$init);//Remove additional 
            }
            $data = simplexml_load_string($init);
            $xml[$key] = json_decode(json_encode($data),true);
        }
    }
}

Второй тип электронной почты требует внесения исправлений, но он будет отключен из-за проблемы двойного равенства / пробела, проходящей через письмо. Из-за этих проблем происходит сбой simplexml_load_string. Опять же, исправление из imap_body было бы идеальным, иначе я продолжу вносить исправления, надеясь, что проблем больше не будет.

1 Ответ

0 голосов
/ 09 мая 2019

Это кодируемая проблема кодировки для печати

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...