Thunderbird не показывает почту должным образом (php mail())

У меня небольшая проблема с Thunderbird. Я пытаюсь отправить письмо с php с html-версией, текстовой версией и вложением. Почта правильно отображается в 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: [email protected]\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);  

}


person BebliucGeorge    schedule 30.11.2011    source источник
comment
Я получаю только отображаемое изображение, но не текст. Я опубликую php-код.   -  person BebliucGeorge    schedule 30.11.2011
comment
Вам действительно следует использовать PHPMailer или Swiftmailer для создания MIME-сообщений. Их гораздо проще использовать, и они могут сократить весь сценарий примерно до 10 строк кода (не считая содержимого самого электронного письма).   -  person Marc B    schedule 30.11.2011


Ответы (1)


Вы должны использовать составные части MIME, чтобы правильно составить свое сообщение. Один составной для ваших текстовых/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 для создания своих сообщений.

person Alfonso Marin    schedule 30.11.2011
comment
Хороший ответ :) есть и другие библиотеки, такие как PHPMailer и Swift Mailer, чтобы назвать пару - person Sam; 17.07.2012