MIME文件在邮件中传送多种文件格式的文件

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-Version: 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文件把口令和其它一些关键数据保存在里面,如果不加处理直接发送,我想后果不用我多嘴你也能够想得出来了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值