用php发送带附件的Email

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

(0)

相关推荐

  • 用PHP即时捕捉PHP中的错误并发送email通知的实现代码

    开发PHP的朋友都知道,其实最担心的就是程序中出现一些异常或错误,这些状况如果输出到用户的萤幕会把用户给吓坏,甚至为此丢了工作,如果不输出到萤幕就得想办法记录到日志中,但是似乎不是每个人都有查看错误日志的习惯,爲了解决这个尴尬的问题,所以我写了这段代码,其用意就是当我们写的php程式出错的时候把错误内容捕捉出来然后发到我们的email内. 先看效果: 复制代码 代码如下: Define('SYS_DEBUG',false); IF(SYS_DEBUG) { ini_set('display_er

  • 屏蔽机器人从你的网站搜取email地址的php代码

    垃圾邮件很烦人,下面贴一种能够自动屏蔽机器人从你的网站搜集email地址的方法. 复制代码 代码如下: function security_remove_emails($content) { $pattern = '/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/i'; $fix = preg_replace_callback($pattern, "security_remove_emails_logic", $content);

  • PHP 错误处理机制

    在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,那么程序看上去也很不专业,也很可能就会成为别人攻击系统的有效信息:有些错误异常会终止脚本执行,这个时候如果没有一些错误提示信息的话,那么我们只能从头开始看代码了,要知道项目中成百上千行的代码对我们来说是件多么恐怖的事情啊,那么我们如何在项目开发的过程中快速准确地定位到异常.错误呢,并进行相应的处理,本文由自己对错误.异常处理的了解,再此分享与大家相互学习交流,并作为一个备忘. 系统错误处理器: PH

  • 通过Email发送PHP错误的方法

    本文实例讲述了通过Email发送PHP错误的方法.分享给大家供大家参考.具体实现方法如下: <?php // Our custom error handler function nettuts_error_handler($number, $message, $file, $line, $vars){ $email = " <p>An error ($number) occurred on line <strong>$line</strong> and

  • PHP正则验证Email的方法

    本文实例讲述了PHP正则验证Email的方法.分享给大家供大家参考.具体如下: <?php function validateEmail($email) { $isValid = true; $atIndex = strrpos($email, "@"); if (is_bool($atIndex) && !$atIndex) { $isValid = false; } else { $domain = substr($email, $atIndex+1); $l

  • 用PHP将网址字符串转换成超链接(网址或email)

    复制代码 代码如下: function makeClickableLinks($text) { $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_+.~#?&//=]+)', '<a href="\1">\1</a>', $text); $text = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)','

  • 用Php编写注册后Email激活验证的实例代码

    总共需两个页面,register.php 和 verify.php 1. 用户注册表格 register.php 复制代码 代码如下: <html> <body> <form action="register.php" method="post" name="register"> 用户名:<input type="text" name="username" />

  • php获取错误信息的方法

    本文实例讲述了php获取错误信息的方法.分享给大家供大家参考.具体如下: function error_reg(){ $ar=array( E_ERROR => 'error', E_WARNING => 'warning', E_PARSE =>'prase', E_NOTICE => 'notice' ); register_shutdown_function(function() use ($ar){ $ers=error_get_last(); if($ers['type'

  • 用php发送带附件的Email

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

  • 用vbs发送带附件的邮件

    function Send_mail(You_Account,You_Password,Send_Email,Send_Email2,Send_Topic,Send_Body,Send_Attachment)  'code by NetPatch 'VBS发送邮件参数说明 'You_Account:你的邮件帐号 'You_Password:你的邮件密码 'Send_Email: 主要邮件地址 'Send_Email2: 备用邮件地址 'Send_Topic: 邮件主题 'Send_Body:  

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

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

  • smtp发送带附件的邮件代码分享

    该方式直接保存为HTML文件,也可以是文本文件,其它格式效果不是很好 复制代码 代码如下: MailMessage mmsg = new MailMessage();     mmsg.Subject = "邮件标题";     mmsg.Body = "邮件内容";     mmsg.To.Add("accept@qq.com");//接收邮箱     byte[] bytes = System.Text.Encoding.Default.Ge

  • Codeigniter实现发送带附件的邮件

    本文实例讲述了Codeigniter实现发送带附件的邮件的方法.分享给大家供大家参考.具体分析如下: attach() 方法允许你的发邮件时带上附件,下面是演示代码 复制代码 代码如下: $this->load->library('email'); $this->email->from('w3@w3mentor.com', 'W3M'); $this->email->subject('Email Test with attachment'); $this->ema

  • php实现的发送带附件邮件类实例

    本文实例讲述了php实现的发送带附件邮件类的方法,是一个非常实用的功能.分享给大家供大家参考.具体方法如下: emailclass.php类文件如下: <? class CMailFile { var $subject; var $addr_to; var $text_body; var $text_encoded; var $mime_headers; var $mime_boundary = "--==================_846811060==_"; var $

  • Java Web stmp发送带附件邮件(附SSL版)

    本文实例为大家分享了Java Web stmp发送带附件邮件的具体代码,供大家参考,具体内容如下 public class MailFileSendUtils { private Properties props; //系统属性 private Session session; //邮件会话对象 private MimeMessage mimeMsg; //MIME邮件对象 private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成Mi

  • python SMTP实现发送带附件电子邮件

    本文实例为大家分享了python SMTP发送带附件电子邮件的具体代码,供大家参考,具体内容如下 可采用email模块发送电子邮件附件.发送一个未知MIME类型的文件附件其基本思路如下: 1. 构造MIMEMultipart对象做为根容器 2. 构造MIMEText对象做为邮件显示内容并附加到根容器 3. 构造MIMEBase对象做为文件附件内容并附加到根容器 a. 读入文件内容并格式化 b. 设置附件头 4. 设置根容器属性 5. 得到格式化后的完整文本 6. 用smtp发送邮件 具体内容参见

  • 基于SpringBoot实现发送带附件的邮件

    这篇文章主要介绍了基于SpringBoot实现发送带附件的邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 <!--发送email依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependenc

  • Python3使用SMTP发送带附件邮件

    一.设置开启SMTP服务并获取授权码 可以参考第一篇文章,这里不再赘述:[一]https://www.jb51.net/article/142220.htm 二.使用Python3 发送带附件的邮件 0.使用的环境为: Python 3.6.3 (64bit) PyCharm 2017.3 (64bit) 1.注意事项: 在调用smtplib,发送简单邮件的时候使用smtplib.SMTP()方法使没有问题的. 但是如果是邮件存在附件的情况下,还使用smtplib.SMTP()方法,就可能会发送

随机推荐