首页 > 编程技术 > php

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

发布时间:2016-11-25 16:33

初步认识邮件的源文件
  本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理;针对收取和MIME解码,提供了两个实用的PHP类,并提供了使用的样例。分为邮件收取、MIME解码两个部分。我们已经向您介绍过了邮件的收取,现在让我们来为您介绍本文的解码部。
  在上一篇里,我们已经完成了一个用PHP通过POP3收取邮件的实例,可是在使用这个类的时候,相信你已经看到了,很多的邮件收下来是一堆乱码,自己根本看不懂!是的。现在的邮件大部分都已经经过了编码,需要一个解码的过程才能变成我们习惯的文字、图片、或是其它的附件。
  邮件的源文件
  首先,我们来看一段简单的邮件的源文件:(在Foxmail中,选中邮件,点选“查看源文件”就会看到这样的些内容了)
  From:
  To:
  Subject: =?gb2312?B?xOO6w6Oh?=
  Date: Sun, 8 Oct 2000 20:28:45 +0800
  MIME-Version: 1.0
  Content-Type: multipart/alternative;
   boundary="----=_NextPart_000_0007_01C03166.5B1E9510"
  X-Priority: 3
  X-MSMail-Priority: Normal
  X-Mailer: Microsoft Outlook Express 5.00.2919.6700
  X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6700
  This is a multi-part message in MIME format.
  ------=_NextPart_000_0007_01C03166.5B1E9510
  Content-Type: text/plain;
   charset="gb2312"
  Content-Transfer-Encoding: base64
  w7vT0MLSwuuwyaO/DQo=
  ------=_NextPart_000_0007_01C03166.5B1E9510
  Content-Type: text/html;
   charset="gb2312"
  Content-Transfer-Encoding: base64
  PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
  L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdi
  MjMxMiIgaHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNS4w
  MC4yOTIwLjAiIG5hbWU9R0VORVJBVE9SPg0KPFNUWUxFPjwvU1RZTEU+DQo8L0hFQUQ+DQo8Qk9E
  WSBiZ0NvbG9yPSNmZmZmZmY+DQo8RElWPjxGT05UIHNpemU9Mj7Du9PQwtLC67DJo788L0ZPTlQ+
  PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg==
最近在用PHP作一社区, 在写到计算最高上线人数时, 成功调试出把PHP作为shell script直接在服务器上运行.
在作社区时, 时常需要统计上线人数等数据. 一般做法是, 把这段代码放在用户login或者某一个页面中, 以便在用户登录或访问到该时,触发运行该代码. 这样一来, 会造成一个问题, 如果该代码教复杂, 明显减慢该页的正常调用速度.
利用PHP 的这种特性,加上linux的crontab指令,即可自动定时执行某一个php文件(统计在线人数等).
具体方法:
在安装PHP的时候,会产生一个可执行文件,文件名为php.将它它 copy 到 /usr/local/bin 下.
在终端方式执行php程序: php -q onlinnum.php<Enter>
注意到 PHP 原本是应用在网页应用的╋因此它内定会送出 HTML 的 HEADER╋但是在此我们是要将 PHP 用作 Shell Script╋"-q" 就是表示不要送出 HEADER 的意思.你可以试试看不加上 -q 的显示结果。
此时你已经可以在终端方式下执行PHP 代码了. 呵呵,可以试试执行你以前写的代码.
linux命令:cron daemon
这是一个系统中常驻的服务,功能在于执行例行性的工作,如每天一次或每月一次检查磁盘。cron daemon 会在每分钟检查一次排定的工作表(crontab),看看是否有要执行的指令,所有的输出会以mail寄给用户。
设置 crontab
命令:crontab -e<Enter>
该命令呼叫vi编辑器来编辑执行的清单。例如
            0 0 1,15 * * fsck /home
            1 * * * * /home/Gull/onlinnumber
每一行代表一项排定的工作,在指令前为排定的时间,总共有5个栏位,以空格间隔,由左到右依序如下:
       栏位        说明
        --------------------------
       分钟       从00到99
       点钟       从0到24
       日       从01到31
       月       从01到12
POP协议简介
  本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理;针对收取和MIME解码,提供了两个实用的PHP类,并提供了使用的样例。分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取,解码部分会在以后的文章中为各位详细的介绍,敬请关注。
  现在Internet上最大的应用应该是非Email莫属了,我们每天都习惯于每天通过Email进行交流,各大网站也几乎都推出了自己的基于WEB的免费邮件系统。在本文里,笔者将介绍一些Email实现的一些原理。同时我们假设你对于PHP的编程有一定的基础,对于TCP/IP协议也有一定的了解。
