分享
 
 
 

【原创】用php发送带附件的email

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作者:颜少林 2005-3-11 yslion@163.com

参考了一下网上的文章。俗话说,天下文章一大抄,看你会抄不会抄。关键是能为我所用,这是最重要的。废话不多讲,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》

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有