Thunderbird没有正确显示邮件(php mail())

时间:2011-11-30 14:37:53

标签: php email attachment thunderbird

我对Thunderbird有一点问题。我正在尝试使用html版本和纯文本版本以及附件从php发送邮件。邮件在Yahoo,Gmail和Roundcube中正确显示,但在Thunderbird中没有。我希望任何人都能看到问题所在。这是生成我的邮件的脚本。 $ html = html内容和$ plain =纯文本内容

function preparehtmlmail($html, $plain) {

preg_match_all('~<img.*?src=.([\/.a-z0-9:_-]+).*?>~si',$html,$matches);
$i = 0;
$paths = array();

foreach ($matches[1] as $img) {
$img_old = $img;

if(strpos($img, "http://") == false) {
  $uri = parse_url($img);
  $paths[$i]['path'] = $_SERVER['DOCUMENT_ROOT'].$uri['path'];
  $content_id = md5($img);
  $html = str_replace($img_old,'cid:'.$content_id,$html);
  $paths[$i++]['cid'] = $content_id;
}
}

$boundary = "--".md5(uniqid(time()));
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$boundary\"\n";
$headers .= "From: orders@harliespeed.com\r\n";
$multipart = '';
$multipart .= "--$boundary\n";
$kod = 'utf-8';
$multipart .= "Content-Type: text/plain; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "$plain\n\n";
$multipart .= "--$boundary\n";
$kod = 'utf-8';
$multipart .= "Content-Type: text/html; charset=$kod\n";
$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
$multipart .= "$html\n\n";

foreach ($paths as $path) {
if(file_exists($path['path']))
  $fp = fopen($path['path'],"r");
  if (!$fp)  {
    return false;
  }

$imagetype = substr(strrchr($path['path'], '.' ),1);
$file = fread($fp, filesize($path['path']));
fclose($fp);

$message_part = "";

switch ($imagetype) {
  case 'png':
  case 'PNG':
        $message_part .= "Content-Type: image/png";
        break;
  case 'jpg':
  case 'jpeg':
  case 'JPG':
  case 'JPEG':
        $message_part .= "Content-Type: image/jpeg";
        break;
  case 'gif':
  case 'GIF':
        $message_part .= "Content-Type: image/gif";
        break;
}

$message_part .= "; file_name = \"$path\"\n";
$message_part .= 'Content-ID: <'.$path['cid'].">\n";
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: inline; filename = \"mail_logo.jpg\"\n\n";
$message_part .= chunk_split(base64_encode($file))."\n";
$multipart .= "--$boundary\n".$message_part."\n";

  }

  $multipart .= "--$boundary--\n";
  return array('multipart' => $multipart, 'headers' => $headers);  

}

1 个答案:

答案 0 :(得分:2)

您应该使用多部分MIME部件正确撰写邮件。一个用于text / html版本的多部分,另一个用于HTML和图像的多部分。

对于HTML和文本版本,您应该使用multpart / alternative,对于HTML和图像,您应该使用multipart / related。你的电子邮件应该是这样的(我为了可读性而缩进):

Content-Type:multipart/alternative; boundary ---01
  Content-Type:text/plain; boundary ---02
     Your text version content
  ---02
  Content-Type:multipart/related; boundary ---03
     Content-Type:text/html; boundary ---04
       Your HTML version content
     ---04
     Content-Type: image/jpeg; boundary ---05
        Your image content
     ---05
  --- 03
---01

您可以使用PEAR::Mail构建消息