MailMessage.object
上传用户:xiao730204
上传日期:2007-01-04
资源大小:141k
文件大小:12k
源码类别:

WEB邮件程序

开发平台:

PHP

  1. <?php
  2. class MailMessage extends BaseObject {
  3.    var $from;
  4.    var $to;
  5.    var $cc;
  6.    var $bcc;
  7.    var $subject;
  8.    var $headers;
  9.    var $message_body;
  10.    var $attatchments;
  11.    var $attatchments_filename_override;
  12.    var $attatchments_comments;
  13.    var $sendmail;
  14.    var $sendmail_command;
  15.    var $smtp;
  16.    var $smtp_server;
  17.    var $smtp_port;
  18.    var $mime_boundary;
  19.    var $new_line;
  20.    var $net_object;
  21.    var $debug;
  22.    var $fp;
  23.    var $charset;
  24.    Function MailMessage() {
  25.       $this->BaseObject( 'MailMessage' );
  26.       $this->from          = '';
  27.       $this->to            = '';
  28.       $this->subject       = '';
  29.       $this->message_body  = '';
  30.       $this->headers       = Array();
  31.       $this->attatchments                    = Array();
  32.       $this->attatchments_comments           = Array();
  33.       $this->attatchments_filename_override  = Array();
  34.       $this->sendmail         = 0;
  35.       $this->sendmail_command = 'sendmail';
  36.       $this->smtp             = 1;
  37.       $this->smtp_server      = 'localhost';
  38.       $this->smtp_port        = 25;
  39.       $this->net_obj          = new Net();
  40.       $this->new_line         = "rn";
  41.       $this->debug = new Debug();
  42.       $this->debug->On();
  43.       $this->fp = undef;
  44.       $this->charset = 'US-ASCII';
  45.    }
  46.    Function AddFile( $path_to_file, $comment = '', $fname_override = '') {
  47.       return $this->AttatchFile( $path_to_file, $comment, $fname_override );
  48.    }
  49.    Function AttatchFile( $path_to_file, $comment = '', $fname_override = '' ) {
  50.       if ( file_exists( $path_to_file ) ) {
  51.          $this->attatchments[] = $path_to_file;
  52.          $this->attatchments_comments[ $path_to_file ] = $comment;
  53.          $this->attatchments_filename_override[ $path_to_file ] = 
  54.             $fname_override;
  55.          return 1;
  56.       }
  57.       return 0;
  58.    }
  59.    Function AddHeader( $header, $value ) {
  60.       $this->headers[ $header ] = $value;
  61.    }
  62.    Function Send() {
  63.       if ( $this->sendmail == 1 ) {
  64.          $this->debug->Message( 'Send using sendmail' );
  65.          return $this->SendUsingSendmail();
  66.       }
  67.       if ( $this->smtp == 1 ) {
  68.          $this->debug->Message( 'Send using smtp' );
  69.          return $this->SendUsingSMTP();
  70.       }
  71.       return 0;
  72.    }
  73.    Function ExplodeAddressList( $address_list ) {
  74.       if ( $address_list == '' ) {
  75.          return Array();
  76.       }
  77.       return split( ',', $address_list );
  78.    }
  79.    Function StripMailAddressBare( $address ) {
  80.       $bare_addr = $address;
  81.       /* make sure the mail from is in the format of user@host.com */
  82.       if ( ereg( '<(.*)>', $address , $regs ) ) {
  83.            $bare_addr = $regs[ 1 ];
  84.       }
  85.       return $bare_addr;
  86.    }
  87.    Function FpPrint( $line, $new_line = 1 ) {
  88.       $this->debug->Message( 'SEND: ' . $line );
  89.       if ( $this->smtp == 1 ) {
  90.          $this->net_obj->SendLine( $line );
  91.       } else {
  92.          fputs( $this->fp, $line );
  93.       }
  94.       if ( $new_line == 1 && $this->smtp == 1 ) {
  95.          $this->net_obj->SendLine( $this->new_line );
  96.       } else if ( $new_line == 1 ) {
  97.          fputs( $this->fp, $this->new_line );
  98.       }
  99.    }
  100.    Function Write_RFC822_Headers() {
  101.       /* Date header isn't really neaded */
  102.       // date = date( 'D, j M Y H:i:s ", mktime()) . timezone();
  103.       $this->FpPrint( 'Subject: '   .  $this->subject );
  104.       $this->FpPrint( 'From: '      .  $this->from );
  105.       $this->FpPrint( 'To: '        .  $this->to );
  106.       if ( $this->cc != undef && $this->cc != '' ) {
  107.          $this->FpPrint( 'Cc: ' . $this->cc );
  108.       }
  109.       if ( $this->bcc != undef && $this->bcc != '' ) {
  110.          $this->FpPrint( 'Bcc: ' . $this->bcc );
  111.       }
  112.       // Write user headers
  113.       reset( $this->headers );
  114.       while( list( $header_name, $header_value ) = each( $this->headers ) ) {
  115.          $this->FpPrint( $header_name .  ': ' . $header_value );
  116.       }
  117.       // Write MIME headers
  118.       $this->FpPrint( 'MIME-Version: 1.0' );
  119.       if ( count( $this->attatchments ) > 0 ) {
  120.          // Generate a mime boundary
  121.          $this->mime_boundary    = 
  122.             '0-' . microtime() . '-912837412-' . time() . '=:4553';
  123.          $this->mime_boundary = str_replace( ' ', '', $this->mime_boundary );
  124.          $this->FpPrint(
  125.             'Content-Type: multipart/mixed; BOUNDARY="' . 
  126.             $this->mime_boundary . '"'
  127.          );
  128.          // dummy error message
  129.          $this->FpPrint( 
  130. ' This message is in MIME format. The first part should be ' . $this->new_line .
  131. ' readable text, while the remaining parts are likely' . $this->new_line .
  132. ' unreadable without MIME-aware tools. Send mail to' . $this->new_line .
  133. ' mime@docserver.cac.washington.edu for more info.' . $this->new_line
  134.          );
  135.          $this->FpPrint( '--' . $this->mime_boundary );
  136.          $this->FpPrint( 'Content-Type: text/plain; charset=' . $this->charset );
  137.          $this->FpPrint( '' );
  138.       } else {
  139.          $this->FpPrint( 'Content-Type: text/plain; charset=' . $this->charset );
  140.       }
  141.       $this->FpPrint( '' );
  142.    }
  143.    Function Write_MessageBody() {
  144.       $this->FpPrint( $this->message_body );
  145.       // attatchments are mime encoded
  146.       if ( count( $this->attatchments ) > 0 ) {
  147.          $this->FpPrint( '' );
  148.          $mime_util = new MimeObject();
  149.          // Attatch the seperate files
  150.          for( $x = 0; $x < count( $this->attatchments ); $x++ ) {
  151.             $current_file = $this->attatchments[ $x ];
  152.             if ( file_exists( $current_file ) ) {
  153.             $fh = fopen( $current_file, 'r' ) ;
  154.             $file_contents = fread( $fh, filesize( $current_file ) );
  155.             fclose( $fh );
  156.             $this->FpPrint( '--' . $this->mime_boundary );
  157.             $cur_file = $current_file;
  158.             if ( $this->attatchments_filename_override[ $current_file ] != '' ) {
  159.                $cur_file = $this->attatchments_filename_override[ $current_file ];
  160.             }
  161.             $this->FpPrint(
  162.                'Content-Type: ' . 
  163.                $mime_util->GetType( $cur_file ) . ';' .
  164.                'name="' . basename( $cur_file ) . '"'
  165.             );
  166.             $this->FpPrint( 'Content-Transfer-Encoding: base64' );
  167.             /* TODO Fix the content description handlers */
  168.             $this->FpPrint(
  169.                'Content-Description: ' .
  170.                $this->attatchments_comments[ $current_file ] 
  171.             );
  172.             $this->FpPrint( '' );
  173.             /* Output the mimeencode results */
  174.             $this->FpPrint( chunk_split( base64_encode( $file_contents ) ), 0 );
  175.             }
  176.          } /* End for attatchments */
  177.       }
  178.    }
  179.    Function SMTP_ErrorCheck( $line ) {
  180.       list( $error_number, $message )  = split( ' ', $line );
  181.       switch( $error_number ) {
  182.          case 211:      /* System status, or system help reply */
  183.          case 214:      /* Help message */
  184.          case 220:      /* Service ready */
  185.          case 221:      /* Service closing transmission channel */
  186.          case 250:      /* Requested mail action okay, completed */
  187.          case 251:      /* User not local; will forward */
  188.          case 354:      /* Start mail input; end with . */
  189.             return 1;
  190.             break;
  191.          case 421:      /* Service not avaiable, closing channel */
  192.          case 450:      /* Requested mail action not taken: mailbox unavaiable */
  193.          case 451:      /* Requested action aborted: error in processing */
  194.          case 452:      /* Requested action not taken: insufficient system storage */
  195.          case 500:      /* Syntax error; command not recognized */
  196.          case 501:      /* Syntax error in paramaters or arguments */
  197.          case 502:      /* Command not implemented */
  198.          case 503:      /* Bad sequence of commands */
  199.          case 504:      /* Command parameter not implemented */
  200.          case 550:      /* Requested action not taken: mailbox unavailable */
  201.          case 551:      /* User not local; please try forwarding */
  202.          case 552:      /* Requested mail action aborted: exceeding storage allocation */
  203.          case 553:      /* Requested action not taken: mailbox name not allowed */
  204.          case 554:      /* Transaction failed */
  205.             return 0;
  206.             break;
  207.          default:       /* Unknown response line */
  208.             return 0;
  209.             break;
  210.       }
  211.    }
  212.    Function SMTP_ErrorTrap() {
  213.       $temp_line = $this->net_obj->ReadLine();
  214.       $this->debug->Message( 'RECV: ' . $temp_line );
  215.       if ( ! $this->SMTP_ErrorCheck( $temp_line ) ) {
  216.          return 0;
  217.       }
  218.       return 1;
  219.    }
  220.    Function SendUsingSMTP() {
  221.       $this->net_obj->server = $this->smtp_server;
  222.       $this->net_obj->port   = $this->smtp_port;
  223.       $this->net_obj->Connect();
  224.       if ( $this->net_obj->connected == 0 ) {
  225.          return 0;
  226.       }
  227.       $mail_from = $this->StripMailAddressBare( $this->from );
  228.       list( $username, $domain ) = split( '@', $mail_from );
  229.       $mail_to_arr   = Array();
  230.       $mail_cc_arr   = Array();
  231.       $mail_bcc_arr  = Array();
  232.       $mail_to_arr   = $this->ExplodeAddressList( $this->to );
  233.       $mail_cc_arr   = $this->ExplodeAddressList( $this->cc );
  234.       $mail_bcc_arr  = $this->ExplodeAddressList( $this->bcc );
  235.       /* Check for a vaild helo open for buisness */
  236.       if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  237.       /* Send a helo domain.com */
  238.       $this->FpPrint( 'HELO ' . $domain );
  239.       /* Check for a vaild helo open for buisness */
  240.       if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  241.       /* Send who is sending the message */
  242.       $this->FpPrint( 'MAIL FROM<' . $mail_from . '>' );
  243.       /* Was that okay with the server? */
  244.       if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  245.       /* To */
  246.       for( $i = 0; $i < count( $mail_to_arr ); $i++ ) {
  247.          /* Send a rcpt to address */
  248.          $this->debug->Message( $mail_to_arr[ $i ] );
  249.          $this->FpPrint(
  250.             'RCPT TO:<' . 
  251.                $this->StripMailAddressBare( $mail_to_arr[ $i ] ) . 
  252.             '>'
  253.          );
  254.          /* Was that okay with the server? */
  255.          if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  256.       }
  257.       /* Cc */
  258.       for( $i = 0; $i < count( $mail_cc_arr ); $i++ ) {
  259.          /* Send a rcpt to address */
  260.          $this->debug->Message( $mail_cc_arr[ $i ] );
  261.          $this->FpPrint(
  262.             'RCPT TO:<' . 
  263.                $this->StripMailAddressBare( $mail_cc_arr[ $i ] ) . 
  264.             '>'
  265.          );
  266.          /* Was that okay with the server? */
  267.          if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  268.       }
  269.       /* Bcc */
  270.       for( $i = 0; $i < count( $mail_bcc_arr ); $i++ ) {
  271.          /* Send a rcpt to address */
  272.          $this->debug->Message( $mail_bcc_arr[ $i ] );
  273.          $this->FpPrint(
  274.             'RCPT TO:<' . 
  275.                $this->StripMailAddressBare( $mail_bcc_arr[ $i ] ) . 
  276.             '>'
  277.          );
  278.          /* Was that okay with the server? */
  279.          if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  280.       }
  281.       $this->FpPrint( 'DATA' );
  282.       /* Was that okay with the server? */
  283.       if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  284.       $this->Write_RFC822_Headers( $this->net_obj->connection_handle );
  285.       $this->Write_MessageBody( $this->net_obj->connection_handle );
  286.       $this->FpPrint( '.' );
  287.       /* Was that okay with the server? */
  288.       if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  289.       $this->FpPrint( 'QUIT' );
  290.       /* Was that okay with the server? */
  291.       // if ( ! $this->SMTP_ErrorTrap() ) { return 0; }
  292.       $this->net_obj->Disconnect();
  293.       return 1;
  294.    }
  295.    Function SendUsingSendmail() {
  296.       $this->fp = 0;
  297.       $sendmail_command = Array(
  298.          $this->sendmail_command,
  299.          '-i'
  300.       );
  301.       if ( $this->from != '' ) {
  302.          $mail_from = $this->StripMailAddressBare( $this->from );
  303.          $sendmail_command[] = '-i -f "' . $mail_from . '"';
  304.       }
  305.       $sendmail_command[] = '"' . $this->to . '"';
  306.       $this->fp = popen( join( ' ', $sendmail_command ), 'w');
  307.       /* We failed to open the process */
  308.       if ( $this->fp == 0 ) { return 0; }
  309.       $this->Write_RFC822_Headers();
  310.       $this->Write_MessageBody();
  311.       pclose( $this->fp );
  312.       return 1;
  313.    }
  314. }
  315. ?>