29.7.3 阅读邮件消息

我们已经将前面的display_list()函数返回的消息数组中的每一条消息连接到了特定的邮件消息。每个连接的格式如下所示:


index.php?action=view-message&messageid=6


messageid是我们前面在标题中得到的索引号。请注意,IMAP消息索引是从1开始的,而不是0。

如果用户点击了其中一个链接,将看到如图29-6所示的输出。

29.7.3 阅读邮件消息 - 图1

图 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所示。