Rumah pembangunan bahagian belakang tutorial php 用 PHP 实现 POP3 邮件的解码(2)_PHP

用 PHP 实现 POP3 邮件的解码(2)_PHP

Jun 01, 2016 pm 12:32 PM
capai pengekodan ekspres mel bahagian

POP3

MIME 编码方式简介


  MIME 编码方式简介

  Subject: =?gb2312?B?xOO6w6Oh?=

  这里是邮件的主题,可是因为编码了,我们看不出是什么内容,其原来的文本是:“你好!”我们先看看 MIME 编码的两种方法。

  对邮件进行编码最初的原因是因为 Internet 上的很多网关不能正确传输8 bit 内码的字符,比如汉字等。编码的原理就是把 8 bit 的内容转换成 7 bit 的形式以能正确传输,在接收方收到之后,再将其还原成 8 bit 的内容。

  MIME 是“多用途网际邮件扩充协议”的缩写,在 MIME 协议之前,邮件的编码曾经有过 UUENCODE 等编码方式 ,但是由于 MIME 协议算法简单,并且易于扩展,现在已经成为邮件编码方式的主流,不仅是用来传输 8 bit 的字符,也可以用来传送二进制的文件 ,如邮件附件中的图像、音频等信息,而且扩展了很多基于MIME 的应用。从编码方式来说,MIME 定义了两种编码方法Base64与QP(Quote-Printable) :

  Base 64 是一种通用的方法,其原理很简单,就是把三个Byte的数据用 4 个Byte表示,这样,这四个Byte 中,实际用到的都只有前面6 bit,这样就不存在只能传输 7bit 的字符的问题了。Base 64的缩写一般是“B”,像这封信中的Subject 就是用的 Base64 编码。

  另一种方法是QP(Quote-Printable) 方法,通常缩写为“Q”方法,其原理是把一个 8 bit 的字符用两个16进制数值表示,然后在前面加“=”。所以我们看到经过QP编码后的文件通常是这个样子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。

  在 PHP 里,系统有两个函数可以很方便地实现解码:base64_decode()与quoted_printable_decode(),前者可用于base64 编码的解码,后者是用于 QP 编码方法的解码。

  现在我们再来看看Subject: =?gb2312?B?xOO6w6Oh?= 这一主题的内容,这不是一段完整的编码,只有部分是编码了的,这个部分用 =? ?= 两个标记括起来,=? 后面说明的是这段文字的字符集是 GB2312 ,然后一个 ? 后面的一个 B 表示的是用的 Base64 编码。通过这段分析,我们来看一下这个 MIME 解码的函数:(该函数由 PHPX.COM 站长 Sadly 提供,本人将其放入一个类中,并做了少量的修改,在此致谢)

  function decode_mime($string) {

   $pos = strpos($string, ‘=?‘);

   if (!is_int($pos)) {

     return $string;

   }

   $preceding = substr($string, 0, $pos); // save any preceding text

   $search = substr($string, $pos+2); /* the mime header spec says this is the longest a single encoded word can be */

   $d1 = strpos($search, ‘?‘);

   if (!is_int($d1)) {

     return $string;

   }

   $charset = substr($string, $pos+2, $d1); //取出字符集的定义部分

   $search = substr($search, $d1+1); //字符集定义以后的部分=>$search;

   $d2 = strpos($search, ‘?‘);

   if (!is_int($d2)) {

     return $string;

   }

   $encoding = substr($search, 0, $d2); ////两个? 之间的部分编码方式 :q 或 b 

   $search = substr($search, $d2+1);

   $end = strpos($search, ‘?=‘); //$d2+1 与 $end 之间是编码了 的内容:=> $endcoded_text;

   if (!is_int($end)) {

     return $string;

   }

   $encoded_text = substr($search, 0, $end);

   $rest = substr($string, (strlen($preceding . $charset . $encoding . $encoded_text)+6)); //+6 是前面去掉的 =????= 六个字符

   switch ($encoding) {

   case ‘Q‘:

   case ‘q‘:

     //$encoded_text = str_replace(‘_‘, ‘%20‘, $encoded_text);

     //$encoded_text = str_replace(‘=‘, ‘%‘, $encoded_text);

     //$decoded = urldecode($encoded_text);

   $decoded=quoted_printable_decode($encoded_text);

     if (strtolower($charset) == ‘windows-1251‘) {

     $decoded = convert_cyr_string($decoded, ‘w‘, ‘k‘);

     }

     break;

   case ‘B‘:

   case ‘b‘:

     $decoded = base64_decode($encoded_text);

     if (strtolower($charset) == ‘windows-1251‘) {

     $decoded = convert_cyr_string($decoded, ‘w‘, ‘k‘);

     }

     break;

   default:

     $decoded = ‘=?‘ . $charset . ‘?‘ . $encoding . ‘?‘ . $encoded_text . ‘?=‘;

     break;

   }

   return $preceding . $decoded . $this->decode_mime($rest);

  }

  这个函数用了递归的方法来实现一段包含有如上的 Subject 段的字符的解码。程序中已经加上了注释。相信有点PHP 编程基础的人都能够看得明白。该函数也是调用的base64_decode()与quoted_printable_decode()两个系统函数实现的解码,但是需要对邮件源文件进行大量的字符串的分析。不过,PHP 的字符串操作可以算是所有语言里最为方便自由的。函数的最后return $preceding . $decoded . $this->decode_mime($rest); 实现递归解码,因为这个函数实际上是放在后面要介绍的一个 MIME解码的类中的,所以用了 $this->decode_mime($rest)这种形式的调用方法。

  下面我们来看正文。这里关系到 MIME 的一些头信息,我们先做一个简单的介绍(如果读者有兴趣了解更多的内容,请参考 MIME 的官方文档)。

  MIME-Version: 1.0

  表示使用的 MIME 的版本号,一般是1.0;

  Content-Type: 定义了正文的类型,我们实际上是通过这个标识来知道正文内是什么类型的文件,比如:text/plain 表示的是无格式的文本正文,text/html 表示的 Html 文档,image/gif 表示的是 gif 格式的图片等等。在本文中特别要说明一下的是邮件中常用到的复合类型。multipart 类型表示正文是由多个部分组成的,后面的子类型说明的是这些部分之间的关系,邮件中用到的三个类型有,multipart/alternative:表示正文由两个部分组成,可以选择其中的任意一个。主要作用是在征文同时有 text 格式和 html 格式时,可以在两个正文中选择一个来显示,支持 html 格式的邮件客户端软件一般会显示其 HTML 正文,而不支持的则会显示其 Text 正文;multipart/mixed :表示文档的多个部分是混合的,指正文与附件的关系。如果邮件的 MIME 类型是multipart/mixed,即表示邮件带有附件;multipart/related :表示文档的多个部分是相关的,一般用来描述 Html 正文与其相关的图片。

  这些复合类型又是可以嵌套使用的,比如说一个带有附件的邮件,同时有 html 与 text 两种格式的正文,则邮件的结构是:

  Content-Type: multipart/mixed

   部分一:

   Content Type : multipart/alternative:

   Text 正文;

   Html 格式的正文 

  部分二:

   附件

  邮件结束符;

  由于复合类型由多个部分组成,因此,需要一个分隔符来分隔这多个部分,这就是上面的邮件源文件中的boundary="----=_NextPart_000_0007_01C03166.5B1E9510"所描述的,对于每一个Contect type :multipart/* 的内容,都会有这么一个说明,表示多个部分之间的分隔,这个分隔符是正文中不可能出现的一串古字符的组合,在文档中,以 "--" 加上这个boundary 来表示一个部分的开始,在文档的结束,以"--"加boundary再在最后加上 "--" 来表示文档的结束。由于复合类型是可以嵌套使用的,因此,邮件中可能会多个 boundary 。

  还有一个最重要的 MIME 头标签:

  Content-Transfer-Encoding: base64 它表示了这个部分文档的编码方式,也就是我们上面所介绍的Base64或QP(Quote-Printable)。我们只有识别了这个说明,才能用正确的解码方式实现对其解码。

  限于篇幅,对于 MIME 的介绍就只说到这里。下面我将给出一个解码MIME邮件的类,并对其做简要说明。

作者:陈俊清
转载:中华网
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

E-mel Outlook hilang daripada panel kawalan dalam Windows 11 E-mel Outlook hilang daripada panel kawalan dalam Windows 11 Feb 29, 2024 pm 03:16 PM

Adakah ikon mel Outlook tiada daripada Panel Kawalan Windows 11? Keadaan yang tidak dijangka ini telah menyebabkan kekeliruan dan kebimbangan di kalangan sesetengah individu yang bergantung pada OutlookMail untuk keperluan komunikasi mereka. Mengapa e-mel Outlook saya tidak dipaparkan dalam Panel Kawalan? Mungkin terdapat beberapa sebab yang mungkin mengapa tiada ikon mel Outlook dalam Panel Kawalan: Outlook tidak dipasang dengan betul. Memasang aplikasi Office daripada Microsoft Store tidak menambah applet Mel pada Panel Kawalan. Lokasi fail mlcfg32.cpl dalam Panel Kawalan tiada. Laluan ke fail mlcfg32.cpl dalam pendaftaran adalah salah. Sistem pengendalian tidak dikonfigurasikan pada masa ini untuk menjalankan aplikasi ini

Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Mar 24, 2024 am 11:27 AM

Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Dengan kebangkitan media sosial, WeChat telah menjadi salah satu alat komunikasi yang sangat diperlukan dalam kehidupan seharian orang ramai. Walau bagaimanapun, ramai orang mungkin menghadapi masalah: log masuk ke beberapa akaun WeChat pada masa yang sama pada telefon mudah alih yang sama. Bagi pengguna telefon mudah alih Huawei, tidak sukar untuk mencapai log masuk WeChat dwi Artikel ini akan memperkenalkan cara mencapai log masuk WeChat dwi pada telefon mudah alih Huawei. Pertama sekali, sistem EMUI yang disertakan dengan telefon mudah alih Huawei menyediakan fungsi yang sangat mudah - pembukaan dua aplikasi. Melalui fungsi pembukaan dwi aplikasi, pengguna boleh serentak

Cantuman mel perkataan mencetak halaman kosong Cantuman mel perkataan mencetak halaman kosong Feb 19, 2024 pm 04:51 PM

Jika anda mendapati halaman kosong muncul apabila anda mencetak dokumen gabungan mel menggunakan Word, artikel ini akan membantu anda. Cantuman mel ialah ciri mudah yang membolehkan anda membuat dokumen diperibadikan dengan mudah dan menghantarnya kepada berbilang penerima. Dalam Microsoft Word, ciri gabungan mel dipandang tinggi kerana ia membantu pengguna menjimatkan masa menyalin kandungan yang sama secara manual untuk setiap penerima. Untuk mencetak dokumen gabungan mel, anda boleh pergi ke tab Mel. Tetapi sesetengah pengguna Word telah melaporkan bahawa apabila cuba mencetak dokumen gabungan mel, pencetak mencetak halaman kosong atau tidak mencetak langsung. Ini mungkin disebabkan oleh pemformatan atau tetapan pencetak yang salah. Cuba semak tetapan dokumen dan pencetak dan pastikan anda pratonton dokumen sebelum mencetak untuk memastikan kandungannya betul. jika

Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Mar 24, 2024 pm 06:03 PM

Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Dengan populariti perisian sosial dan penekanan yang semakin meningkat terhadap privasi dan keselamatan orang ramai, fungsi klon WeChat telah beransur-ansur menjadi tumpuan perhatian. Fungsi klon WeChat boleh membantu pengguna log masuk ke berbilang akaun WeChat pada telefon mudah alih yang sama pada masa yang sama, menjadikannya lebih mudah untuk diurus dan digunakan. Tidak sukar untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Anda hanya perlu mengikuti langkah berikut. Langkah 1: Pastikan versi sistem telefon mudah alih dan versi WeChat memenuhi keperluan Pertama, pastikan versi sistem telefon mudah alih Huawei anda telah dikemas kini kepada versi terkini, serta Apl WeChat.

Panduan Pengaturcaraan PHP: Kaedah untuk Melaksanakan Jujukan Fibonacci Panduan Pengaturcaraan PHP: Kaedah untuk Melaksanakan Jujukan Fibonacci Mar 20, 2024 pm 04:54 PM

Bahasa pengaturcaraan PHP ialah alat yang berkuasa untuk pembangunan web, yang mampu menyokong pelbagai logik dan algoritma pengaturcaraan yang berbeza. Antaranya, melaksanakan jujukan Fibonacci adalah masalah pengaturcaraan biasa dan klasik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa pengaturcaraan PHP untuk melaksanakan jujukan Fibonacci, dan melampirkan contoh kod tertentu. Jujukan Fibonacci ialah jujukan matematik yang ditakrifkan seperti berikut: unsur pertama dan kedua bagi jujukan ialah 1, dan bermula dari unsur ketiga, nilai setiap unsur adalah sama dengan jumlah dua unsur sebelumnya. Beberapa elemen pertama urutan

Graf pengetahuan: rakan kongsi yang ideal untuk model besar Graf pengetahuan: rakan kongsi yang ideal untuk model besar Jan 29, 2024 am 09:21 AM

Model bahasa besar (LLM) mempunyai keupayaan untuk menghasilkan teks yang lancar dan koheren, membawa prospek baharu ke bidang seperti perbualan kecerdasan buatan dan penulisan kreatif. Walau bagaimanapun, LLM juga mempunyai beberapa had utama. Pertama, pengetahuan mereka terhad kepada corak yang diiktiraf daripada data latihan, kurang pemahaman sebenar tentang dunia. Kedua, kemahiran menaakul adalah terhad dan tidak boleh membuat inferens logik atau menggabungkan fakta daripada pelbagai sumber data. Apabila berhadapan dengan soalan yang lebih kompleks dan terbuka, jawapan LLM mungkin menjadi tidak masuk akal atau bercanggah, dikenali sebagai "ilusi." Oleh itu, walaupun LLM sangat berguna dalam beberapa aspek, ia masih mempunyai had tertentu apabila berhadapan dengan masalah kompleks dan situasi dunia sebenar. Untuk merapatkan jurang ini, sistem penjanaan dipertingkatkan semula (RAG) telah muncul dalam beberapa tahun kebelakangan ini

Kuasai cara Golang mendayakan kemungkinan pembangunan permainan Kuasai cara Golang mendayakan kemungkinan pembangunan permainan Mar 16, 2024 pm 12:57 PM

Dalam bidang pembangunan perisian hari ini, Golang (bahasa Go), sebagai bahasa pengaturcaraan yang cekap, ringkas dan sangat bersesuaian, semakin digemari oleh pembangun. Perpustakaan standardnya yang kaya dan ciri-ciri konkurensi yang cekap menjadikannya pilihan berprofil tinggi dalam bidang pembangunan permainan. Artikel ini akan meneroka cara menggunakan Golang untuk pembangunan permainan dan menunjukkan kemungkinan besarnya melalui contoh kod tertentu. 1. Kelebihan Golang dalam pembangunan permainan Sebagai bahasa yang ditaip secara statik, Golang digunakan dalam membina sistem permainan berskala besar.

Panduan Pelaksanaan Keperluan Permainan PHP Panduan Pelaksanaan Keperluan Permainan PHP Mar 11, 2024 am 08:45 AM

Panduan Pelaksanaan Keperluan Permainan PHP Dengan populariti dan perkembangan Internet, pasaran permainan web menjadi semakin popular. Ramai pembangun berharap untuk menggunakan bahasa PHP untuk membangunkan permainan web mereka sendiri, dan melaksanakan keperluan permainan adalah langkah utama. Artikel ini akan memperkenalkan cara menggunakan bahasa PHP untuk melaksanakan keperluan permainan biasa dan menyediakan contoh kod khusus. 1. Cipta watak permainan Dalam permainan web, watak permainan adalah elemen yang sangat penting. Kita perlu mentakrifkan atribut watak permainan, seperti nama, tahap, nilai pengalaman, dll., dan menyediakan kaedah untuk mengendalikannya

See all articles