POP 协议简介
  POP的全称是 Post Office Protoco ,即邮局协议,用于电子邮件的接收,现在常 用的是第三版 ,简称为 POP3。通过POP协议,客户机登录到服务器上后,可以对自己的邮件进行删除,或是下载到本地,下载后,电子邮件客户软件就可以在本地对邮件进行修改、删除等。另外一种用于接收信件的邮件是 IMAP 协议,现在发展很快,在本文中,我们暂不讨论。
  POP服务器一般使用的是TCP的110号端口,如果你用的是Foxmail的话,在其收邮件的时候,你可以看到其信息提示窗口有这么一些命令:
  “正在连接到 62.123.23.123:110";
  "USER BOSS_CH";
  "PASS..............";
  下面让我们来看一段 与 POP3 服务器对话的实录:
  telenet pop.china.com 110
  +OK AIMC POP service (mail2.china.com) is ready.
  USER boss_ch
  +OK Please enter password for user .
  PASS ******
  +OK boss_ch has 1 messages (750 octets)
  STAT
  +OK 1 750
  LIST
  +OK 1 messages (750 octets)
  1 750
  RETR 1
  +OK 750 octets
  Received: from smtp2.ptt.js.cn([202.102.24.37]) by china.com(JetMail 2.5.3.0)
  with SMTP id jm4839cc4227; Sat, 23 Sep 2000 05:31:21 -0000
  Received: from chenjunqing ([61.155.120.6]) by smtp2.ptt.js.cn
  (Netscape Messaging Server 4.15) with SMTP id G1BRHJ03.V07 for
  ; Sat, 23 Sep 2000 13:34:31 +0800
  Date: Sat, 23 Sep 2000 13:34:18 +0800
  From: =?ISO-8859-1?Q?=B3=C2=BF=A1=C7=E5?=
应用实例
  POP3收取邮件的类在前面的文章中已经给大家做了详细的介绍,下面我们来看看如何应用这个类:
  
  include("pop3.inc.php");
  $host="pop.china.com";
  $user="boss_ch";
  $pass="026007";
  $rec=new pop3($host,110,2);
  if (!$rec->open()) die($rec->err_str);
  echo "open ";
  if (!$rec->login($user,$pass)) die($rec->err_str);
  echo "login";
  if (!$rec->stat()) die($rec->err_str);
  echo "共有".$rec->messages."封信件,共".$rec->size."字节大小
";
  
  if ($rec->messages>0)
   {
   if (!$rec->listmail()) die($rec->err_str);
   echo "有以下信件:
";
   for ($i=1;$i<=count($rec->mail_list);$i++)
   {
   echo "信件".$rec->mail_list[$i][num]."大小:".$rec->mail_list[$i][size]."
";
   }
   $rec->getmail(1);
   echo "邮件头的内容:
";
   for ($i=0;$ihead);$i++)
   echo htmlspecialchars($rec->head[$i])."
n";
   echo "邮件正文 :
";
   for ($i=0;$ibody);$i++)
   echo htmlspecialchars($rec->body[$i])."
n";
   }
  $rec->close();
  ?>
  如果你把pop3类中的debug设为true的话,你还可以看到程序与pop3服务器是如何对话的,用于正在调试的程序来说,这样显得更为直观。
  小结
  从以上的这个实例我们可以看到PHP真的是网站开发的一个功能非常强大的工具,但是也可以感觉到,PHP做为一种混合形的语言,其面对对象的开发与其它的工具如java相比还存在不少让人遗憾的地方。这个pop类的实现也还有不少需要改进之处,欢迎各位同仁们指导。
作者:陈俊清
如有想要取得完整的源代码的朋友,请与本人联系:boss_ch@netease.com
转载:中华网

作者:东方一蛇   
搞完了PHP4调用JavaBean,又想去试试调用COM,开始以为很难,自己用VB6写了一个Active Dll在PHP4中调用,马上成功,比调用javabean方便多了,下面讲一下我的步骤。
下载的版本是从http://www.mm4.de/。
一:用VB6写Activex Dll
代码如下:
Option Explicit
Private MyScriptingContext As ScriptingContext
Private MyApplication As Application
Private MyRequest As Request Private MyResponse As Response
Private MyServer As Server
Private MySession As Session Public
Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub
Public Sub OnEndPage()
Set MyScriptingContext = Nothing
Set MyApplication = Nothing
Set MyRequest = Nothing
Set MyResponse = Nothing
Set MyServer = Nothing
Set MySession = Nothing
End Sub
Public Function Test_Number(num) As Variant
If num < 0 Then Get_Number_Attrib = -1
If num > 0 Then Get_Number_Attrib = 1
If num = 0 Then Get_Number_Attrib = 0
End Function
具体方法如下:新建一个VB6工程,ActiveX Dll将工程命名为P_test,类名为c_test
类的文件内容如上。
编译生成p_test.dll文件
二:注册
提示符下运行:regsvr32 p_test.dll
三:编写php文件,test.php4代码如下:

$b=new COM("p_test.c_test");
$a=$b->Test_Number(-454);
echo $a;
?>
运行php4文件将显示-1
可能遇到的问题是,编译工程时通不过,要将
Microsoft Active Server Pages Object Library
引用进来,具体实现“Project->References”找到改库,并勾上
相比之下,PHP4调用com应该比PHP4调用javabean好哦,因为毕竟是Ms系统嘛。大家也可以去自己编写调用数据库的控件,用PHP4调用,从某种程度上,和PHP调用javabean一样,可以说,实现了“隐藏源代码”。
本文出自:
标签:[!--infotagslink--]

您可能感兴趣的文章: