如何在PHP中提供多部分/相关内容?

时间:2009-11-25 17:35:01

标签: php mime

说,我有一个 application / xhtml + xml 内容和一个 gif 图片。如何提供(而非呈现)这两个 http获取请求(使用PHP)?它应该是 multipart / related 内容。看完this RFC之后,我尝试了一些东西;但它不起作用。 (不,我不是要发送带附件的电子邮件)

提前致谢。

编辑:最后我成功了。我想,如果我写下我是怎么做的,那将会很有用。我已添加此作为答案。请看下面。

3 个答案:

答案 0 :(得分:5)

我担心你不能达到你想要的目的。

如果你想这样做来提供网页,据我所知,浏览器不会使用这种MIME响应来呈现页面。

如果您想了解此消息的工作原理示例,请向您自己发送包含附件的电子邮件,并在您的电子邮件客户端(而非网络邮件)上转到电子邮件正文中的“查看来源”选项。

您将使用MIME Multipart编码在同一邮件中看到您的邮件,附件和可能的其他部分。

OTOH,如果您希望它发送电子邮件,可以使用PHPMailer等库,为您完成所有编码。
如果这是你想要的,请在他们的网站上查看this example

编辑:

您可以使用PHPMailer构建消息,然后只使用结果,而不是实际发送电子邮件。

尝试这样的事情:

**这是未经测试的代码,仅用于起点**

<?php
  require_once('../class.phpmailer.php');
  $mail = new PHPMailer(true); // the true param means it will throw exceptions on     errors, which we need to catch

  try {
    $mail->MsgHTML(file_get_contents('contents.html'));
    $mail->AddAttachment('images/phpmailer.gif');      // attachment
    $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
    $mime_message = $mail->CreateBody();
    echo $mime_message;
  } catch (phpmailerException $e) {
    echo $e->errorMessage(); //Pretty error messages from PHPMailer
  } catch (Exception $e) {
    echo $e->getMessage(); //Boring error messages from anything else!
  }
?>

答案 1 :(得分:3)

这是[为我工作](不,我没有使用PHPMailer;可能它很有用,但我无法使它工作):

// Two contents : application/xhtml+xml and image/gif
// Here we go
<?php
    $boundary = "ghorar#deem";
    $im_len = filesize("path/to/abc.gif")
    header("Content-Type:multipart/related; boundary=\"$boundary\"; type=\"application/xhtml+xml\"");
    $xml_cnt = <<<EOD
<media xmlns="http://www.sth.com/sth.xsd">
    <objectURI>cid:112509abc@syz.com</objectURI>
    <size>$im_len</size>
    <type>image/gif</type>
    <name>abcxyz</name>     
    <description>blah blah</description>
</media>
EOD;
    $xml_len = strlen($xml_cnt);        
    $im = imagecreatefromgif("path/to/abc.gif");
    $to_send = "This is a multi-part message example in MIME format

--$boundary
Content-Type: application/xhtml+xml;
Content-ID: <e4509xml@asd.com>
Content-Length: $xml_len

$xml_cnt
--$boundary
Content-Type: image/gif;
Content-ID: <112509abc@syz.com>
Content-Length: $im_Len
Content-Transfer-Encoding: binary

";
    echo $to_send;
    imagegif($im);
    echo "\r\n--$boundary--";
    imagedestroy($im);
?>

您也可以从文件加载xml。但是,请注意,如果您的xml引用图像(就像我在这里所做的那样),您需要使用其Content-ID来引用它。另外,请注意'&lt;' '&GT;'图像的Content-ID字段中的字符(在边界之后)和引用它的地方的“cid:”表示法。它对我有用。感谢Carlos Lima花时间陪我。

答案 2 :(得分:0)

我一直在努力实现同样的目标。

似乎MSIE是目前唯一支持多部分/相关的浏览器(Opera可能有一些支持 - 但我没有玩过它)但是在加载这些文件时,似乎完全忽略了关于mime类型和其他东西(如缓存信息,处置等)。实际上,如果URL具有.mht文件扩展名(即,它违反了大多数关于HTTP的规则),MSIE将仅打开文件。

此外,MSIE将很乐意加载包含嵌入式多部分/相关文件的任何内容(前提是它被编码为纯文本),而不会呈现附件所包含的数据。看起来处理这些文件的功能是允许查看文件的快速入侵

如果您重新配置您的网络服务器以使用php解析.mht网址(或使用mod_rewrite重新映射网址),那么您可能会发现它可能会起作用(尽管我不希望它能够使用它附加的查询字符串)。但是,如果您正在生成动态内容,则会出现问题(当您预期时,它不会从缓存/刷新过期)。

简而言之 - 它不会起作用。