Автор Тема: Четене на имейл  (Прочетена 1944 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

woodmonster

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 12
Четене на имейл
« -: 18 Ноември 2016, 22:21:13 »
Имам малък PHP проблем с четене на имейли от Gmail. Проблемът е с кирилицата. Когато изпратя писмо до моята Gmail поща от abv.bg - резултата при прочитането на имейла е следния:

Subject: Проба със
Body: Тестване със специални знаци :)
From: Борислав Развански
Date: Fri, 18 Nov 2016 19:28:09 +0200 (EET)
Имайл: lubopitno_bg@abv.bg


НО когато изпратя имейл до моята Gmail поща от друга gmail поща - резултата е следния:

Subject: Проверка от гмейл
Body: PGRpdiBkaXI9Imx0ciI+0JTQsNC90L4g0L/RgNC+0LLQtdGA0LrQsNGC0LAg0LTQsCDQvNC40L3Q tS48YnI+PC9kaXY+DQo
From: Елена Иванова
Date: Fri, 18 Nov 2016 19:50:03 +0200
Имайл: lenata7303@gmail.com


Тук реда - Body: PGRpdiBkaXI9Imx0ciI+0JTQsNC90L4g0L/RgNC+0LLQtdGA0LrQsNGC0LAg0LTQsCDQvNC40L3Q tS48YnI+PC9kaXY+DQo
Трябва да се визуализира като - Body: Дано проверката да мине.

Въпроса ми е: Защо при получаване на имейл от Gmail поща Body-то на имейла го енкодва (или нещо подобно), а когато получа имейл от abv-поща кода ми прочита нормално писмото и го визуализира добре?

Ето го и кода:
Код: HTML
  1.     <head>
  2.         <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  3.         <title>Read Mail</title>
  4.     </head>
  5.     <body>

Код: PHP
  1. /* Create gmail connection */
  2.         $hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
  3.         $username = 'user@gmail.com';
  4.         $password = 'pass';
  5.         $inbox = imap_open($hostname, $username, $password) or die('Cannot connect to Gmail: ' . imap_last_error());
  6.  
  7.         /* Fetch emails */
  8.         $emails = imap_search($inbox, "UNSEEN");
  9.  
  10.         /* If emails are returned, cycle through each... */
  11.         if ($emails) {
  12.             $output = '';
  13.  
  14.             /* Make the newest emails on top */
  15.             rsort($emails);
  16.  
  17.             /* For each email... */
  18.             foreach ($emails as $email_number) {
  19.  
  20.                 $headerInfo = imap_headerinfo($inbox, $email_number);
  21.  
  22.                 $fromaddr = $headerInfo->from[0]->mailbox . "@" . $headerInfo->from[0]->host;
  23.  
  24.                 $structure = imap_fetchstructure($inbox, $email_number);
  25.  
  26.  
  27.                 /* get information specific to this email */
  28.                 $overview = imap_fetch_overview($inbox, $email_number, 0);
  29.  
  30.                 /* get mesage body */
  31.                 $message = quoted_printable_decode(imap_fetchbody($inbox, $email_number, 2));
  32.  
  33.                 /*
  34.                   // If attachment found use this one
  35.                   // $message = imap_qprint(imap_fetchbody($inbox,$email_number,"1.2"));
  36.                  */
  37.  
  38.                 $output .= 'Subject: ' . imap_utf8($overview[0]->subject) . '<br />';
  39.                 $output .= 'Body: ' . imap_utf8($message) . '<br />';
  40.                 $output .= 'From: ' . imap_utf8($overview[0]->from) . '<br />';
  41.                 $output .= 'Date: ' . imap_utf8($overview[0]->date) . '<br />';
  42.                 $output .= 'Имайл: ' .$fromaddr. '<br /><br />';
  43.                 //$output .= 'CC: ' . $headerInfo->ccaddress . '<br />'; -
  44.  
  45. //  Attachments
  46.                 $attachments = array();
  47.                 if (isset($structure->parts) && count($structure->parts)) {
  48.                     for ($i = 0; $i < count($structure->parts); $i++) {
  49.                         $attachments[$i] = array(
  50.                             'is_attachment' => false,
  51.                             'filename' => '',
  52.                             'name' => '',
  53.                             'attachment' => ''
  54.                         );
  55.  
  56.                         if ($structure->parts[$i]->ifdparameters) {
  57.                             foreach ($structure->parts[$i]->dparameters as $object) {
  58.                                 if (strtolower($object->attribute) == 'filename') {
  59.                                     $attachments[$i]['is_attachment'] = true;
  60.                                     $attachments[$i]['filename'] = $object->value;
  61.                                 }
  62.                             }
  63.                         }
  64.  
  65.                         if ($structure->parts[$i]->ifparameters) {
  66.                             foreach ($structure->parts[$i]->parameters as $object) {
  67.                                 if (strtolower($object->attribute) == 'name') {
  68.                                     $attachments[$i]['is_attachment'] = true;
  69.                                     $attachments[$i]['name'] = $object->value;
  70.                                 }
  71.                             }
  72.                         }
  73.  
  74.                         if ($attachments[$i]['is_attachment']) {
  75.                             $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i + 1);
  76.  
  77.                             /* 3 = BASE64 encoding */
  78.                             if ($structure->parts[$i]->encoding == 3) {
  79.                                 $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
  80.                             }
  81.                             /* 4 = QUOTED-PRINTABLE encoding */ elseif ($structure->parts[$i]->encoding == 4) {
  82.                                 $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
  83.                             }
  84.                         }
  85.                     }
  86.                 }
  87.  
  88.                 foreach ($attachments as $attachment) {
  89.                     if ($attachment['is_attachment'] == 1) {
  90.                         $filename = $attachment['name'];
  91.                         if (empty($filename))
  92.                             $filename = $attachment['filename'];
  93.                         $file_path = 'upload/'; //  Upload folder
  94.                         $fp = fopen($file_path . $filename, "w+");
  95.                         fwrite($fp, $attachment['attachment']);
  96.                         fclose($fp);
  97.                     }
  98.                 }
  99. //  Attachments
  100.  
  101.                 /* change the status */
  102.                 $status = imap_setflag_full($inbox, $overview[0]->msgno, "\Seen \Flagged");
  103.             }
  104.  
  105.             echo $output;
  106.         }
  107.  
  108.         /* close the connection */
  109.         imap_close($inbox);

