PHP通过mail函数发送带附件的邮件

来源:互联网 发布:唱衰中国知乎 编辑:程序博客网 时间:2024/05/06 03:20

 

首先下载Magic WinMail Server,安装一个自己的邮件服务器,

访问http://127.0.0.1:6080,注册个帐户后,就可以对邮件进行收发管理拉。

接下来,php就可以利用mail函数通过你的邮件服务器发送邮件,运行 mail.php就行啦。

 

注:代码中标注红色代表需要准备的图片或文档。

 

代码如下:

mail.php:

<?

  error_reporting(63);

  include('html_mime_mail.inc');

  

  /***************************************

  ** Example of usage.

  ***************************************/

  /***************************************

  ** Read the file background.gif into

  ** $backgrnd.

  ***************************************/

  $filename = 'background.gif';

  $backgrnd = fread($fp = fopen($filename, 'r'), filesize($filename));

  fclose($fp);

  

  /***************************************

  ** Read the file into $attachment.

** 举例:这里我们同时发送一张图片和一个txt文本.

  ***************************************/

$filename1 = 'picture.jpg';

  $filename2 = 'test.txt';

  $attachment1 = fread($fp1 = fopen($filename1, 'r'), filesize($filename1));

  $attachment2 = fread($fp2 = fopen($filename2, 'r'), filesize($filename2));

  fclose($fp1);

  fclose($fp2);    

  /***************************************

  ** Create the mail object. Optional headers

  ** argument. Do not put From: here, this

  ** will be added when $mail->send

  ***************************************/

  $mail = new html_mime_mail("X-Mailer: Html Mime Mail Class/r/n");

  

  /***************************************

  ** If sending an html email, then these

  ** two variables specify the text and

  ** html versions of the mail. Don't

  ** have to be named as these are. Just

  ** make sure the names tie in to the

  ** $mail->add_html() command further down.

  ***************************************/

  $text = 'This is a test.';

  $html = '<HTML><BODY BACKGROUND="background.gif"><FONT FACE="Verdana, Arial" COLOR="#FF0000">    Success!</FONT><P></BODY></HTML>';

  

  /***************************************

  ** Add the text, html and embedded images.

  ** Each embedded image has to be added

  ** using $mail->add_html_image() BEFORE

  ** calling $mail->add_html(). The name

  ** of the image should match exactly

  ** (case-sensitive) to the name in the html.

  ***************************************/

  $mail->add_html_image($backgrnd, 'background.gif', 'image/gif');

  $mail->add_html($html, $text);

  

  /***************************************

  ** If not sending an html email, then

  ** this is used to set the plain text

  ** body of the email.

  ***************************************/

  // $mail->body = 'fsss';

  

  /***************************************

  ** This is used to add an attachment to

  ** the email. $filename1 & 2 是要发送的附件名称.

  ***************************************/

  $mail->add_attachment($attachment1, $filename1, 'application/octet-stream');

  $mail->add_attachment($attachment2, $filename2, 'application/octet-stream');

  

  /***************************************

  ** Builds the message.

  ***************************************/

  $mail->build_message();

  

  /***************************************

  ** Sends the message. $mail->build_message()

  ** is seperate to $mail->send so that the

  ** same email can be sent many times to

  ** differing recipients simply by putting

  ** $mail->send() in a loop.

**蓝色标注是欲邮件接收方的用户和地址,紫色标注是邮件发送方的用户和地址。

**picture是指接收邮件用户所看到的邮件主题。

  ***************************************/

  $mail->send('Lucas.liu','xuepingliu@hotmail.com', 'From Name', 'lucas@solid.com', 'picture','');

  

  /***************************************

  ** Debug stuff. Entirely unnecessary.

  ***************************************/

  echo '<PRE>';

  echo $mail->mime;

  echo '</PRE>';

  ?>

 

 

html_mine_mail.inc:

 

