未分类

讲一下 文件上传的诀窍及其性质,那个头告诉邮件程序电子邮件是由贰个以上的部分构成的

5 5月 , 2020  

参考了一下网上的文章。俗话说,天下文章一大抄,看你会抄不会抄。关键是能为我所用,这是最重要的。废话不多讲,let‘s
go。 其实发mail很简单,php有现成的函数,可以参考php 的
manual,特别是第四个例子,讲的很详细。
关键是怎么把上传附件跟邮件发送结合起来。关于文件的上传,可以参考
这篇文章。 讲一下 文件上传的方法及其属性:
我们假设文件上传字段的名称如上例所示,为 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或其它的服务器端的脚本语言。当然你还要一个真正支持PHP的网站的账号。假如满足了这个前提,在你读完了本章后就可以用PHP发送带附件的电子邮件了。

注: 在 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()
函数来设置是不起作用的。该环境变量也可以用来确认其它的操作也是在上传的文件上进行的。
有了这些,我们再看与邮件相关的东西。下面是一个带附件电子邮件的例子。

  1. 附件是如何工作的

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

  假如你曾经在PHP的手册中搜索过”附件”函数,那么结果可能是什么都没有(至少在我写本文的时间还没有)。后来你就要花很多时间来了解这方面的知识。你也许会想当你给某个人发送一封带附件的电子邮件时,附件是和邮件一起放到收件人的信箱里的(比如,假如你给他/她发了一个PNG的图片文件,他/她的信箱里会包含一个txt文件(电子邮件)和一个.png文件(附件))。但这不是它的工作原理。当你加入一个附件时,你的邮件程序把附件转换成纯文本文件,并在你写的内容(实际的电子邮件)后面插入这个文本块。这个,当你把所有的东西发出来后,收件人的信箱里只有一个纯文本文件–一个同时包含附件和实际电子邮件内容的文件。

This is the body of the email.

  下面是一个带附件(一个HTML文件)电子邮件的例子。我已经标注了其中重要的几行:

–396d983d6b89a Content-type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit

Return-Path: <someone@example.com>
讲一下 文件上传的诀窍及其性质,那个头告诉邮件程序电子邮件是由贰个以上的部分构成的。Date: Thurs, 10 June 2004 8:17:29 0000
From: Someone <someone@example.com>
To: Person <web@>
Message-id: <web@>
Content-type: multipart/mixed; boundary=”web”
Subject: Here’s the subject

This is the attached HTML file

–web
Content-type: text/plain; charset=g2312
Content-transfer-encoding: 8bit

–396d983d6b89a–

This is the body of the email.

前面的7行是邮件的头,其中值得注意的是Content-type头部分。这个头告诉邮件程序电子邮件是由一个以上的部分组成的。不含附件的邮件只有一个部分:消息本身。带附件的电子通常至少由两部分组成:消息和附件。这样,带两个附件的邮件由三部分组成:消息,第一个附件和第二个附件。

–web
Content-type: text/html; name=attachment.html
Content-disposition: inline; filename=attachment.html
Content-transfer-encoding: 8bit

带附件的电子邮件的不同部分之间用分界线来分隔。分界线在Content–type头中定义。邮件的每个新部分以两个连字号和分界线开始。
最后一个分界线后也有两个连字号,表示这个邮件中没有其它的部分了。

<html>
<head>
<title>The attachment</title>
</head>
<body>
<h2>This is the attached HTML file</h2>
</body>
</html>

在每个分界线后有一些行,用来告诉邮件程序这个部分的内容的类型。
比如,看看上面例子中第一个分界线后面的两行–以Content-type:
text/plain开头的行。这些行说明后面的部分是ISO-8859-1字符集的纯文本。跟在第二个分界线后的行告诉邮件程序现在的部分是一个HTML文件,它的名字是”attachment.html”。

–396d983d6b89a–

Content-disposition这持告诉邮件程序如果可能就以内嵌的方式显示附件。现在新的邮件程序会在消息后显示HTML的内容。如果Content-
disposition被设为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个连接到文件的图标。收件人要看附件的内容,必须点击这个图标。一般情况下,如果附件是一些文本,Content-disposition会被设为inline,这是因为现在大部分邮件程序能够不借助其它浏览器而直接显示附件的内容。如果附件不是文本,Content-disposition
就设为attachment。 我们仿照上面的例子,自己写一个php程序,可以对提交的
收信人,发送人,信件内容,附件进行处理。
首先建立一个静态页面,代码如下:

前面的7行是邮件的头,其中值得注重的是Content-type头部分。这个头告诉邮件程序电子邮件是由一个以上的部分组成的。不含附件的邮件只有一个部分:消息本身。带附件的电子通常至少由两部分组成:消息和附件。这样,带两个附件的邮件由三部分组成:消息,第一个附件和第二个附件。

要注意的是 : 表单里 ENCTYPE=”multipart/form-data” 一定要有。 再来看一下
发送邮件的php程序:

带附件的电子邮件的不同部分之间用分界线来分隔。分界线在Content-type头中定义。邮件的每个新部分以两个连字号(–)和分界线开始。最后一个分界线后也有两个连字号,表示这个邮件中没有其它的部分了。

// 打开文件 $fp = fopen; // 把整个文件读入一个变量 $read = fread;
//我们用base64方法把它编码 $read = base64_encode;
//把这个长字符串切成由每行76个字符组成的小块 $read = chunk_split;
//现在我们可以建立邮件的主体 $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
“; else print “fail to send mail
“; ?> 看不明白没关系,我来说明一下: 1,邮件头的构造 :一般包括
内容类型要发送附件,设置为 multipart/mixed 意思是多个部分 。 boundary
,就是上面提到的分界线,他的值用php自带的 uniqid();函数取得
接受方,抄送等,在后面加上 From: Cc:。与上面的 Content-type boundary
之间用 rn 分割 。 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’]www.2979.com, 得到。 $fileName 就是附件的名字了
邮件文本内容和附件之间用 boundary 分割。
有人会问,附件内容是什么?附件内容就是用read函数读入所上传的附件,然后再把它经过base64编码之后再用chunk_split
大卸N块,每块大小是默认的76字符。
好了,现在再去看那段程序,应该没什么问题了吧?把相应的变量带入mail函数里面就ok了。
以上程序在 PHP Version 4.3.8 freeBSD 下测试通过。 参考文章:《php
发送带附件的邮件 作者: cn-linux》

在每个分界线后有一些行,用来告诉邮件程序这个部分的内容的类型。比如,看看上面例子中第一个分界线后面的两行–以Content-type:
text/plain开头的行。这些行说明后面的部分是ISO-8859-1字符集的纯文本。跟在第二个分界线后的行告诉邮件程序现在的部分是一个HTML文件,它的名字是”attachment.html”。

Content-disposition这持告诉邮件程序假如可能就以内嵌的方式显示附件。现在新的邮件程序会在消息后显示HTML的内容。假如Content-disposition被设为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个连接到文件的图标(或其它的类似的东西)。收件人要看附件的内容,必须点击这个图标。一般情况下,假如附件是一些文本(包含HTML),Content-disposition会被设为inline,这是因为现在大部分邮件程序能够不借助其它浏览器而直接显示附件(文本)的内容。假如附件不是文本(比如图片或其它类似的内容),Content-disposition就设为attachment。

  1. 用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>”;


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图