仓酷云

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

[学习教程] PHP网页编程之用php发送带附件的Email

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
聪明的你,显然已经逐渐的开悟了,慢慢的理解了编程的概念,那么祝贺你,你已经迈出了成功的第一步。   参考了一下网上的文章。俗语说,世界文章一大抄,看你会抄不会抄。关头是能为我所用,这是最主要的。空话不多讲,let‘s go。
其实发mail很复杂,php有现成的函数,可以参考php 的 manual,出格是第四个例子,讲的很具体。
关头是怎样把上传附件跟邮件发送联合起来。关于文件的上传,可以参考http://blog.csdn.net/slamdunk3/archive/2005/02/23/299025.aspx 这篇文章。
讲一下 文件上传的办法及其属性:
咱们假定文件上传字段的称号如上例所示,为 userfile。称号可随便定名。
表单里可以如许写:
<input type=file name=userfile>
提交以后,php使用$_FILES 数组 主动获得相干参数:
$_FILES['userfile']['name']
客户端机械文件的原称号。
$_FILES['userfile']['type']
文件的 MIME 类型,需求阅读器供应该信息的撑持,例如“image/gif”。
$_FILES['userfile']['size']
已上传文件的巨细,单元为字节。
$_FILES['userfile']['tmp_name']
文件被上传后在办事端贮存的一时文件名。
$_FILES['userfile']['error']
和该文件上传相干的毛病代码。['error'] 是在 PHP 4.2.0 版本中增添的。

