利用php中mail函数发送带有附件的邮件
发布:smiling 来源: PHP粉丝网 添加日期:2014-01-25 23:24:04 浏览: 评论:0
mail函数,发送邮件
语法: mail(to,subject,message,headers,parameters)
to 规定邮件的接收者
subject 规定邮件的主题。该参数不能包含任何换行字符
message 规定要发送的消息
headers 规定额外的报头,比如 From, Cc 以及 Bcc
parameters 规定 sendmail 程序的额外参数。
碰到的主要问题是乱码问题,刚开始是某些客户端接收邮件时好(比如QQ邮箱,估计带自动那个识别编码)的有些不foxmail、ipad显示乱码,解决方式正确的设置这个mail的headers就行了,下面是我使用的完美的无乱码的例子。
在PHP中配置php.ini文件过程分为两个步骤:
1.先找到你放置所有PHP,Apache,MySQL文件的地方,在PHP文件夹里你可以发现有一个文件:php.ini,打开后,找到mail function地方,将原来的配置代码改为如下(仅对windows系统):
- [mail function]
- ; For Win32 only.
- SMTP =smtp.sohu.com
- mtp_port=25
- ; For Win32 only.
- sendmail_from = 填上你的电子邮件全称。
此处为以sohu的邮件服务器设置,如果你用163的邮箱,则设置为:smtp.163.com
2.在C盘搜索php.ini,选择不是快捷方式的那一个php.ini,应该在C/WINDOWS里面的,打开它,如上面一样修改它,保存,设置完后,记得重启Apache服务器,然后mail()函数就可以用了,示例代码如下:
- <?php
- // 当发送 HTML 电子邮件时,请始终设置 content-type
- $headers = "MIME-Version: 1.0" . "rn";
- $headers .= "Content-type:text/html; charset=utf-8";
- mail($to,$subject,$message,$headers);
- ?>
上面函数不可以带附件了,下面我们升级一下,代码如下:
- <?php
- class Mail {
- private $topic;
- private $toaddr;
- private $fromaddr;
- private $cc;
- private $content;
- private $attach;
- private $header;
- private $domain;//邮箱域
- private $msg;
- private $filename;
- private $filemime;
- private $filestr;
- private $boundary;
- private $uniqid;
- private $eol; //每行末尾所加的换行符类型
- function __construct(){
- $this->getEOT();//生成结尾换行符
- $this->getUniq_id();
- $this->header='';
- $this->attach='';
- $this->cc='';
- $this->msg='';
- }
- public function getFromaddr() {
- return $this->fromaddr;
- }
- public function setFromaddr($fromaddr) {
- $this->fromaddr = $fromaddr;
- }
- public function getTopic() {
- return $this->topic;
- }
- public function getToaddr() {
- return $this->toaddr;
- }
- public function getCc() {
- return $this->cc;
- }
- public function getContent() {
- return $this->content;
- }
- public function getAttach() {
- return $this->attach;
- }
- public function setTopic($topic) {
- $this->topic = mb_convert_encoding(trim($topic),'UTF-8','auto');
- }
- public function setToaddr($toaddr) {
- $this->toaddr = trim($toaddr);
- }
- public function setCc($cc) {
- $this->cc = trim($cc);
- }
- public function setContent($content) {
- $this->content = mb_convert_encoding(trim($content),'UTF-8','auto');
- }
- public function setAttach($attach) {
- $this->attach = trim($attach);
- }
- public function getDomain() {
- return $this->domain;
- }
- public function setDomain($domain) {
- $this->domain = $domain;//输入的值为'@domain.com'
- }
- /*
- * 根据系统类型设置换行符
- */
- private function getEOT() {
- if (strtoupper ( substr ( PHP_OS, 0, 3 ) == 'WIN' )) {
- $this->eol = "rn";
- } elseif (strtoupper ( substr ( PHP_OS, 0, 3 ) == 'MAC' )) {
- $this->eol= "r";
- } else {
- $this->eol = "n";
- }
- }
- private function getBoundary(){
- $this->boundary= '--'.substr(md5(time().rand(1000,2000)),0,16);
- }
- private function getUniq_id(){
- $this->uniqid= md5(microtime().time().rand(1,100));
- }
- private function outputCommonHeader(){
- $this->header .= 'From: '.$this->fromaddr.$this->eol;
- //$this->header .= 'To: '.$this->toaddr.$this->eol;
- //$this->header .= 'Subject: '.$this->topic.$this->eol;
- $this->header .= 'Message-ID: <'.$this->uniqid.$this->domain.'>'.$this->eol;
- $this->header .= 'MIME-Version: 1.0'.$this->eol;
- $this->header .= 'Reply-To: '.$this->fromaddr.$this->eol;
- $this->header .= 'Return-Path: '.$this->fromaddr.$this->eol;
- $this->header .= 'X-Mailer: Xmail System'.$this->eol;
- $this->header .= 'Content-Disposition: inline'.$this->eol;
- }
- private function mime_content_type ( $f )
- {
- $temp = trim ( exec ('file -bi ' . escapeshellarg ( $f ) ) ) ;
- $temp = preg_replace('/s+/',' ',$temp);
- $temp = explode(' ',$temp);
- return $temp[0];
- }//判断文件的mime类型
- /*
- * 只带有抄送
- */
- private function mailWithCC(){
- $this->header .= 'Cc: '.$this->cc.$this->eol;
- $this->header .= 'Content-type: text/html; charset=UTF-8'.$this->eol;
- $this->header .= 'Content-Transfer-Encoding: 8bit'.$this->eol;
- $this->msg = $this->content;
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
- /*
- * $filedir需要是绝对地址
- */
- private function attachmentToBase64($filedir){
- $this->filename = basename($filedir);
- @$fopen = fopen($filedir,'r');
- $str = fread($fopen,filesize($filedir));
- $str = base64_encode($str);
- $this->filestr = $str;
- }
- /*
- * 只带有附件
- */
- private function mailWithAttach(){
- $this->attachmentToBase64($this->attach);
- $this->header .= 'Content-type: multipart/mixed; boundary="'.str_replace('--','',$this->boundary).'"'.$this->eol;
- $this->msg .= $this->eol.$this->boundary.$this->eol;
- $this->msg .= 'Content-Type: text/html; charset=utf-8'.$this->eol;
- $this->msg .= 'Content-Disposition: inline'.$this->eol;
- $this->msg .= $this->eol.$this->content.$this->eol;
- $this->msg .= $this->boundary.$this->eol;
- $this->msg .= 'Content-Type: '.$this->mime_content_type($this->attach).$this->eol;
- $this->msg .= 'Content-Disposition: attachment; filename="'.$this->filename.'"'.$this->eol;
- $this->msg .= 'Content-Transfer-Encoding: base64'.$this->eol;
- $this->msg .= $this->eol.$this->filestr.$this->eol;
- $this->msg .= $this->eol.$this->boundary.'--';
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
- /*
- * 带有附件和抄送
- */
- private function mailAll(){
- $this->attachmentToBase64($this->attach);
- $this->header .= 'Cc: '.$this->cc.$this->eol;
- $this->header .= 'Content-type: multipart/mixed; boundary="'.str_replace('--','',$this->boundary).'"'.$this->eol;
- $this->msg .= $this->eol.$this->boundary.$this->eol;
- $this->msg .= 'Content-Type: text/html; charset=utf-8'.$this->eol;
- $this->msg .= 'Content-Disposition: inline'.$this->eol;
- $this->msg .= $this->eol.$this->content.$this->eol;
- $this->msg .= $this->boundary.$this->eol;
- $this->msg .= 'Content-Type: '.$this->mime_content_type($this->attach).$this->eol;
- $this->msg .= 'Content-Disposition: attachment; filename="'.$this->filename.'"'.$this->eol;
- $this->msg .= 'Content-Transfer-Encoding: base64'.$this->eol;
- $this->msg .= $this->eol.$this->filestr.$this->eol;
- $this->msg .= $this->eol.$this->boundary.'--';
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
- /*
- * 不带抄送和附件
- */
- private function mailSimple(){
- $this->header .= 'Content-type: text/html; charset=UTF-8'.$this->eol;
- $this->header .= 'Content-Transfer-Encoding: 8bit'.$this->eol;
- $this->msg = $this->content;
- if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){
- return 1;
- }else{
- return 0;
- }
- }
- public function send(){
- if(emptyempty($this->attach)&&emptyempty($this->cc)){
- $this->outputCommonHeader();
- return $this->mailSimple();
- }else if(emptyempty($this->attach)){
- $this->outputCommonHeader();
- return $this->mailWithCC();
- }else if(emptyempty($this->cc)){
- $this->outputCommonHeader();
- $this->getBoundary(); //有附件就生成boundary
- return $this->mailWithAttach();
- }else if(!emptyempty($this->toaddr)&&!emptyempty($this->topic)&&!emptyempty($this->cc)&&!emptyempty($this->content)&&!emptyempty($this->attach)){
- $this->outputCommonHeader();
- $this->getBoundary(); //有附件就生成boundary
- return $this->mailAll();
- }
- }
- }
示例代码,有些变量需要上下文环境,代码如下:
- $m = new Mail();
- $m->setToaddr($this->temp['receipt_address']);
- $m->setTopic($this->temp['mail_title']);
- $m->setContent($this->temp['mail_content']);
- $m->setFromaddr($_SESSION['user']['name'].' <'.$_SESSION['user']['name'].'@'.SystemDomain.'>');
- $m->setDomain('@'.SystemDomain);
- $m->setCc($this->temp['cc_address']);
- $m->setAttach(PATH.'/temp/'.$this->temp['attachment_file']);
- $m->send();
优点:使用方便就一个简单的函数
缺点:需要php.ini支持该函数,如果某些服务器不支持而又不能改环境那就不行了而且总是不稳定,发的有时能收到有时不能.
Tags: php mail 函数 附件邮件
相关文章
- ·PHP 是什么?(2013-11-12)
- ·Php.ini文件位置在哪里 Php.ini文件找不到(2013-11-12)
- ·PHP 数据类型(2013-11-12)
- ·php 获取当前脚本的url(2013-11-12)
- ·php技术生成静态页面的实现(2013-11-13)
- ·缺陷月项目启动 披露PHP脚本语言漏洞(2013-11-13)
- ·在PHP中全面阻止SQL注入式攻击(2013-11-13)
- ·php生成随机密码的几种方法(2013-11-13)
- ·PHP中使用FCKeditor2.3.2配置(2013-11-13)
- ·如何使用PHP开发高效的WEB系统(2013-11-13)
- ·php:树形结构的算法(2013-11-13)
- ·php4和php5区别(2013-11-13)
- ·php数据库连接(2013-11-13)
- ·如何正确理解PHP的错误信息(2013-11-13)
- ·php页面漏洞分析及相关问题解决(2013-11-13)
- ·当在连接PHP时,抱怨一些数值没有定义参考?(2013-11-27)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)