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

我经常听到这样一个问题:"我有一个从网站发来的合同。我如何给通过表单发送的电子邮件增加一个附件呢?"
首先我要说的是要做到这个没有什么简单的办法。你要很好的理解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);
}
?>

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

时间: 2016-05-07

用PHP发送有附件的电子邮件的相关文章

php中PHPMailer发送带附件的电子邮件方法

.首先到http://phpmailer.worxware.com/ 下载最新版本的程序包 2.下载完成后,找到class.phpmailer.php .class.smtp.php两个类放到自己的目录下! 3.然后新建一个php文件这里命名为:phpmail_jiucool.php 4.phpmail_jiucool.php内容如下: 实例  代码如下 复制代码 function postmail_jiucool_com($to,$subject = "",$body = "

使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)_php实例

复制代码 代码如下: /*PHPMailer是一个用于发送电子邮件的PHP函数包.它提供的功能包括: *.在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址 *.支持多种邮件编码包括:8bit,base64,binary和quoted-printable *.支持SMTP验证 *.支持冗余SMTP服务器 *.支持带附件的邮件和Html格式的邮件 *.自定义邮件头 *.支持在邮件中嵌入图片 *.调试灵活 *.经测试兼容的SMTP服务器包括:Sendmail,qmail,Postfix,Imai

实现用php发送带附件的邮件

我经常听到这样一个问题:"我有一个从网站发来的合同.我如何给通过表单发送的电子邮件增加一个附件呢?" 首先我要说的是要做到这个没有什么简单的办法.你要很好的理解PHP或其它的服务器端的脚本语言.当然你还要一个真正支持PHP的网站的账号.如果满足了这个前提,在你读完了本章后就可以用PHP发送带附件的电子邮件了.1. 附件是如何工作的 如果你曾经在PHP的手册中搜索过"附件"函数,那么结果可能是什么都没有(至少在我写本文的时间还没有).后来你就要花很多时间来了解这方面的

用php发送带附件的Email

参考了一下网上的文章.俗话说,天下文章一大抄,看你会抄不会抄.关键是能为我所用,这是最重要的.废话不多讲,let's go. 其实发mail很简单,php有现成的函数,可以参考php 的 manual,特别是第四个例子,讲的很详细. 关键是怎么把上传附件跟邮件发送结合起来.关于文件的上传,可以参考http://blog.csdn.net/slamdunk3/archive/2005/02/23/299025.aspx 这篇文章. 讲一下 文件上传的方法及其属性: 我们假设文件上传字段的名称如上例

用JavaMail发送带附件的Email

随着网络应用的不断推广,电子邮件越来越多的被大家使用.虽然我们往往将电子邮件与 Foxmail.Outlook 这样的电子邮件客户端联系起来,但是往往我们也需要自己编程实现发送接收邮件,例如在一个网站注册用户后网站发出的回执mail,或者在网络购物的时候,在完成订单后的几分钟之内发送确认电子邮件.对于这样的需求,我们不能通过已有的邮件客户端而需要自己编写邮件发送或者处理程序.在这里向大家讲解一下如何利用JavaMail来实现邮件的收发. 注意:本文只打算讨论JavaMail收发带附件邮件的一些技

用php发送带附件的Email_php基础

参考了一下网上的文章.俗话说,天下文章一大抄,看你会抄不会抄.关键是能为我所用,这是最重要的.废话不多讲,let's go. 其实发mail很简单,php有现成的函数,可以参考php 的 manual,特别是第四个例子,讲的很详细. 关键是怎么把上传附件跟邮件发送结合起来.关于文件的上传,可以参考http://blog.csdn.net/slamdunk3/archive/2005/02/23/299025.aspx 这篇文章. 讲一下 文件上传的方法及其属性: 我们假设文件上传字段的名称如上例

java中javamail发送带附件的邮件实现方法_java

本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输,JavaMail是可选包,因此如果需要使用的话你需要首先从java官网上下载.目前最新版本是JavaMail1.5.0,下面我们来看看javamail发送带附件的邮件实例 mail.java 代码: 复制代码 代码如下: package mail;

kettle发送带附件的邮件

问题描述 kettle发送带附件的邮件 在用kettle发送带附件的邮件时,邮件能够发送成功,但是邮件里面没有附件,哪位大神给个成功的案例,或者帮忙看看是哪里的问题,谢谢! 解决方案 http://blog.csdn.net/ganggetwo/article/details/50914826 解决方案二: import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Proper

发送带附件的HTML格式邮件例程可以带附件

如何通过 ASP 来发送带附件.格式为 HTML 的邮件?下面提供了一个例程. <%@ LANGUAGE=VBScript%><%Response.Buffer = TrueResponse.Expires = 0 '创建对象实例Set myMail = Server.CreateObject("CDONTS.NewMail") '以下是将要发送的内容HTML = "<html>"HTML = HTML & "<