说,我有一个 application / xhtml + xml 内容和一个 gif 图片。如何提供(而非呈现)这两个单 http获取请求(使用PHP)?它应该是 multipart / related 内容。看完this RFC之后,我尝试了一些东西;但它不起作用。 (不,我不是要发送带附件的电子邮件)
提前致谢。
编辑:最后我成功了。我想,如果我写下我是怎么做的,那将会很有用。我已添加此作为答案。请看下面。
答案 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重新映射网址),那么您可能会发现它可能会起作用(尽管我不希望它能够使用它附加的查询字符串)。但是,如果您正在生成动态内容,则会出现问题(当您预期时,它不会从缓存/刷新过期)。
简而言之 - 它不会起作用。