|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
刚开始觉得自己对这些多少有些基础,很简单,但是看了老师那么熟练的进行网页布局的时候,突然之间发现,其实,我的基础并没有自己想像的那么好,自己设计的页面其实并不好看,就连表格的边框为1像素都不会弄。 我常常听到如许一个成绩:“我有一个从网站发来的合同。我若何给
经由过程表单发送的电子邮件增添一个附件呢?”
起首我要说的是要做到这个没有甚么复杂的举措。你要很好的了解PHP或其它的办事器真个剧本言语。固然你还要一个真正撑持PHP的网站的账号。假如知足了这个条件,在你读完了本章后就能够用PHP发送带附件的电子邮件了。
1. 附件是若何任务的
假如你已经在PHP的手册中搜刮过“附件”函数,那末了局多是甚么都没有(最少在我写本文的工夫还没有)。后来你就要花良多工夫来懂得这方面的常识。
你或许会想当你给某团体发送一封带附件的电子邮件时,附件是和邮件一同放到收件人的信箱里的(好比,假如你给他/她发了一个PNG的图片文件,他/她的信箱里会包括一个txt文件(电子邮件)和一个.png文件(附件)。但这不是它的任务道理。当你到场一个附件时,你的邮件法式把附件转换成纯文本文件,并在你写的内容(实践的电子邮件)前面拔出这个文本块。这个,当你把一切的器材收回来后,收件人的信箱里只要一个纯文本文件――一个同时包括附件和实践电子邮件内容的文件。
上面是一个带附件(一个HTML文件)电子邮件的例子。
Return-Path:
Date: Mon, 22 May 2000 19:17:29 +0000
From: Someone
To: Person
Message-id: <83729KI93LI9214@example.com>
Content-type: multipart/mixed; boundary="396d983d6b89a"
Subject: Here's the subject
--396d983d6b89a
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
This is the body of the email.
--396d983d6b89a
Content-type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit
This is the attached HTML file
--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文件加为邮件的附件:
# 咱们起首写实践的动静内容
$emailBody = "This is text that goes into the body of the email.";
# 然后咱们要作为附件的HTML文件
$attachment = "
This is the attached HTML file
";
# 创立在邮件平分隔分歧局部的分界限。
# 根基上,分界限可所以恣意的字符串。
# 然而主要的一点是肯定一个写邮件的人
# 这会随便写出的字符串,所以咱们用
# uniqid函数来发生一个随机的字符串。
$boundary = uniqid( "");
# 如今咱们要创立邮件头。不要忘了拔出
# Content-type头来讲明这个邮件包括一个或更多的附件。
$headers = "From: someone@example.com
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( "person@eksempel.dk", "The subject", $emailBody, $headers);
?>
3. 把用户上传的文件作为附件
你或许会感觉下面的例子难以了解,但上面...。鄙人面的例子中工作更难了,由于咱们要用一个表单让用户上传他们的文件,并把这个文件作为咱们要发的邮件的附件。费事的是咱们不克不及事后晓得文件的MIME类型。
在后面的例子中,咱们已晓得该它是一个HTML文件,所以给这个附件设置Content-type头是很复杂的。鄙人面的例子中,MIME类型多是恣意的,由于用户能够会上传一个HTML文件,一个PNG文件,一个vCard文件,或其它的器材。让咱们来看看例子:
# 如今咱们来生成表单。在发生可以上传文件的表单时,
# 不要忘了把
# 假如用户已按了"Send"按钮"
if ($send) {
# 界说分界限
$boundary = uniqid( "");
# 生成邮件头
$headers = "From: $from
Content-type: multipart/mixed; boundary="$boundary"";
# 肯定上传文件的MIME类型
if ($attachment_type) $mimeType = $attachment_type;
# 假如阅读器没有指定文件的MIME类型,
# 咱们可以把它设为"application/unknown".
else $mimeType = "application/unknown";
# 肯定文件的名字
$fileName = $attachment_name;
# 翻开文件
$fp = fopen($attachment, "r");
# 把全部文件读入一个变量
$read = fread($fp, filesize($attachment));
# 好,如今变量$read中保留的是包括全部文件内容的文本块。
# 如今咱们要把这个文本块转换成邮件法式可以读懂的格局
# 咱们用base64办法把它编码
$read = base64_encode($read);
# 如今咱们有一个用base64办法编码的长字符串。
# 下一件事是要把这个长字符串切成由每行76个字符构成的小块
$read = chunk_split($read);
# 如今咱们可以创立邮件的主体
$body = "--$boundary
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
$body
--$boundary
Content-type: $mimeType; name=$fileName
Content-disposition: attachment; filename=$fileName
Content-transfer-encoding: base64
$read
--$boundary--";
# 发送邮件
mail($to, $subject, $body, $headers);
}
?>
这就是全体内容。假如你不克不及很好地舆解下面的例子,我的建议是给你本人发送几个带附件的邮件,然后细心研讨邮件的源代码。 把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。 |
|