Как действительно расшифровать сообщение электронной почты 7Bit с помощью PHP?

У меня есть код, который читает электронную почту с сервера, а затем анализирует их перед вставкой данных в базу данных.

Я использую Расширение IMAP в PHP, чтобы помочь мне с этим.

Вот что я делаю, чтобы прочитать данные

//read new messages
private function _getNewMessages(){

// Checks the inbox
if ($messages = imap_search($this->conn,'ALL'))
{
// Sorts the messages newest first
sort($messages);

// Loops through the messages
foreach ($messages as $id)
{
// Grabs the overview and body
//$overview = imap_fetch_overview($this->conn, $id, 0);
$struct = imap_fetchstructure($this->conn, $id, 0);
$header = imap_headerinfo($this->conn, $id);
$message = imap_fetchbody($this->conn, $id, 1);

//decode the message
if(isset($struct->encoding)){
$message = $this->_decodeMessage($message, $struct->encoding);
}$from = $header->from[0]->mailbox . '@' . $header->from[0]->host;
$subject = $header->subject;
echo  $message;
}
}
else
{
exit('No messages to process');
}
}

проблема, которую я вижу, состоит в том, что когда сообщение приходит в кодировке со значением 0 «7 бит», оно возвращается черным. кажется, что декодирование не в состоянии правильно декодировать сообщение.

Я использую эту функцию для декодирования 7 бит

    // function to decode 7BIT encoded message
private function _decode7Bit($text) {
// If there are no spaces on the first line, assume that the body is
// actually base64-encoded, and decode it.
$lines = explode("\r\n", $text);
$first_line_words = explode(' ', $lines[0]);
if ($first_line_words[0] == $lines[0]) {
$text = base64_decode($text);
}

// Manually convert common encoded characters into their UTF-8 equivalents.
$characters = array(
'=20' => ' ', // space.
'=E2=80=99' => "'", // single quote.
'=0A' => "\r\n", // line break.
'=A0' => ' ', // non-breaking space.
'=C2=A0' => ' ', // non-breaking space.
"=\r\n" => '', // joined line.
'=E2=80=A6' => '…', // ellipsis.
'=E2=80=A2' => '•', // bullet.
);

// Loop through the encoded characters and replace any that are found.
foreach ($characters as $key => $value) {
$text = str_replace($key, $value, $text);
}

return $text;
}

Я также попробовал этот метод для декодирования сообщения

/**
* decoding 7bit strings to ASCII
* @param string $text
* @return string
*/
function decode7bit($text){
$ret = '';
$data = str_split(pack('H*', $text));

$mask = 0xFF;
$shift = 0;
$carry = 0;
foreach ($data as $char) {
if ($shift == 7) {
$ret .= chr($carry);
$carry = 0;
$shift = 0;
}

$a      =       ($mask >> ($shift+1)) & 0xFF;
$b      =       $a ^ 0xFF;

$digit = ($carry) | ((ord($char) & $a) << ($shift)) & 0xFF;
$carry = (ord($char) & $b) >> (7-$shift);
$ret .= chr($digit);

$shift++;
}
if ($carry) $ret .= chr($carry);
return $ret;
}

но сообщение пустое.

Что я здесь не так делаю? Что я могу сделать, чтобы убедиться, что сообщение правильно декодировано?

Спасибо

0

Решение

Я выясняю проблему. То, как я проверял, закодировано ли сообщение в base64 или нет, не очень хорошо. поэтому я меняю свою функцию на эту

private function _isEncodedBase64($date){

if ( base64_encode(base64_decode($data)) === $data){
return true;
}

return false;
}

// function to decode 7BIT encoded message
private function _decode7Bit($text) {
// If there are no spaces on the first line, assume that the body is
// actually base64-encoded, and decode it.
if($this->_isEncodedBase64($text)){
$text = base64_decode($text);
}// Manually convert common encoded characters into their UTF-8 equivalents.
$characters = array(
'=20' => ' ', // space.
'=E2=80=99' => "'", // single quote.
'=0A' => "\r\n", // line break.
'=A0' => ' ', // non-breaking space.
'=C2=A0' => ' ', // non-breaking space.
"=\r\n" => '', // joined line.
'=E2=80=A6' => '…', // ellipsis.
'=E2=80=A2' => '•', // bullet.
);

// Loop through the encoded characters and replace any that are found.
foreach ($characters as $key => $value) {
$text = str_replace($key, $value, $text);
}
return $text;
}
1

Другие решения

Основываясь на кодировках символов, которые вы описываете, похоже, что ваш текст закодирован с использованием цитируемой печати.

Попробуйте расшифровать, используя:

echo quoted_printable_decode($text);
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector