频道直达 - 学院 - 下载 - 交易 - 特效 - 字库 - 手册 -排名-工具- 繁體
网页教学网站开发 设为首页
加入收藏
联系我们
建站搜索: 常用广告代码   用户注册 | 用户登陆
您当前的位置:中国建站之家 -> 网站开发设计技术教程 -> PHP教程 -> 用PHP发送有附件的电子邮件

用PHP发送有附件的电子邮件

作者:未知  来源:转载  发布时间:2005-7-30 20:48:52  发布人:acx

减小字体 增大字体

我经常听到这样一个问题:"我有一个从网站发来的合同。我如何给通过表单发送的电子邮件增加一个附件呢?"

首先我要说的是要做到这个没有什么简单的办法。你要很好的理解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);
}
?>


这就是全部内容。如果你不能很好地理解上面的例子,我的建议是给你自己发送几个带附件的邮件,然后仔细研究邮件的源代码。


将本文收藏到QQ书签与更多好友分享
[打 印]
[] [返回上一页] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
精彩推荐
热门文章
· 注册码大全二
· 注册码大全四
· 注册码大全一
· 要10G免费网络硬盘的请进..
· 通过google 赶快来赚美金..
· 注册码大全十
· 头像-qq头像(qq新头像)4..
· 让你轻松架设FTP服务器1..
· 注册码大全三
· 梦幻背景图片7
· 卡通动物图片6
· 网页制作素材-按钮素材2..
· 让你轻松架设FTP服务器5..
· 风景图片8
· 注册码大全九
· 让你轻松架设FTP服务器2..
关注此文读者还看过
· Java 5.0 多线程编程实践..
· 用js制作完善的日,月组..
· 博客播客之后的新概念 音..
· 安全技巧:运用LINQ轻松..
· 在Servlet中使用请求头(..
· WAP中的ASP技术(二)
· Flash制作书法动画3
· Fireworks MX 制作隐藏影..
· 帮你搞定getURL指令
· 美国互联网用户增长趋缓..
· 用PHP开发GUI
· flash中的stop之bug篇
· 给大家一个新的加密方法..
· Flash游戏制作:贪食蛇(..
· Flash MX 2004 UI组件系..
· 细化分析 REP_AGENT长时..
相关文章
· 使用PHP的日期与时间函数提..
· 微软CEO称Google经常阅读用..
· 用PHP程序直接调用文本文件..
· 用PHP添加地图功能
· 用PHP命令行控制脚本
· 用PHP实现windows风格的树型..
· 新手学习用PHP程序对网页表..
· 用PHP5的DirectoryIterator..
· 用PHP程序实现删除目录的三..
· 用PHP程序实现从数组里筛选..
· 实用:使用PHP脚本修改Linu..
· 用PHP脚本生成word文档的程..
· 技巧:用PHP编写留言本应注意..
· 如何利用PHP+MYSQL保存和输..
· PHP实例:用PHP编写的网上调..
· 使用PHP开发网站过程中你注..
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 人才招聘
网站合作、内容监督、商务咨询:QQ: 9576619
Copyright ? 2005--2008 中国建站之家版权所有
粤ICP备05092265号