ホームページ > php教程 > php手册 > PHPを使用して添付ファイル付きメールを送信する

PHPを使用して添付ファイル付きメールを送信する

WBOY
リリース: 2016-06-13 12:46:59
オリジナル
1205 人が閲覧しました

参考了一下网上的文章。俗话说,天下文章一大抄,看你会抄不会抄。关键是能为我所用,这是最重要的。废话不多讲,let‘s go。
其实发mail很简单,php有现成的函数,可以参考php 的 manual,特别是第四个例子,讲的很详细。
关键是怎么把上传附件跟邮件发送结合起来。关于文件的上传,可以参考http://blog.csdn.net/slamdunk3/archive/2005/02/23/299025.aspx 这篇文章。
讲一下 文件上传的方法及其属性:
我们假设文件上传字段的名称如上例所示,为 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程序,可以对提交的 收信人,发送人,信件内容,附件进行处理。
首先建立一个静态页面,代码如下:



















发送者:
接受者:
下载提示:
源数据文件:
 




要注意的是 : 表单里 ENCTYPE="multipart/form-data" 一定要有。
再来看一下 发送邮件的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);
//この長い文字列を 1 行あたり 76 文字で構成される小さな部分に分割します
$read = chunk_split($read);
//これでメールの本文を作成できます
$body = "--$boundary
Content-type: text/plain; charset=iso-8859 -1
コンテンツ転送エンコーディング: 8 ビット
$text
--$boundary
コンテンツ タイプ: $mimeType; name=$fileName
コンテンツの性質: filename=$ fileName
コンテンツ転送エンコーディング:base64
$read
--$boundary--";
//メールを送信
if(mail($to, $subject,$body, $headers))
print "OK! $from --- $to は送信されました
";
else
print "メールの送信に失敗しました
"; ?>
理解できなくても大丈夫です。
1. 電子メールのヘッダーの構造には、通常、
コンテンツ タイプが含まれます。 multipart/mixed、つまり複数の部分 (電子メール自体 + 添付ファイル) を意味します。
boundary は、PHP に付属の uniqid(); 関数を使用して取得され、その後に From: Cc: が続きます。 rn を使用して、上の Content-type 境界から分離します。
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
by 次に、添付ファイルのコンテンツを追加します。
$mimeType は、添付ファイルの MIME タイプです。 $_FILES['upload_file']['type'] を使用して取得できます。
$fileName は添付ファイルの名前です。
メールのテキスト内容と添付ファイルは境界線で区切られています。
添付ファイルの内容は何ですか?と疑問に思う人もいるかもしれません。添付ファイルの内容は、read 関数を使用してアップロードされた添付ファイルを読み取り、base64 エンコードしてから chunk_split を使用して N 個のチャンクに分割します。各チャンクのサイズはデフォルトの 76 文字です。
それでは、そのプログラムを見てみましょう。問題ないでしょう?対応する変数を mail 関数に取り込むだけです。
上記のプログラムは PHP バージョン 4.3.8 freeBSD でテストされ、合格しました。
参考記事:「phpが添付ファイル付きメールを送信する 著者:cn-linux」

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート