MIME文件在邮件中传送多种文件格式的文件
2005-07-15 10:22
288 查看
MIME文件在邮件中传送多种文件格式的文件 因为在现实中存在了许多文件格式,本文主要说明如何使用电子邮件传送多种文件,传送的方法就是使用MIME的方法。这里我们先说明一下URI,它是存在于HTML或其它文件中的一个参照标记,它在文件中指出这个地方是引用另外一个对象(比如文件,图象)。在传送这类电子邮件时,也应该把这些东西一起传送出去。另外一种方法是,只传送这些URI,当用户打开时,要求用户使用HTTP查看相应的对象,本文不讨论这种方法。 这种包括许多种对象的文件我们称为集成文件。在集成文件中的一些对象可以连接到第一个对象,在传送这些文件时,转发机制不会觉得这和平常的邮件有什么区别,它甚至可以为非IP连接的用户传送WWW文档。而接收程序则有所不同,有些接收程序可以直接显示,有些则需要把这种文件送给浏览器显示。 前面不是说过了吗,在这些集成文件中有一些URI参考,因此需要定义两个内容头:Content-Location和Content-Base。我们目前只讨论URL这一种类型,其它类型在日后也可以加以支持,这些头的格式如下: content-location ::= "Content-Location:" ( absoluteURI | relativeURI ) content-base ::= "Content-Base:" absoluteURI 这里,我们把URI看成是一个严格定义的URL就可以了。Content-Base给定一个基,这个基必须是一个绝对URI。下面是几个例子: Content-Type: Multipart/related; boundary="boundary-example-1"; type=Text/HTML; start=foo2*foo3@bar2.net //Content-Base头不能放在这里,因为这是一个多部分(multipart)MIME对象; --boundary-example-1 Part 1: Content-Type: Text/HTML; charset=US-ASCII Content-ID: <foo2*foo3@bar2.net> Content-Location: http://www.aaa.net/images/foo1.bar1 //这个Content-Location必须是一个绝对URI,因为没有指定基,所以不能使用相对地址; --boundary-example-1 Part 2: Content-Type: Text/HTML; charset=US-ASCII Content-ID: <foo4*foo5@bar2.net> Content-Location: foo1.bar1 //这里使用了相对地址,因为下一句指定了基点的位置,foo1.bar1就在这个基下的东西; Content-Base: http://www.aaa.net/images/ --boundary-example-1-- Content-Location是一个位置量,它可以是一个相对量,也可以是一个绝对量,当它是相对量的时候一定有基存在,不然它相对谁呀。这里使用任何的URI机制都可以,标准不标准都行,但是如果采用不标准的有时候会有麻烦,一定要小心。有时候Content-Location可以指示数据发送方在这个URI下是可以取得的,这时候一定要确定这个地址是标准的,可用的,不然会出错。相对URI是通过MIME内的基URI来解析的,有下面几种方法可以解析基URI,一种是通过HTML提供的命令来支持,而另一种是使用Content-Base头来进行,也可以使用MIME对象体内的Content-Location当作基来使用。 有时候,发送的邮件内可能不包括连接的对象(如图象,声音等),这时邮件可以用Text/HTML形式发送。这样的文件中包括的连接对于用户来说就只能通过上网取得,而有些是根本无法取得的,如一个公司的内部网络,这样的网络对外人是不可进入的,即使用户可以上网访问,也要注意,用户可以根本不可能上互联网,这样就不得不考虑使用这种方法的可行性了。虽然如此,仍然有许多用户采用这种方法。 如果邮件内的内容包括了需要参照的对象(这时文件内可能包括许多种对象,HTML文档,图象,声音等),这时就只能采用multipart/related形式发送了。这时文件的根部分应该是参照其它对象的部分,如一个HTML文档,它就可以使用超级链接参照文件的其它部分。通常,我们把这样的根部分放在文件的最前面,也就是根部分是第一个部分,如果不是,则应该使用Content-ID进行指示。如果在HTML文件中包括一些URI(也就是URL)指向的是一些不可知的程序,最好要发送前对它进行得写。 一个对象体部分,如text/HTML,可以包括一些超级链接,这些链接指向的可能是本消息内的部分,当然也可能是网络上的某种资源。无论是什么东西,反正是要在用户在线阅读时显示出的东西。为了显示这些对象,需要知道这些对象的位置,我们知道MIME文件是由许多对象部分组成的,如果链接的对象就在此消息内,这些被链接的对象应该是一个独立的对象部分,每个这样的部分都应该有Content-Location头或Content-ID头。接收方的邮件程序也应该支持这种文件内的链接方式。 当文件中有Content-Base头时,应该先对它进行解析,然后再对HTML中的URL进行解析。在文件中如果使用了Content-ID头,那么Content-Location就不怎么起作用了,因此下面两句是同一个意思: Content-ID: foo@bar.net Content-Location: CID: foo@bar.net 下面我们来看一些例子,第一个例子中只包括HTML对象而没有包括其它对象,如声音,图象等,这个文件中也有超级链接,但是如果想取和 级链接的东西就必须上网取得,在这个文件内是没有需要的东西的。 From: foo1@bar.net To: foo2@bar.net Subject: A simple example Mime-Version: 1.0 Content-Type: Text/HTML; charset=US-ASCII <HTML> <head></head> <body> <h1>Hi there!</h1> An example of an HTML message.<p> Try clicking <a href="http://www.resnova.com/">here.</a><p> </body></HTML> 这个例子是文件中包括了一个GIF图象,这个图象使用的绝对地址; From: foo1@bar.net To: foo2@bar.net Subject: A simple example Mime-Version: 1.0 Content-Type: Multipart/related; boundary="boundary-example-1"; type=Text/HTML; start=foo3*foo1@bar.net --boundary-example-1 Content-Type: Text/HTML;charset=US-ASCII Content-ID: <foo3*foo1@bar.net> ... 这里可能是一个HTML文件,其中包括了下面的超级链接: <IMG SRC="http://www.ietf.cnri.reston.va.us/images/ietflogo.gif" ALT="IETF logo"> --boundary-example-1 Content-Location: http://www.ietf.cnri.reston.va.us/images/ietflogo.gif Content-Type: IMAGE/GIF Content-Transfer-Encoding: BASE64 R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5 NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A //上面是图象的内容; --boundary-example-1-- 下面这个例子和上面的一样,只不过使用了相对地址: From: foo1@bar.net To: foo2@bar.net Subject: A simple example Mime-Ve abca rsion: 1.0 Content-Base: http://www.ietf.cnri.reston.va.us Content-Type: Multipart/related; boundary="boundary-example-1"; type=Text/HTML --boundary-example-1 Content-Type: Text/HTML; charset=ISO-8859-1 Content-Transfer-Encoding: QUOTED-PRINTABLE ... 这里可能是一个HTML文件,其中包括了下面的超级链接: <IMG SRC="/images/ietflogo.gif" ALT="IETF logo"> --boundary-example-1 Content-Location: /images/ietflogo.gif Content-Type: IMAGE/GIF Content-Transfer-Encoding: BASE64 R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5 NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A //上面是图象的内容; --boundary-example-1-- 下面的例子中使用了Content-ID头: From: foo1@bar.net To: foo2@bar.net Subject: A simple example Mime-Version: 1.0 Content-Type: Multipart/related; boundary="boundary-example-1"; type=Text/HTML --boundary-example-1 Content-Type: Text/HTML; charset=US-ASCII ... 这里可能是一个HTML文件,其中包括了下面的超级链接: <IMG SRC="cid:foo4*foo1@bar.net" ALT="IETF logo"> --boundary-example-1 Content-ID: <foo4*foo1@bar.net> Content-Type: IMAGE/GIF Content-Transfer-Encoding: BASE64 R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5 NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A //上面是图象的内容; --boundary-example-1-- 在网络上一定要考虑安全问题,这里要考虑的安全问题主要是发送来的URI是不是真正代表一个通过HTTP协议访问到的对象,在这方面没有保证。我们在使用HTTP协议或FTP协议时,通常会缓存一些数据,这些数据保证下次再次访问这个对象时不用从网络上取得,而直接可以从本机上获得,但是对于MIME文件来说,却不能够这样做,因为你无法保证这里看到的东西和通过HTTP或FTP得到的对象是一致的。在发送HTML文件时,还有一些安全问题要考虑了,因为在这些文件中可能有一些运行于服务器的代码,这些代码如果传播出去可能造成的后果是无法想象的。而有一些HTML文件把口令和其它一些关键数据保存在里面,如果不加处理直接发送,我想后果不用我多嘴你也能够想得出来了。 |
相关文章推荐
- 对MIME格式的邮件文件进行解码获取其可读内容和附件等
- 源码:使用LotusScript发送mime格式邮件
- PHP 解析Maildir 邮件格式(eml文件)
- socket网络间通信传送任意大小和格式的文件
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件
- PHP实现多种格式文件下载并解决乱码问题
- opencv支持多种流行视频格式文件的读取
- FormData 上传多种格式的文件
- perl MIME::Lite 发送邮件 格式问题 如换行 字体等
- 获取指定目录下多种格式的文件
- android文件解压支持多种格式
- C#合并多种格式文件为PDF的方法
- MIME类型-多媒体文件格式
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件
- IPA文件格式 MIME
- MIME 对应类型文件参照表(下载或者发送邮件时候可能用得到)
- python 读写文件包含多种编码格式
- CxImage与OpenGL结合,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件。 关于CxImage的文章,网上有许多,这里只介绍如何把CxImage与OpenGL结合起来,用于读
- opencv支持多种流行视频格式文件的读取
- C# 如何将PDF转为多种图像文件格式(Png/Bmp/Emf/Tiff)