Код: HTML
  1. </body>
  2. </html>


jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: Четене на имейл
« Отговор #1 -: 19 Ноември 2016, 01:31:09 »
Отдавна не съм се занимавал с php, но навремето се рових доста. Опитай следното:

Код: PHP
  1. $output .= 'Body: ' . imap_utf8($message) . '<br />';
  2.  
  3. // промени към:
  4.  
  5. $output .= 'Body: ' . imap_utf8('=?UTF-8?B?'.base64_encode($messаge).'?=') . '<br />';
  6.  
  7. // или ....
  8. $output .= 'Body: ' . imap_utf8(base64_encode($message)) . '<br />';
  9.  
  10.  
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

woodmonster

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 12
Re: Четене на имейл
« Отговор #2 -: 19 Ноември 2016, 04:22:05 »
Отдавна не съм се занимавал с php, но навремето се рових доста. Опитай следното:

Код: PHP
  1. $output .= 'Body: ' . imap_utf8($message) . '<br />';
  2.  
  3. // промени към:
  4.  
  5. $output .= 'Body: ' . imap_utf8('=?UTF-8?B?'.base64_encode($messаge).'?=') . '<br />';
  6.  
  7. // или ....
  8. $output .= 'Body: ' . imap_utf8(base64_encode($message)) . '<br />';
  9.  
  10.  

Пробвах и двата варианта. Не сработват!

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: Четене на имейл
« Отговор #3 -: 19 Ноември 2016, 14:00:19 »
Стрелям на посоки понеже няма как да тествам кода ти, но сложи и header функцията.

Код: PHP
  1.  
  2. header('Content-Type: text/html; charset=utf-8');
  3.  
  4. /* Create gmail connection */
  5.         $hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
  6.  
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

woodmonster

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 12
Re: Четене на имейл
« Отговор #4 -: 19 Ноември 2016, 16:47:17 »
Стрелям на посоки понеже няма как да тествам кода ти, но сложи и header функцията.

Код: PHP
  1.  
  2. header('Content-Type: text/html; charset=utf-8');
  3.  
  4. /* Create gmail connection */
  5.         $hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
  6.  

Благодаря Ви за отделеното време, но и по този начин кода не сработва!

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: Четене на имейл
« Отговор #5 -: 19 Ноември 2016, 18:26:42 »
Кой редактор ползваш да пишеш код? По късно ще инсталирам imap на сървъра си и ще тествам кода ти.
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

woodmonster

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 12
Re: Четене на имейл
« Отговор #6 -: 19 Ноември 2016, 19:37:28 »
Кой редактор ползваш да пишеш код? По късно ще инсталирам imap на сървъра си и ще тествам кода ти.

Използвам Netbeans!