<?php

  class html_mime_mail{

  

  var $headers;

  var $body;

  var $multipart;

  var $mime;

  var $html;

  var $html_text;

  var $html_images = array();

  var $cids = array();

  var $do_html;

  var $parts = array();

  

  /***************************************

  ** Constructor function. Sets the headers

  ** if supplied.

  ***************************************/

  function html_mime_mail($headers = ''){

  $this->headers = $headers;

  }

  

  /***************************************

  ** Adds a html part to the mail.

  ** Also replaces image names with

  ** content-id's.

  ***************************************/

  function add_html($html, $text){

  $this->do_html = 1;

  $this->html = $html;

  $this->html_text = $text;

  if(is_array($this->html_images) AND count($this->html_images) > 0){

  for($i=0; $i<count($this->html_images); $i++){

  $this->html = ereg_replace($this->html_images[$i]['name'], 'cid:'.$this->html_images[$i]['cid'], $this->html);

  }

  }

  }

  

  /***************************************

  ** Builds html part of email.

  ***************************************/

  function build_html($orig_boundary){

  $sec_boundary = '=_'.md5(uniqid(time()));

  $thr_boundary = '=_'.md5(uniqid(time()));

  

  if(!is_array($this->html_images)){

  $this->multipart.= '--'.$orig_boundary."/r/n";

  $this->multipart.= 'Content-Type: multipart/alternative; boundary="'.$sec_boundary."/"/r/n/r/n/r/n";

  

  $this->multipart.= '--'.$sec_boundary."/r/n";

  $this->multipart.= 'Content-Type: text/plain'."/r/n";

  $this->multipart.= 'Content-Transfer-Encoding: 7bit'."/r/n/r/n";

  $this->multipart.= $this->html_text."/r/n/r/n";

  

  $this->multipart.= '--'.$sec_boundary."/r/n";

  $this->multipart.= 'Content-Type: text/html'."/r/n";

  $this->multipart.= 'Content-Transfer-Encoding: 7bit'."/r/n/r/n";

  $this->multipart.= $this->html."/r/n/r/n";

  $this->multipart.= '--'.$sec_boundary."--/r/n/r/n";

  }else{

  $this->multipart.= '--'.$orig_boundary."/r/n";

  $this->multipart.= 'Content-Type: multipart/related; boundary="'.$sec_boundary."/"/r/n/r/n/r/n";

  

  $this->multipart.= '--'.$sec_boundary."/r/n";

  $this->multipart.= 'Content-Type: multipart/alternative; boundary="'.$thr_boundary."/"/r/n/r/n/r/n";

  

  $this->multipart.= '--'.$thr_boundary."/r/n";

  $this->multipart.= 'Content-Type: text/plain'."/r/n";

  $this->multipart.= 'Content-Transfer-Encoding: 7bit'."/r/n/r/n";

  $this->multipart.= $this->html_text."/r/n/r/n";

  

  $this->multipart.= '--'.$thr_boundary."/r/n";

  $this->multipart.= 'Content-Type: text/html'."/r/n";

  $this->multipart.= 'Content-Transfer-Encoding: 7bit'."/r/n/r/n";

  $this->multipart.= $this->html."/r/n/r/n";

  $this->multipart.= '--'.$thr_boundary."--/r/n/r/n";

  

  for($i=0; $i<count($this->html_images); $i++){

  $this->multipart.= '--'.$sec_boundary."/r/n";

  $this->build_html_image($i);

  }

  

  $this->multipart.= "--".$sec_boundary."--/r/n/r/n";

  }

  }

  /***************************************

  ** Adds an image to the list of embedded

  ** images.

  ***************************************/

  function add_html_image($file, $name = '', $c_type='application/octet-stream'){

  $this->html_images[] = array( 'body' => $file,

  'name' => $name,

  'c_type' => $c_type,

  'cid' => md5(uniqid(time())) );

  }

  

  

  /***************************************

  ** Adds a file to the list of attachments.

  ***************************************/

  function add_attachment($file, $name = '', $c_type='application/octet-stream'){

  $this->parts[] = array( 'body' => $file,

  'name' => $name,

  'c_type' => $c_type );

  }

  

  /***************************************

  ** Builds an embedded image part of an

  ** html mail.

  ***************************************/

  function build_html_image($i){

  $this->multipart.= 'Content-Type: '.$this->html_images[$i]['c_type'];

  

  if($this->html_images[$i]['name'] != '') $this->multipart .= '; name="'.$this->html_images[$i]['name']."/"/r/n";

  else $this->multipart .= "/r/n";

  

  $this->multipart.= 'Content-ID: <'.$this->html_images[$i]['cid'].">/r/n";

  $this->multipart.= 'Content-Transfer-Encoding: base64'."/r/n/r/n";

  $this->multipart.= chunk_split(base64_encode($this->html_images[$i]['body']))."/r/n";

  }

  

  /***************************************

  ** Builds a single part of a multipart

  ** message.

  ***************************************/

  function build_part($i){

  $message_part = '';

  $message_part.= 'Content-Type: '.$this->parts[$i]['c_type'];

  if($this->parts[$i]['name'] != '')

  $message_part .= '; name="'.$this->parts[$i]['name']."/"/r/n";

  else

  $message_part .= "/r/n";

  

  // Determine content encoding.

  if($this->parts[$i]['c_type'] == 'text/plain'){

  $message_part.= 'Content-Transfer-Encoding: 7bit'."/r/n/r/n";

  $message_part.= $this->parts[$i]['body']."/r/n";

  }else{

  $message_part.= 'Content-Transfer-Encoding: base64'."/r/n";

  $message_part.= 'Content-Disposition: attachment; filename="'.$this->parts[$i]['name']."/"/r/n/r/n";

  $message_part.= chunk_split(base64_encode($this->parts[$i]['body']))."/r/n";

  }

  

  return $message_part;

  }

  

  /***************************************

  ** Builds the multipart message from the

  ** list ($this->parts).

  ***************************************/

  function build_message(){

  $boundary = '=_'.md5(uniqid(time()));

  

  $this->headers.= "MIME-Version: 1.0/r/n";

  $this->headers.= "Content-Type: multipart/mixed; boundary=/"".$boundary."/"/r/n";

  $this->multipart = '';

  $this->multipart.= "This is a MIME encoded message./r/nCreated by html_mime_mail.class./r/nSee http://www.heyes-computing.net/&#115;cripts/ for a copy./r/n/r/n";

  

  if(isset($this->do_html) AND $this->do_html == 1) $this->build_html($boundary);

  if(isset($this->body) AND $this->body != '') $this->parts[] = array('body' => $this->body, 'name' => '', 'c_type' => 'text/plain');

  

  for($i=(count($this->parts)-1); $i>=0; $i--){

  $this->multipart.= '--'.$boundary."/r/n".$this->build_part($i);

  }

  

  $this->mime = $this->multipart."--".$boundary."--/r/n";

  }

  

  /***************************************

  ** Sends the mail.

  ***************************************/

  function send($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = ''){

  

  if($to_name != '') $to = '"'.$to_name.'" <'.$to_addr.'>';

  else $to = $to_addr;

  if($from_name != '') $from = '"'.$from_name.'" <'.$from_addr.'>';

  else $from = $from_addr;

  $this->headers.= 'From: '.$from."/r/n";

  //$this->headers.= $headers;

  mail($to, $subject, $this->mime, $this->headers);

  }

  

  /***************************************

  ** Use this method to deliver using direct

  ** smtp connection. Relies upon Manuel Lemos'

  ** smtp mail delivery class available at:

  ** http://phpclasses.upperdesign.com

  **

  ** void smtp_send( string *Name* of smtp object,

  ** string From address,

  ** array To addresses,

  ** array Headers,

  ** string The body)

  ***************************************/

  function smtp_send($smtp_obj, $from_addr, $to_addr){

  global $$smtp_obj;

  $smtp_obj = $$smtp_obj;

  

  if(substr($this->headers, -2) == "/r/n") $this->headers = substr($this->headers,0,-2);

  $this->headers = explode("/r/n", $this->headers);

  

  $smtp_obj->sendmessage($from_addr, $to_addr, $this->headers, $this->mime);

  }

  

  } // End of class.

 

?>