我经常听到这样一个标题:'我有一个从网站发来的合同。我如何给通过表单发送的电子邮件增加一个附件呢?' 首先我要说的是要做到这个没有什么简略的措施。你要很好的懂得PHP或其它的服务器真个脚本语言。当然你还要一个真正支撑PHP的网站的账号。假如满足了这个条件,在你读完了本章后就可以用PHP发送带附件的电子邮件了。
1. 附件是如何工作的
假如你曾经在PHP的手册中搜索过'附件'函数,那么成果可能是什么都没有(至少在我写本文的时间还没有)。后来你就要花很多时间来懂得这方面的知识。你也许会想当你给某个人发送一封带附件的电子邮件时,附件是和邮件一起放到收件人的信箱里的(比如,假如你给他/她发了一个PNG的图片文件,他/她的信箱里会包含一个txt文件(电子邮件)和一个.png文件(附件))。但这不是它的工作原理。当你参加一个附件时,你的邮件程序把附件转换成纯文本文件,并在你写的内容(实际的电子邮件)后面插进这个文本块。这个,当你把所有的东西发出来后,收件人的信箱里只有一个纯文本文件--一个同时包含附件和实际电子邮件内容的文件。
下面是一个带附件(一个HTML文件)电子邮件的例子。我已经标注了其中重要的几行:
Return-Path: <[email protected]>
Date: Thurs, 10 June 2004 8:17:29 0000
From: Someone <[email protected]>
To: Person <[email protected]>
Message-id: <[email protected]>
Content-type: multipart/mixed; boundary='web'
Subject: Here's the subject
--web
Content-type: text/plain; charset=g2312
Content-transfer-encoding: 8bit
This is the body of the email.
--web
Content-type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit
<html>
<head>
<title>The attachment</title>
</head>
<body>
<h2>This is the attached HTML file</h2>
</body>
</html>
--396d983d6b89a--
前面的7行是邮件的头,其中值得留心的是Content-type头部分。这个头告诉邮件程序电子邮件是由一个以上的部分组成的。不含附件的邮件只有一个部分:消息本身。带附件的电子通常至少由两部分组成:消息和附件。这样,带两个附件的邮件由三部分组成:消息,第一个附件和第二个附件。
带附件的电子邮件的不同部分之间用分界限来分隔。分界限在Content-type头中定义。邮件的每个新部分以两个连字号(--)和分界限开端。最后一个分界限后也有两个连字号,表现这个邮件中没有其它的部分了。
在每个分界限后有一些行,用来告诉邮件程序这个部分的内容的类型。比如,看看上面例子中第一个分界限后面的两行--以Content-type: text/plain开头的行。这些行阐明后面的部分是ISO-8859-1字符集的纯文本。跟在第二个分界限后的行告诉邮件程序现在的部分是一个HTML文件,它的名字是'attachment.html'。
Content-disposition这持告诉邮件程序假如可能就以内嵌的方法显示附件。现在新的邮件程序会在消息后显示HTML的内容。假如Content-disposition被设为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个连接到文件的图标(或其它的类似的东西)。收件人要看附件的内容,必需点击这个图标。一般情况下,假如附件是一些文本(包含HTML),Content-disposition会被设为inline,这是由于现在大部分邮件程序能够不借助其它浏览器而直接显示附件(文本)的内容。假如附件不是文本(比如图片或其它类似的内容),Content-disposition就设为attachment。
2. 用PHP天生带附件的电子邮件
这里一个例子,告诉你假如把一个定义好的HTML文件加为邮件的附件:
<?php
# 我们首先写实际的消息内容
$emailBody = 'This is text that goes into the body of the email.';
# 然后我们要作为附件的HTML文件
$attachment = '<html>
<head>
<title>The attached file</title>
</head>
<body>
<h2>This is the attached HTML file</h2>
</body>
</html>';
# 建立在邮件中分隔不同部分的分界限。
# 基础上,分界限可以是任意的字符串。
# 但是重要的一点是断定一个写邮件的人
# 这会随便写出的字符串,所以我们用
# uniqid函数来产生一个随机的字符串。
$boundary = uniqid( '');
# 现在我们要建立邮件头。不要忘了插进
# Content-type头来阐明这个邮件包含一个或更多的附件。
$headers = 'From: [email protected]
Content-type: multipart/mixed; boundary=\'$boundary\'';
# 好,现在我们已经有了邮件的所有内容。
# 下一件事是修正邮件的主体。
$emailBody = '--$boundary
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
$emailBody
--$boundary
Content-type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit
$attachment
--$boundary--';
# 现在可以把邮件发出往了
mail( '[email protected]'
感谢 靓哥 的投稿 本文仅代表作者观点,与楚天站长站立场无关。