注: 在 PHP 4.1.0 版本之前该数组的称号为 $HTTP_POST_FILES,它其实不像 $_FILES 一样是主动全局变量。PHP 3 不撑持 $HTTP_POST_FILES 数组。
当 php.ini 中的 register_globals 被设置为 on 时,您可使用更多的变量。例如,$userfile_name 等价于 $_FILES['userfile']['name'],$userfile_type 等价于 $_FILES['userfile']['type'] 等。请记住从 PHP 4.2.0 入手下手,register_globals 的默许值为 off,因而咱们建议您不要依附于改设置项而利用方才提到的那些附加变量。
文件被上传后,默许地会被贮存到办事真个默许一时目次中,除非您将 php.ini 中的 upload_tmp_dir 设置为了其它的途径。办事真个默许一时目次可以经由过程更改 PHP 运转情况的情况变量 TMPDIR 来从头设置,然而在 PHP 剧本外部经由过程运转 putenv() 函数来设置是不起感化的。该情况变量也能够用来确认其它的操作也是在上传的文件长进行的。
有了这些,咱们再看与邮件相干的器材。上面是一个带附件(一个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。
咱们模仿下面的例子,本人写一个php法式,可以对提交的 收信人,发送人,函件内容,附件停止处置。
起首创立一个静态页面,代码以下:
<html>
<body>
<form method=post name=sndml action=sendmail.php ENCTYPE="multipart/form-data">
<table>
<tr ><td>发送者:</td>
<td><input type=text name=from ></td>
</tr>
<tr ><td>承受者:</td>
<td><input type=text name=to ></td>
</tr>
<tr ><td>下载提醒:</td>
<td><input type=text name=text ></td>
</tr>
<tr ><td>源数据文件:</td>
<td><input type=file name=upload_file size=40></td>
</tr>
<tr><td>&nbsp</td>
<td><input type="submit" value="肯定">
</td>
</tr>
</table>
</form>
</body>
</html>
要注重的是 : 表单里 ENCTYPE="multipart/form-data" 必定要有。
再来看一下 发送邮件的php法式:
<?php
//文本内容
$text = $_POST['text'];
//题目
$subject = $_POST['subject'];
//发送者
$from = $_POST['from'];
//承受者
$to = $_POST['to'];
//附件
$file = $_FILES['upload_file']['tmp_name'];
// 界说分界限
$boundary = uniqid( "");
$headers = "Content-type: multipart/mixed; boundary= $boundary\r\n";
$headers .= "From:$from\r\n";
//肯定上传文件的MIME类型
if($_FILES['upload_file']['type'])
$mimeType = $_FILES['upload_file']['type'];
else
$mimeType ="application/unknown";
//文件名
$fileName = $_FILES['upload_file']['name'];
// 翻开文件
$fp = fopen($file, "r");
// 把全部文件读入一个变量
$read = fread($fp, filesize($file));
//咱们用base64办法把它编码
$read = base64_encode($read);
//把这个长字符串切成由每行76个字符构成的小块
$read = chunk_split($read);
//如今咱们可以创立邮件的主体
$body = "--$boundary
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
$text
--$boundary
Content-type: $mimeType; name=$fileName
Content-disposition: attachment; filename=$fileName
Content-transfer-encoding: base64
$read
--$boundary--";
//发送邮件
if(mail($to, $subject,$body,$headers))
print "OK! the mail $from --- $to has been send<br>";
else
print "fail to send mail <br>";
?>
看不分明不妨,我来讲明一下:
1,邮件头的机关 :普通包含
内容类型(Content-type)要发送附件,设置为 multipart/mixed 意思是多个局部 (邮件自己+附件)。
boundary ,就是下面提到的分界限,他的值用php自带的 uniqid();函数获得
承受方,抄送等,在前面加上 From: Cc:。与下面的 Content-type boundary 之间用 \r\n 朋分 。
2 邮件体
假如是纯文本的邮件内容 它的格局以下:
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
前面再紧接着加上 邮件的文本内容。
假如是附件:
Content-type: $mimeType; name=$fileName
Content-disposition: attachment; filename=$fileName
Content-transfer-encoding: base64
前面再紧接着加上 附件内容。
$mimeType 是附件的 MIME类型。 可以用 $_FILES['upload_file']['type'] 失掉。
$fileName 就是附件的名字了
邮件文本内容和附件之间用 boundary 朋分。
有人会问,附件内容是甚么?附件内容就是用read函数读入所上传的附件,然后再把它经由base64编码以后再用chunk_split 大卸N块,每块巨细是默许的76字符。
好了,如今再去看那段法式,应当没甚么成绩了吧?把响应的变量带入mail函数外面就ok了。
以上法式在 PHP Version 4.3.8 freeBSD 下测试经由过程。
参考文章:《php 发送带附件的邮件 作者: cn-linux》

在相册系统的开发上,因为采用的是团队分工合作方式,更让我明白了在一个团队之中,团队成员之间的交流沟通的重要性,如果没有很好的沟通交流,成员之间的任务没有分配好。
再见西城 该用户已被删除
沙发
发表于 2015-2-4 08:01:21 | 只看该作者
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
爱飞 该用户已被删除
板凳
发表于 2015-2-6 08:15:39 | 只看该作者
爱上php,他也会爱上你。
admin 该用户已被删除
地板
发表于 2015-2-10 07:03:33 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
蒙在股里 该用户已被删除
5#
 楼主| 发表于 2015-2-23 09:33:55 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
飘灵儿 该用户已被删除
6#
发表于 2015-3-6 18:46:32 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-15 07:27:46 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-18 02:10:46 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-25 09:01:12 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
若相依 该用户已被删除
10#
发表于 2015-3-25 10:29:15 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
海妖 该用户已被删除
11#
发表于 2015-4-5 04:21:50 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
金色的骷髅 该用户已被删除
12#
发表于 2015-4-14 12:05:14 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
深爱那片海 该用户已被删除
13#
发表于 2015-4-15 01:24:01 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
透明 该用户已被删除
14#
发表于 2015-4-19 06:55:24 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
只想知道 该用户已被删除
15#
发表于 2015-4-20 10:49:31 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
愤怒的大鸟 该用户已被删除
16#
发表于 2015-4-27 15:12:44 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
因胸联盟 该用户已被删除
17#
发表于 2015-5-1 00:51:34 | 只看该作者
基础有没有对学习php没有太大区别,关键是兴趣。
简单生活 该用户已被删除
18#
发表于 2015-5-1 06:54:47 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
乐观 该用户已被删除
19#
发表于 2015-5-2 02:56:12 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-14 12:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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