Clivern / Imap

:mailbox_with_mail: Access Mailbox Using PHP IMAP.
MIT License
31 stars 16 forks source link

How decode body if body encoding info is null? #31

Open MustafaBKLZ opened 1 year ago

MustafaBKLZ commented 1 year ago

Hello,

I have a mail is body encoding info is null. This mail body see like this...

PGRpdj55ZXNzczwvZGl2PjxkaXY+PGJyIC8+PC9kaXY+PGRpdj48YnIgLz48L2Rpdj48ZGl2PjI2 LjEyLjIwMjIsIDIzOjIxLCAiTXVzdGFmYSBCw5xLw5xMTUVaIiAmbHQ7bXVzdGFmYWJ1a3VsbWV6 MzQ0NkBnbWFpbC5jb20mZ3Q7OjwvZGl2PjxibG9ja3F1b3RlPjxkaXYgZGlyPSJsdHIiPnZhYWFv xLF3d3d3IE11c3RhZmEgQmV5Y2nEn2ltIGJ1IGhhcmlrYWFhLiBWYW93IHg1NDIxIHlhbmkgOio8 YnIgY2xlYXI9ImFsbCIgLz48ZGl2PjxkaXYgY2xhc3M9ImIzMzdiNjkyMjdjM2U4MWM2NzBiOWZl ZTQwYTQ2ZGNnbWFpbF9zaWduYXR1cmUiIGRpcj0ibHRyIj48ZGl2IGRpcj0ibHRyIj48YnIgLz48 ZGl2PjxiPk11c3RhZmEgQsOcS8OcTE1FWjwvYj48L2Rpdj48ZGl2PllhesSxbMSxbSBHZWxpxZ90 aXJtZSBVem1hbsSxIC8gU29mdHdhcmUgRGV2ZWxvcGVyIFNwZWNpYWxpc3Q8L2Rpdj48ZGl2Pjxi PkRpc2NvcmQnYSBLYXTEsWxhYmlsaXJzaW5pei48L2I+IDxhIGhyZWY9Imh0dHBzOi8vZGlzY29y ZC5nZy9FamgycHJzc3M1IiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9kaXNjb3JkLmdnL0VqaDJw cnNzczU8L2E+PGJyIC8+PC9kaXY+PGRpdj5LacWfaXNlbCBTaXRlbTogPGEgaHJlZj0iaHR0cHM6 Ly9tdXN0YWZhYnVrdWxtZXouY29tLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vbXVzdGFmYWJ1 a3VsbWV6LmNvbS88L2E+PC9kaXY+PGRpdj5EacSfZXIgTGlua2xlcjogPGEgaHJlZj0iaHR0cHM6 Ly9saW5rdHIuZWUvbXVzdGFmYWJ1a3VsbWV6IiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9saW5r dHIuZWUvbXVzdGFmYWJ1a3VsbWV6PC9hPjxiciAvPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pjxi ciAvPjwvZGl2PjxiciAvPjxkaXYgY2xhc3M9ImYxM2NhNDg3MTljOGE2MDAzMzkwNWIyM2IzOTY3 NWFnbWFpbF9xdW90ZSI+PGRpdiBjbGFzcz0iMzM0ZDdkMzQxZTMyMzNjNWIyN2NhOTEyOTc0NDUx MjdnbWFpbF9hdHRyIiBkaXI9Imx0ciI+RGlqaXRhbCBPcnRhxJ/EsW0gJmx0OzxhIGhyZWY9Im1h aWx0bzphbmFsaXpAZGlqaXRhbG9ydGFnaW0uY29tIj5hbmFsaXpAZGlqaXRhbG9ydGFnaW0uY29t PC9hPiZndDssIDI2IEFyYSAyMDIyIFB6dCwgMjM6MTggdGFyaWhpbmRlIMWfdW51IHlhemTEsTo8 YnIgLz48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZjEzY2E0ODcxOWM4YTYwMDMzOTA1YjIzYjM5 Njc1YWdtYWlsX3F1b3RlIiBzdHlsZT0iYm9yZGVyLWxlZnQtY29sb3I6cmdiKCAyMDQgLCAyMDQg LCAyMDQgKTtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtib3JkZXItbGVmdC13aWR0aDoxcHg7bWFy Z2luOjBweCAwcHggMHB4IDAuOGV4O3BhZGRpbmctbGVmdDoxZXgiPgoKCgoKCgogICAgCiAgICAK ICAgIAogICAgCiAgICAKICAgIAoKICAgIAoKCjxkaXY+CiAgICAKICAgIDxzcGFuIHN0eWxlPSJk aXNwbGF5Om5vbmU7Zm9udC1zaXplOjBweDtsaW5lLWhlaWdodDowcHg7bWF4LWhlaWdodDowcHg7 bWF4LXdpZHRoOjBweDtvcGFjaXR5OjA7b3ZlcmZsb3c6aGlkZGVuIj4qfE1DX1BSRVZJRVdfVEVY VHwqPC9zcGFuPgogICAgCiAgICAKICAgIDxjZW50ZXI+CiAgICAgICAgPHRhYmxlIGlkPSI3YTQ2 OWYzYmIxZTczYzllMjJjYjEyY2ZmM2YwNmQ3Y21fMTE4MzQ3NzAxMjk2MDY1MDMwM2JvZHlUYWJs ZSIgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9 IjAiIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiPjx0Ym9keT48dHI+PHRkIGlkPSI3ZTIyMmQ0 Mzg4YTk1YzFhNGE0Yzc2N2IyZDI5NWExMG1fMTE4MzQ3NzAxMjk2MDY1MDMwM2JvZHlDZWxsIiBh bGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgc3R5bGU9InBhZGRpbmctYm90dG9tOjQwcHgiPgog ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAi IGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0Ym9keT48dHI+ PHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgaWQ9IjFlY2Y2 MTMzNTE1OTc0YjJiN2ZjYTc0MmJmNjBlYjBlbV8xMTgzNDc3MDEyOTYwNjUwMzAzdGVtcGxhdGVQ cmVoZWFkZXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0 aD0iMTAwJSI+PHRib2R5Pjx0cj48dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHN0eWxl PSJwYWRkaW5nLWxlZnQ6MTBweDtwYWRkaW5nLXJpZ2h0OjEwcHgiPgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5n PSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjYwMCI+PHRib2R5Pjx0cj48dGQgYWxpZ249ImNl bnRlciIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDx0YWJsZSBpZD0iMjkwMGRmMjViNGQyYzQxNWUxMmMyMTEyNWJm ... and have more...

