仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1816|回复: 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-23 09:33:55 | 显示全部楼层
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-22 08:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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