29.7.3 阅读邮件消息
我们已经将前面的display_list()函数返回的消息数组中的每一条消息连接到了特定的邮件消息。每个连接的格式如下所示:
index.php?action=view-message&messageid=6
messageid是我们前面在标题中得到的索引号。请注意,IMAP消息索引是从1开始的,而不是0。
如果用户点击了其中一个链接,将看到如图29-6所示的输出。
图 29-6 用view-message动作来显示一个特定消息。在这个例子中,该消息是一封垃圾邮件
当我们将这些参数引入到index.php脚本后,将执行如下所示代码:
case'show-headers':
case'hide-headers':
case'view-message':
//if we have just picked a message from the list,or were looking at
//a message and chose to hide or view headers,load a message
$fullheaders=($action=='show-headers');
display_message($_SESSION['auth_user'],
$_SESSION['selected_account'],
$messageid,$fullheaders);
break;
这里,我们检查了$action的变量值是否等于"show-headers"。在这个例子中,该逻辑判断值为false,所以$fullheaders变量值被设置为false。稍后,我们再详细介绍"show-headers"动作。
如下代码行:
$fullheaders=($action=='show-headers');
如果按如下方式编写,可能会更繁琐一些,但是,却可能更清楚:
if($action=='show-headers'){
$fullheaders=true;
}else{
$fullheaders=false;
}
接下来,我们将调用display_message()函数。该函数的输出大部分都是纯HTML,因此在这里,我们将不做详细介绍。调用retrieve_message()函数从邮箱中检索适当的消息:
$message=retrieve_message($auth_user,$accountid,$messageid,$fullheaders);
retrieve_message()函数在mail_fns.php库中,其代码如程序清单29-10所示。
程序清单29-10 mail_fns.php文件的retrieve_message()函数——该函数将从邮箱中取得指定的消息
function retrieve_message($auth_user,$accountid,$messageid,
$fullheaders){
$message=array();
if(!($auth_user&&$messageid&&$accountid)){
return false;
}
$imap=open_mailbox($auth_user,$accountid);
if(!$imap){
return false;
}
$header=imap_header($imap,$messageid);
if(!$header){
return false;
}
$message['body']=imap_body($imap,$messageid);
if(!$message['body']){
$message['body']="[This message has no body]\n\n\n\n\n\n";
}
if($fullheaders){
$message['fullheaders']=imap_fetchheader($imap,$messageid);
}else{
$message['fullheaders']='';
}
$message['subject']=$header->subject;
$message['fromaddress']=$header->fromaddress;
$message['toaddress']=$header->toaddress;
$message['ccaddress']=$header->ccaddress;
$message['date']=$header->date;
//note we can get more detailed information by using from and to
//rather than fromaddress and toaddress,but these are easier
imap_close($imap);
return$message;
}
我们将再次使用open_mailbox()函数打开用户的邮箱。但是,这次我们是查找一个指定的消息,使用该函数库,我们可以分别下载消息标题与消息正文。
在这里,我们使用的3个IMAP函数分别是imap_header()、imap_fetchheader()和imap_body()。请注意,这两个标题函数不同于我们前面使用的imap_headers()。它们的名字在某种程度上容易造成混淆。简而言之:
■imap_headers()——返回邮箱中所有消息的标题摘要。每条消息作为数组的一个元素,并且以数组形式返回。
■imap_header()——以对象的形式返回一条特定消息的标题。
■imap_fetchheader()——以字符串的形式返回一条特定消息的标题。
在这个例子中,我们使用imap_header()函数来填充指定的标题域,用imap_fetchheader()函数来显示用户请求的完整标题(稍后,我们还将详细介绍这一点)。
我们使用imap_header()函数和imap_body()函数建立一个包括我们感兴趣的消息的所有元素的数组。我们以如下方式调用imap_header()函数:
$header=imap_header($imap,$messageid);
可以从这个对象中获得所请求的每一个域:
$message['subject']=$header->subject;
调用imap_body()函数可以将消息体添加到该数组,如下所示:
$message['body']=imap_body($imap,$messageid);
最后,我们将调用imap_close()函数关闭邮箱并返回已经创建的数组。display_message()函数可以在表单中显示消息的域,如图29-6所示。