This mail can be solved with

imap_base64()

but when i check mail's encoding with this and this return null.

$message->body()->getEncoding();

I solve this problem temporary. I solve like this...

// 
$body = $message->body()->getMessage();
$encode = $message->body()->getEncoding();
      if ($encode == null) {
             echo imap_base64($body);
      } else {
             echo $body;
      }

I tried to solve this problem in src/core/Message/Body.php but without success.

I belive this way not correct. Because maybe the encoding information is empty, but the mail may be encoded with other encoding types. In this case, we cannot know with which encoding method the mail was encoded. So I guess this way is not correct.

I don't know how to solve this correctly. I wanted to write because maybe you know how to solve this problem.

Clivern commented 1 year ago

Hi @MustafaBKLZ,

I guess your problem is here https://github.com/Clivern/Imap/blob/master/src/Core/Message/Body.php#L85-L92 since the encoding is null, it won't go through the base64. Please check the documentation https://www.php.net/manual/en/function.imap-fetchstructure.php, you can see that if the encoding value is 3, it means base64. BTW Which PHP version are you using? maybe you need to upgrade or maybe the issue from the mail server!

Only solution in my mind is to change here https://github.com/Clivern/Imap/blob/master/src/Core/Message/Body.php#L85-L92 to something like the following & see if it works!

} elseif (null === $part->encoding) {
     $this->message = imap_base64($this->message);
}