Verzeichnisstruktur phpBB-2.0.0


Veröffentlicht
03.04.2002

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

emailer.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 10.52 KiB


 001  <?php
 002  /***************************************************************************
 003                                  emailer.php
 004                               -------------------
 005      begin                : Sunday Aug. 12, 2001
 006      copyright            : (C) 2001 The phpBB Group
 007      email                : support@phpbb.com
 008   
 009      $Id$
 010   
 011  ***************************************************************************/
 012   
 013  /***************************************************************************
 014   *
 015   *   This program is free software; you can redistribute it and/or modify
 016   *   it under the terms of the GNU General Public License as published by
 017   *   the Free Software Foundation; either version 2 of the License, or
 018   *   (at your option) any later version.
 019   *
 020   ***************************************************************************/
 021   
 022  //
 023  // The emailer class has support for attaching files, that isn't implemented
 024  // in the 2.0 release but we can probable find some way of using it in a future
 025  // release
 026  //
 027  class emailer
 028  {
 029      var $msg, $subject, $extra_headers;
 030      var $addresses, $reply_to, $from;
 031      var $use_smtp;
 032   
 033      var $tpl_msg = array();
 034   
 035      function emailer($use_smtp)
 036      {
 037          $this->reset();
 038          $this->use_smtp = $use_smtp;
 039          $this->reply_to = $this->from = '';
 040      }
 041   
 042      // Resets all the data (address, template file, etc etc to default
 043      function reset()
 044      {
 045          $this->addresses = array();
 046          $this->vars = $this->msg = $this->extra_headers = '';
 047      }
 048   
 049      // Sets an email address to send to
 050      function email_address($address)
 051      {
 052          $this->addresses['to'] = trim($address);
 053      }
 054   
 055      function cc($address)
 056      {
 057          $this->addresses['cc'][] = trim($address);
 058      }
 059   
 060      function bcc($address)
 061      {
 062          $this->addresses['bcc'][] = trim($address);
 063      }
 064   
 065      function replyto($address)
 066      {
 067          $this->reply_to = trim($address);
 068      }
 069   
 070      function from($address)
 071      {
 072          $this->from = trim($address);
 073      }
 074   
 075      // set up subject for mail
 076      function set_subject($subject = '')
 077      {
 078          $this->subject = trim(preg_replace('#[\n\r]+#s', '', $subject));
 079      }
 080   
 081      // set up extra mail headers
 082      function extra_headers($headers)
 083      {
 084          $this->extra_headers .= trim($headers) . "\n";
 085      }
 086   
 087      function use_template($template_file, $template_lang = '')
 088      {
 089          global $board_config, $phpbb_root_path;
 090   
 091          if (trim($template_file) == '')
 092          {
 093              message_die(GENERAL_ERROR, 'No template file set', '', __LINE__, __FILE__);
 094          }
 095   
 096          if (trim($template_lang) == '')
 097          {
 098              $template_lang = $board_config['default_lang'];
 099          }
 100   
 101          if (empty($this->tpl_msg[$template_lang . $template_file]))
 102          {
 103              $tpl_file = $phpbb_root_path . 'language/lang_' . $template_lang . '/email/' . $template_file . '.tpl';
 104   
 105              if (!@file_exists(@phpbb_realpath($tpl_file)))
 106              {
 107                  $tpl_file = $phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/email/' . $template_file . '.tpl';
 108   
 109                  if (!@file_exists(@phpbb_realpath($tpl_file)))
 110                  {
 111                      message_die(GENERAL_ERROR, 'Could not find email template file :: ' . $template_file, '', __LINE__, __FILE__);
 112                  }
 113              }
 114   
 115              if (!($fd = @fopen($tpl_file, 'r')))
 116              {
 117                  message_die(GENERAL_ERROR, 'Failed opening template file :: ' . $tpl_file, '', __LINE__, __FILE__);
 118              }
 119   
 120              $this->tpl_msg[$template_lang . $template_file] = fread($fd, filesize($tpl_file));
 121              fclose($fd);
 122          }
 123   
 124          $this->msg = $this->tpl_msg[$template_lang . $template_file];
 125   
 126          return true;
 127      }
 128   
 129      // assign variables
 130      function assign_vars($vars)
 131      {
 132          $this->vars = (empty($this->vars)) ? $vars : $this->vars . $vars;
 133      }
 134   
 135      // Send the mail out to the recipients set previously in var $this->address
 136      function send()
 137      {
 138          global $board_config, $lang, $phpEx, $phpbb_root_path, $db;
 139   
 140          // Escape all quotes, else the eval will fail.
 141          $this->msg = str_replace ("'", "\'", $this->msg);
 142          $this->msg = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "' . $\\1 . '", $this->msg);
 143   
 144          // Set vars
 145          reset ($this->vars);
 146          while (list($key, $val) = each($this->vars)) 
 147          {
 148              $$key = $val;
 149          }
 150   
 151          eval("\$this->msg = '$this->msg';");
 152   
 153          // Clear vars
 154          reset ($this->vars);
 155          while (list($key, $val) = each($this->vars)) 
 156          {
 157              unset($$key);
 158          }
 159   
 160          // We now try and pull a subject from the email body ... if it exists,
 161          // do this here because the subject may contain a variable
 162          $drop_header = '';
 163          $match = array();
 164          if (preg_match('#^(Subject:(.*?))$#m', $this->msg, $match))
 165          {
 166              $this->subject = (trim($match[2]) != '') ? trim($match[2]) : (($this->subject != '') ? $this->subject : 'No Subject');
 167              $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#');
 168          }
 169          else
 170          {
 171              $this->subject = (($this->subject != '') ? $this->subject : 'No Subject');
 172          }
 173   
 174          if (preg_match('#^(Charset:(.*?))$#m', $this->msg, $match))
 175          {
 176              $this->encoding = (trim($match[2]) != '') ? trim($match[2]) : trim($lang['ENCODING']);
 177              $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#');
 178          }
 179          else
 180          {
 181              $this->encoding = trim($lang['ENCODING']);
 182          }
 183   
 184          if ($drop_header != '')
 185          {
 186              $this->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg));
 187          }
 188   
 189          $to = $this->addresses['to'];
 190   
 191          $cc = (count($this->addresses['cc'])) ? implode(', ', $this->addresses['cc']) : '';
 192          $bcc = (count($this->addresses['bcc'])) ? implode(', ', $this->addresses['bcc']) : '';
 193   
 194          // Build header
 195          $this->extra_headers = (($this->reply_to != '') ? "Reply-to: $this->reply_to\n" : '') . (($this->from != '') ? "From: $this->from\n" : "From: " . $board_config['board_email'] . "\n") . "Return-Path: " . $board_config['board_email'] . "\nMessage-ID: <" . md5(uniqid(time())) . "@" . $board_config['server_name'] . ">\nMIME-Version: 1.0\nContent-type: text/plain; charset=" . $this->encoding . "\nContent-transfer-encoding: 8bit\nDate: " . date('r', time()) . "\nX-Priority: 3\nX-MSMail-Priority: Normal\nX-Mailer: PHP\nX-MimeOLE: Produced By phpBB2\n" . $this->extra_headers . (($cc != '') ? "Cc: $cc\n" : '')  . (($bcc != '') ? "Bcc: $bcc\n" : ''); 
 196   
 197          // Send message ... removed $this->encode() from subject for time being
 198          if ( $this->use_smtp )
 199          {
 200              if ( !defined('SMTP_INCLUDED') ) 
 201              {
 202                  include($phpbb_root_path . 'includes/smtp.' . $phpEx);
 203              }
 204   
 205              $result = smtpmail($to, $this->subject, $this->msg, $this->extra_headers);
 206          }
 207          else
 208          {
 209              $empty_to_header = ($to == '') ? TRUE : FALSE;
 210              $to = ($to == '') ? (($board_config['sendmail_fix']) ? ' ' : 'Undisclosed-recipients:;') : $to;
 211      
 212              $result = @mail($to, $this->subject, preg_replace("#(?<!\r)\n#s", "\n", $this->msg), $this->extra_headers);
 213              
 214              if (!$result && !$board_config['sendmail_fix'] && $empty_to_header)
 215              {
 216                  $to = ' ';
 217   
 218                  $sql = "UPDATE " . CONFIG_TABLE . " 
 219                      SET config_value = '1'
 220                      WHERE config_name = 'sendmail_fix'";
 221                  if (!$db->sql_query($sql))
 222                  {
 223                      message_die(GENERAL_ERROR, 'Unable to update config table', '', __LINE__, __FILE__, $sql);
 224                  }
 225   
 226                  $board_config['sendmail_fix'] = 1;
 227                  $result = @mail($to, $this->subject, preg_replace("#(?<!\r)\n#s", "\n", $this->msg), $this->extra_headers);
 228              }
 229          }
 230   
 231          // Did it work?
 232          if (!$result)
 233          {
 234              message_die(GENERAL_ERROR, 'Failed sending email :: ' . (($this->use_smtp) ? 'SMTP' : 'PHP') . ' :: ' . $result, '', __LINE__, __FILE__);
 235          }
 236   
 237          return true;
 238      }
 239   
 240      // Encodes the given string for proper display for this encoding ... nabbed 
 241      // from php.net and modified. There is an alternative encoding method which 
 242      // may produce lesd output but it's questionable as to its worth in this 
 243      // scenario IMO
 244      function encode($str)
 245      {
 246          if ($this->encoding == '')
 247          {
 248              return $str;
 249          }
 250   
 251          // define start delimimter, end delimiter and spacer
 252          $end = "?=";
 253          $start = "=?$this->encoding?B?";
 254          $spacer = "$end\r\n $start";
 255   
 256          // determine length of encoded text within chunks and ensure length is even
 257          $length = 75 - strlen($start) - strlen($end);
 258          $length = floor($length / 2) * 2;
 259   
 260          // encode the string and split it into chunks with spacers after each chunk
 261          $str = chunk_split(base64_encode($str), $length, $spacer);
 262   
 263          // remove trailing spacer and add start and end delimiters
 264          $str = preg_replace('#' . preg_quote($spacer, '#') . '$#', '', $str);
 265   
 266          return $start . $str . $end;
 267      }
 268   
 269      //
 270      // Attach files via MIME.
 271      //
 272      function attachFile($filename, $mimetype = "application/octet-stream", $szFromAddress, $szFilenameToDisplay)
 273      {
 274          global $lang;
 275          $mime_boundary = "--==================_846811060==_";
 276   
 277          $this->msg = '--' . $mime_boundary . "\nContent-Type: text/plain;\n\tcharset=\"" . $lang['ENCODING'] . "\"\n\n" . $this->msg;
 278   
 279          if ($mime_filename)
 280          {
 281              $filename = $mime_filename;
 282              $encoded = $this->encode_file($filename);
 283          }
 284   
 285          $fd = fopen($filename, "r");
 286          $contents = fread($fd, filesize($filename));
 287   
 288          $this->mimeOut = "--" . $mime_boundary . "\n";
 289          $this->mimeOut .= "Content-Type: " . $mimetype . ";\n\tname=\"$szFilenameToDisplay\"\n";
 290          $this->mimeOut .= "Content-Transfer-Encoding: quoted-printable\n";
 291          $this->mimeOut .= "Content-Disposition: attachment;\n\tfilename=\"$szFilenameToDisplay\"\n\n";
 292   
 293          if ( $mimetype == "message/rfc822" )
 294          {
 295              $this->mimeOut .= "From: ".$szFromAddress."\n";
 296              $this->mimeOut .= "To: ".$this->emailAddress."\n";
 297              $this->mimeOut .= "Date: ".date("D, d M Y H:i:s") . " UT\n";
 298              $this->mimeOut .= "Reply-To:".$szFromAddress."\n";
 299              $this->mimeOut .= "Subject: ".$this->mailSubject."\n";
 300              $this->mimeOut .= "X-Mailer: PHP/".phpversion()."\n";
 301              $this->mimeOut .= "MIME-Version: 1.0\n";
 302          }
 303   
 304          $this->mimeOut .= $contents."\n";
 305          $this->mimeOut .= "--" . $mime_boundary . "--" . "\n";
 306   
 307          return $out;
 308          // added -- to notify email client attachment is done
 309      }
 310   
 311      function getMimeHeaders($filename, $mime_filename="")
 312      {
 313          $mime_boundary = "--==================_846811060==_";
 314   
 315          if ($mime_filename)
 316          {
 317              $filename = $mime_filename;
 318          }
 319   
 320          $out = "MIME-Version: 1.0\n";
 321          $out .= "Content-Type: multipart/mixed;\n\tboundary=\"$mime_boundary\"\n\n";
 322          $out .= "This message is in MIME format. Since your mail reader does not understand\n";
 323          $out .= "this format, some or all of this message may not be legible.";
 324   
 325          return $out;
 326      }
 327   
 328      //
 329     // Split string by RFC 2045 semantics (76 chars per line, end with \r\n).
 330      //
 331      function myChunkSplit($str)
 332      {
 333          $stmp = $str;
 334          $len = strlen($stmp);
 335          $out = "";
 336   
 337          while ($len > 0)
 338          {
 339              if ($len >= 76)
 340              {
 341                  $out .= substr($stmp, 0, 76) . "\r\n";
 342                  $stmp = substr($stmp, 76);
 343                  $len = $len - 76;
 344              }
 345              else
 346              {
 347                  $out .= $stmp . "\r\n";
 348                  $stmp = "";
 349                  $len = 0;
 350              }
 351          }
 352          return $out;
 353      }
 354   
 355      //
 356     // Split the specified file up into a string and return it
 357      //
 358      function encode_file($sourcefile)
 359      {
 360          if (is_readable(phpbb_realpath($sourcefile)))
 361          {
 362              $fd = fopen($sourcefile, "r");
 363              $contents = fread($fd, filesize($sourcefile));
 364            $encoded = $this->myChunkSplit(base64_encode($contents));
 365            fclose($fd);
 366          }
 367   
 368          return $encoded;
 369      }
 370   
 371  } // class emailer
 372   
 373  ?>