Доста се рових из интрнет и намерих решение на проблема, а то е, че за да сработи както аз искам трябва да използвам base64_encode.
Ето вече и работещ код:
Код: PHP
  1. /* Create gmail connection */
  2.         $hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
  3.         $username = 'user@gmail.com';
  4.         $password = 'pass';
  5.         $inbox = imap_open($hostname, $username, $password) or die('Cannot connect to Gmail: ' . imap_last_error());
  6.  
  7.         /* Fetch emails */
  8.         $emails = imap_search($inbox, "UNSEEN");
  9.  
  10.         /* If emails are returned, cycle through each... */
  11.         if ($emails) {
  12.             $output = '';
  13.  
  14.             /* Make the newest emails on top */
  15.             rsort($emails);
  16.  
  17.             /* For each email... */
  18.             foreach ($emails as $email_number) {
  19.  
  20.                 $headerInfo = imap_headerinfo($inbox, $email_number);
  21.  
  22.                 //показва емайл адреса
  23.                 $fromaddr = $headerInfo->from[0]->mailbox . "@" . $headerInfo->from[0]->host;
  24.  
  25.                 $structure = imap_fetchstructure($inbox, $email_number);
  26.  
  27.                 /* get mesage body */
  28.                 $overview = imap_fetch_overview($inbox, $email_number, 0);
  29.  
  30.                 if (isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) {
  31.                     $part = $structure->parts[1];
  32.                     $message = imap_fetchbody($inbox, $email_number, 2);
  33.  
  34.                     if ($part->encoding == 3) {
  35.                         $message = imap_base64($message);
  36.                     } else if ($part->encoding == 1) {
  37.                         $message = imap_8bit($message);
  38.                     } else {
  39.                         $message = quoted_printable_decode(imap_fetchbody($inbox, $email_number, 2));
  40.                     }
  41.                 }
  42.  
  43.                 /* get information specific to this email */
  44.  
  45.                 /*
  46.                   // If attachment found use this one
  47.                   // $message = imap_qprint(imap_fetchbody($inbox,$email_number,"1.2"));
  48.                  */
  49.  
  50.                 $output .= 'Subject: ' . imap_utf8($overview[0]->subject) . '<br />';
  51.                 $output .= 'Body: ' . $message . '<br />';
  52.                 $output .= 'From: ' . imap_utf8($overview[0]->from) . '<br />';
  53.                 $output .= 'Date: ' . imap_utf8($overview[0]->date) . '<br />';
  54.                 $output .= 'Имeйл: ' .$fromaddr. '<br /><hr />';
  55.                 //$output .= 'CC: ' . $headerInfo->ccaddress . '<br />'; -
  56.  
  57. //  Attachments
  58.                 $attachments = array();
  59.                 if (isset($structure->parts) && count($structure->parts)) {
  60.                     for ($i = 0; $i < count($structure->parts); $i++) {
  61.                         $attachments[$i] = array(
  62.                             'is_attachment' => false,
  63.                             'filename' => '',
  64.                             'name' => '',
  65.                             'attachment' => ''
  66.                         );
  67.  
  68.                         if ($structure->parts[$i]->ifdparameters) {
  69.                             foreach ($structure->parts[$i]->dparameters as $object) {
  70.                                 if (strtolower($object->attribute) == 'filename') {
  71.                                     $attachments[$i]['is_attachment'] = true;
  72.                                     $attachments[$i]['filename'] = $object->value;
  73.                                 }
  74.                             }
  75.                         }
  76.  
  77.                         if ($structure->parts[$i]->ifparameters) {
  78.                             foreach ($structure->parts[$i]->parameters as $object) {
  79.                                 if (strtolower($object->attribute) == 'name') {
  80.                                     $attachments[$i]['is_attachment'] = true;
  81.                                     $attachments[$i]['name'] = $object->value;
  82.                                 }
  83.                             }
  84.                         }
  85.  
  86.                         if ($attachments[$i]['is_attachment']) {
  87.                             $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i + 1);
  88.  
  89.                             /* 3 = BASE64 encoding */
  90.                             if ($structure->parts[$i]->encoding == 3) {
  91.                                 $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
  92.                             }
  93.                             /* 4 = QUOTED-PRINTABLE encoding */ elseif ($structure->parts[$i]->encoding == 4) {
  94.                                 $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
  95.                             }
  96.                         }
  97.                     }
  98.                 }
  99.  
  100.                 foreach ($attachments as $attachment) {
  101.                     if ($attachment['is_attachment'] == 1) {
  102.                         $filename = $attachment['name'];
  103.                         if (empty($filename))
  104.                             $filename = $attachment['filename'];
  105.                         $file_path = 'upload/'; //  Upload folder
  106.                         $fp = fopen($file_path . $filename, "w+");
  107.                         fwrite($fp, $attachment['attachment']);
  108.                         fclose($fp);
  109.                     }
  110.                 }
  111. //  Attachments
  112.  
  113.                 /* change the status */
  114.                 $status = imap_setflag_full($inbox, $overview[0]->msgno, "\Seen \Flagged");
  115.             }
  116.  
  117.             echo $output;
  118.         }
  119.  
  120.         /* close the connection */
  121.         imap_close($inbox);

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: Четене на имейл
« Отговор #7 -: 19 Ноември 2016, 19:59:31 »
Така е. Нещата се получават с ровене и питане. Не знаех, че има готова функция за целта. Мислех, че така ще работи но явно съм грешал - 

Код: PHP


PS: Тествах кода ти и при мен работи без грешка.
« Последна редакция: 19 Ноември 2016, 20:13:54 от jazzman »
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html