蒙在股里 发表于 2015-2-4 00:20:01

PHP编程:php 发送带附件的邮件

刚开始觉得自己对这些多少有些基础,很简单,但是看了老师那么熟练的进行网页布局的时候,突然之间发现,其实,我的基础并没有自己想像的那么好,自己设计的页面其实并不好看,就连表格的边框为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);
}
?>

  这就是全体内容。假如你不克不及很好地舆解下面的例子,我的建议是给你本人发送几个带附件的邮件,然后细心研讨邮件的源代码。把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。

山那边是海 发表于 2015-2-4 11:52:22

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。

柔情似水 发表于 2015-2-9 17:25:02

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

分手快乐 发表于 2015-2-27 12:41:32

实践是检验自己会不会的真理。

小女巫 发表于 2015-2-27 22:16:31

至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。

仓酷云 发表于 2015-3-2 23:37:36

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

金色的骷髅 发表于 2015-3-6 00:24:17

找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。

莫相离 发表于 2015-3-8 14:58:22

Ps:以上纯属原创,如有雷同,纯属巧合

透明 发表于 2015-3-11 03:22:53

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

再现理想 发表于 2015-3-13 03:31:18

有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。

深爱那片海 发表于 2015-3-16 04:02:07

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

灵魂腐蚀 发表于 2015-3-16 23:12:03

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

小妖女 发表于 2015-3-23 06:24:34

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

老尸 发表于 2015-4-9 03:56:26

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

精灵巫婆 发表于 2015-4-12 01:26:34

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

变相怪杰 发表于 2015-4-20 21:26:09

最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。

海妖 发表于 2015-4-27 08:20:47

作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。

小魔女 发表于 2015-5-3 22:02:55

我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。

只想知道 发表于 2015-5-4 05:31:51

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

第二个灵魂 发表于 2015-6-10 17:32:01

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
页: [1] 2
查看完整版本: PHP编程:php 发送带附件的邮件