仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1774|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页设计用PHP发送有附件的电子邮件

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
完成一个功能齐全的动态站点   我常常听到如许一个成绩:"我有一个从网站发来的合同。我若何给经由过程表单发送的电子邮件增添一个附件呢?"
起首我要说的是要做到这个没有甚么复杂的举措。你要很好的了解php或
其它的办事器真个剧本言语。固然你还要一个真正撑持php的网站的账号。假如知足了这个条件,在你读完了本章后就能够用php发送带附件的电子邮件了。

1. 附件是若何任务的
假如你已经在php的手册中搜刮过"附件"函数,那末了局多是甚么都没有(最少在我写本文的工夫还没有)。后来你就要花良多工夫来懂得这方面的常识。
你或许会想当你给某团体发送一封带附件的电子邮件时,附件是和邮件一同放到收件人的信箱里的(好比,假如你给他/她发了一个png的图片文件,他/她的信箱里会包括一个txt文件(电子邮件)和一个.png文件(附件))。但这不是它的任务道理。当你到场一个附件时,你的邮件法式把附件转换成纯文本文件,并在你写的内容(实践的电子邮件)前面拔出这个文本块。这个,当你把一切的器材收回来后,收件人的信箱里只要一个纯文本文件--一个同时包括附件和实践电子邮件内容的文件。
上面是一个带附件(一个html文件)电子邮件的例子。我已标注了个中主要的几行:
return-path: <someone@example.com>
date: mon, 22 may 2000 19:17:29 +0000
from: someone <someone@example.com>
to: person <person@eksempel.dk>
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

<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: 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文件,或其它的器材。让咱们来看看例子:
<?php
# 如今咱们来生成表单。在发生可以上传文件的表单时,
# 不要忘了把<form>标签的"enctype"属性设为"multipart/form-data".
echo "<form action='$php_self' enctype='multipart/form-data' method='post'>\n";
echo "<input type='text' name='from'><br>\n";
echo "<input type='text' name='to'><br>\n";
echo "<input type='text' name='subject'><br>\n";
echo "<input type='file' name='attachment'><br>\n";
echo "<textarea name='body'></textarea><br>\n";
echo "<input type='submit' name='send' value='send'>\n";
echo "</form>\n";

# 假如用户已按了"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);
}
?>


这就是全体内容。假如你不克不及很好地舆解下面的例子,我的建议是给你本人发送几个带附件的邮件,然后细心研讨邮件的源代码。

你的确对PHP有兴趣,那么选择教材也是很重要的。
不帅 该用户已被删除
沙发
发表于 2015-2-4 09:36:14 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
板凳
发表于 2015-2-9 21:35:57 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
简单生活 该用户已被删除
地板
发表于 2015-2-19 01:20:30 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
山那边是海 该用户已被删除
5#
发表于 2015-2-20 10:50:07 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
飘灵儿 该用户已被删除
6#
发表于 2015-3-6 16:52:48 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
老尸 该用户已被删除
7#
发表于 2015-3-11 04:57:38 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
若天明 该用户已被删除
8#
发表于 2015-3-13 11:54:47 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-17 17:08:26 | 只看该作者
做为1门年轻的语言,php一直很努力。
金色的骷髅 该用户已被删除
10#
发表于 2015-3-17 20:58:23 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
因胸联盟 该用户已被删除
11#
发表于 2015-3-25 02:15:08 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
谁可相欹 该用户已被删除
12#
发表于 2015-4-4 17:48:00 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
小女巫 该用户已被删除
13#
发表于 2015-4-6 23:08:48 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
若天明 该用户已被删除
14#
发表于 2015-4-12 15:55:05 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
蒙在股里 该用户已被删除
15#
发表于 2015-4-16 07:11:14 | 只看该作者
实践是检验自己会不会的真理。
小妖女 该用户已被删除
16#
发表于 2015-4-17 22:46:35 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
小魔女 该用户已被删除
17#
发表于 2015-5-4 08:05:08 | 只看该作者
实践是检验自己会不会的真理。
愤怒的大鸟 该用户已被删除
18#
 楼主| 发表于 2015-5-4 13:36:13 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
灵魂腐蚀 该用户已被删除
19#
发表于 2015-5-6 07:11:52 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
透明 该用户已被删除
20#
发表于 2015-5-10 06:43:00 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表