Seriously amended code...
function getMsg($download_action, $mail_action)
{
if(!$this->msg_uid) {
$this->buildErrorMsg($this->ERR_STR_MSG_UID_INVALID, imap_last_error());
return false;
}
$msg_no = imap_msgno($this->stream, $this->msg_uid);
$headers = @imap_header($this->stream, $msg_no);
if(!$headers) {
$this->buildErrorMsg($this->ERR_STR_MSG_NO_INVALID, imap_last_error());
return false;
}
$arr["date"] = gmstrftime ("%b %d %Y %H:%M:%S", strtotime($headers->date));
$arr["raw_from"] = $this->decodeHeader($headers->fromaddress);
$arr["raw_cc"] = $this->decodeHeader($headers->ccaddress);
$arr["from"] = $this->makeAddress($headers->from, "$mail_action&msg_uid=$this->msg_uid&mailbox=$this->mailbox");
$arr["cc"] = $this->makeAddress($headers->cc, "$mail_action&msg_uid=$this->msg_uid&mailbox=$this->mailbox");
$arr["subject"] = $this->decodeHeader($headers->subject);
if(empty($arr["subject"])) $arr["subject"] = $this->STR_NO_SUBJECT;
$arr["message_id"] = $headers->message_id;
$arr["references"] = $headers->references;
//from here - need to work out the MIME type etc and produce the download link accordingly.
$struct = @imap_fetchstructure($this->stream, $this->msg_uid, FT_UID);
$arr["struct"]=$struct;
$arr["num_parts"] = count($struct->parts) - 1;
$html = 0;
/* this will give a list of all necessary mime type headers to sort out the message & attachments.
echo "<font color=green>type ".$struct->type."\n<br>";
echo "encoding ".$struct->encoding."\n<br>";
echo "subtype ".$struct->subtype."\n<br>";
echo "description ".$struct->description."\n<br>";
echo "id ".$struct->id."\n<br>";
echo "lines ".$struct->lines."\n<br>";
echo "bytes ".$struct->bytes."\n<br>";
echo "disposition ".$struct->disposition."\n<br>";
echo "ifdparameters ".$struct->ifdparameters."\n<br>";
echo "dparameters ".$struct->dparameters."\n<br>";
echo "dparameters=>filename ".$struct->dparameters[0]->attribute."\n<br>";
echo "dparameters=>value ".$struct->dparameters[0]->value."\n<br>";
echo "parameters ".count($struct->parameters->value)."\n<br>";
echo "parts ".count($struct->parts)."\n<br></font><br>";
echo "subs ".$struct->parts[0]->subtype;
echo imap_fetchbody($this->stream, $this->msg_uid, "1.2", FT_UID);
/*This is the main message body handling area*/
/*********************************************/
if (($struct->parts !=0 && strtolower($struct->disposition) != "attachment") || $struct->bytes!=0) {
if ($struct->type == 1) //multipart message
{
if (strtolower($struct->subtype)=="alternative")
{
for($i=0; $i< count($struct->parts); $i++) {
$type[$i]=$struct->parts[$i]->subtype;
}
if (strtolower($type[0])=="html")
{
$text=imap_fetchbody($this->stream, $this->msg_uid, "1", FT_UID);
if ($struct->parts[1]->encoding ==3) {
$arr["body"] = imap_base64($text);
$html = 1;
}
else if ($struct->parts[1]->encoding == 4 ) {
$arr["body"] = imap_qprint($text);
$html = 1;
}
else if ($struct->parts[1]->encoding == 0) {
$arr["body"] = $text;
$html = 1;
}
}
elseif (strtolower($type[1])=="html")
{
$text=imap_fetchbody($this->stream, $this->msg_uid, "2", FT_UID);
if ($struct->parts[1]->encoding ==3) {
$arr["body"] = imap_base64($text);
$html = 1;
}
else if ($struct->parts[1]->encoding == 4 ) {
$arr["body"] = imap_qprint($text);
$html = 1;
}
else if ($struct->parts[1]->encoding == 0) {
$arr["body"] = $text;
$html = 1;
}
}
}
if (strtolower($struct->parts[0]->subtype)=="alternative")
{
for($i=0; $i< count($struct->parts); $i++) {
$type[$i]=$struct->parts[$i]->parts[1]->subtype;
}
if (strtolower($type[0])=="html")
{
$text=imap_fetchbody($this->stream, $this->msg_uid, "1.2", FT_UID);
if ($struct->parts[0]->parts[1]->encoding ==3) {
$arr["body"] = imap_base64($text);
$html = 1;
}
else if ($struct->parts[0]->parts[1]->encoding == 4 ) {
$arr["body"] = imap_qprint($text);
$html = 1;
}
else if ($struct->parts[0]->parts[1]->encoding == 0) {
$arr["body"] = $text;
$html = 1;
}
}
elseif (strtolower($type[1])=="html")
{
$text=imap_fetchbody($this->stream, $this->msg_uid, "1.2", FT_UID);
if ($struct->parts[0]->parts[1]->encoding ==3) {
$arr["body"] = imap_base64($text);
$html = 1;
}
else if ($struct->parts[0]->parts[1]->encoding == 4 ) {
$arr["body"] = imap_qprint($text);
$html = 1;
}
else if ($struct->parts[0]->parts[1]->encoding == 0) {
$arr["body"] = $text;
$html = 1;
}
}
}
}
else {
if($struct->parts[0]->encoding == 3) {
$arr["body"] = imap_base64(imap_fetchbody($this->stream, $this->msg_uid, 1, FT_UID));
if(strtolower($struct->parts[0]->subtype) == 'html') $html = 1;
} else if($struct->parts[0]->encoding == 4) {
$arr["body"] = imap_qprint(imap_fetchbody($this->stream, $this->msg_uid, 1, FT_UID));
if(strtolower($struct->parts[0]->subtype) == 'html') $html = 1;
} else {
if($struct->encoding == 3) {
$arr["body"] = imap_base64(imap_fetchbody($this->stream, $this->msg_uid, 1, FT_UID));
if(strtolower($struct->subtype) == 'html') $html = 1;
} else if($struct->encoding == 4) {
$arr["body"] = imap_qprint(imap_fetchbody($this->stream, $this->msg_uid, 1, FT_UID));
if(strtolower($struct->subtype) == 'html') $html = 1;
} else {
$arr["body"] = imap_fetchbody($this->stream, $this->msg_uid, 1, FT_UID);
if(strtolower($struct->subtype) == 'html') $html = 1;
}
}
}
}
//this next line is the test line to print all the body text as one text document
//$arr["body"]=imap_body($this->stream,$this->msg_uid,FT_UID);
//remove the above line in reality
if(!$html) {
$arr["body"] = str_replace("\r\n", "<BR>", $arr["body"]);
$arr["body"] = eregi_replace( "http://([-a-z0-9\_\./~@?=%(&)|]+)", "<A HREF=\"http://\\1\">[url]http://\\1[/url]</A>", $arr["body"]);
$arr["body"] = eregi_replace( "ftp://([-a-z0-9\_\./~@?=%&]+)", "<A HREF=\"ftp://\\1\">[url]ftp://\\1[/url]</A>", $arr["body"]);
$arr["body"] = eregi_replace( "([-a-z0-9\_\.]+)@([-a-z0-9\_\.]+)", "<A HREF=\"$PHP_SELF?$mail_action&email=\\1@\\2\">\\1@\\2</A>", $arr["body"]);
}
/*End of the message body handling area*/
/***************************************/
/*This is the start of all attachment handling in the main message */
/******************************************************************/
if ($struct->ifdparameters)
{
for($i=0; $i< count($struct->dparameters); $i++) {
if (strtolower($struct->dparameters[$i]->attribute) == "filename"){
$filename= $this->decodeHeader($struct->dparameters[$i]->value);
$arr["parts"][$i] = $this->build_url("$download_action&mailbox=$this->mailbox&msg_uid=$this->msg_uid&part_no=$i&filename=$filename", $filename);
}
}
}
$num=count($struct->parts);
for($i=0; $i< $num; $i++) {
if (strtolower($struct->parts[$i]->disposition)=="attachment")
{
for($z=0; $z< count($struct->parts[$i]->dparameters); $z++) {
if (strtolower($struct->parts[$i]->dparameters[$z]->attribute) == "filename"){
$filename= $this->decodeHeader($struct->parts[$i]->dparameters[$z]->value);
$arr["parts"][$i] = $this->build_url("$download_action&mailbox=$this->mailbox&msg_uid=$this->msg_uid&part_no=$i&filename=$filename", $filename);
}
}
}
else
{
foreach($struct->parts[$i]->parameters as $attr)
if(strtolower($attr->attribute) == 'name') {
$filename = $this->decodeHeader($attr->value);
break;
}
if ($filename){
$arr["parts"][$i] = $this->build_url("$download_action&mailbox=$this->mailbox&msg_uid=$this->msg_uid&part_no=$i&filename=$filename", $filename);
}
}
}
/*The attachment handling stops here*/
/************************************/
return $arr;
}
Cuts out about 50 lines or so....