Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 2718664
Showing
399 changed files
with
61,869 additions
and
0 deletions.
There are no files selected for viewing
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,238 @@ | ||
<?php | ||
// | ||
// +----------------------------------------------------------------------+ | ||
// | PHP Version 4 | | ||
// +----------------------------------------------------------------------+ | ||
// | Copyright (c) 1997-2003 The PHP Group | | ||
// +----------------------------------------------------------------------+ | ||
// | This source file is subject to version 2.02 of the PHP license, | | ||
// | that is bundled with this package in the file LICENSE, and is | | ||
// | available at through the world-wide-web at | | ||
// | http://www.php.net/license/2_02.txt. | | ||
// | If you did not receive a copy of the PHP license and are unable to | | ||
// | obtain it through the world-wide-web, please send a note to | | ||
// | license@php.net so we can mail you a copy immediately. | | ||
// +----------------------------------------------------------------------+ | ||
// | Author: Chuck Hagenbuch <chuck@horde.org> | | ||
// +----------------------------------------------------------------------+ | ||
// | ||
// $Id: Mail.php,v 1.17 2006/09/15 03:41:18 jon Exp $ | ||
|
||
require_once 'PEAR.php'; | ||
|
||
/** | ||
* PEAR's Mail:: interface. Defines the interface for implementing | ||
* mailers under the PEAR hierarchy, and provides supporting functions | ||
* useful in multiple mailer backends. | ||
* | ||
* @access public | ||
* @version $Revision: 1.17 $ | ||
* @package Mail | ||
*/ | ||
class Mail | ||
{ | ||
/** | ||
* Line terminator used for separating header lines. | ||
* @var string | ||
*/ | ||
var $sep = "\r\n"; | ||
|
||
/** | ||
* Provides an interface for generating Mail:: objects of various | ||
* types | ||
* | ||
* @param string $driver The kind of Mail:: object to instantiate. | ||
* @param array $params The parameters to pass to the Mail:: object. | ||
* @return object Mail a instance of the driver class or if fails a PEAR Error | ||
* @access public | ||
*/ | ||
function &factory($driver, $params = array()) | ||
{ | ||
$driver = strtolower($driver); | ||
@include_once 'Mail/' . $driver . '.php'; | ||
$class = 'Mail_' . $driver; | ||
if (class_exists($class)) { | ||
$mailer = new $class($params); | ||
return $mailer; | ||
} else { | ||
return PEAR::raiseError('Unable to find class for driver ' . $driver); | ||
} | ||
} | ||
|
||
/** | ||
* Implements Mail::send() function using php's built-in mail() | ||
* command. | ||
* | ||
* @param mixed $recipients Either a comma-seperated list of recipients | ||
* (RFC822 compliant), or an array of recipients, | ||
* each RFC822 valid. This may contain recipients not | ||
* specified in the headers, for Bcc:, resending | ||
* messages, etc. | ||
* | ||
* @param array $headers The array of headers to send with the mail, in an | ||
* associative array, where the array key is the | ||
* header name (ie, 'Subject'), and the array value | ||
* is the header value (ie, 'test'). The header | ||
* produced from those values would be 'Subject: | ||
* test'. | ||
* | ||
* @param string $body The full text of the message body, including any | ||
* Mime parts, etc. | ||
* | ||
* @return mixed Returns true on success, or a PEAR_Error | ||
* containing a descriptive error message on | ||
* failure. | ||
* @access public | ||
* @deprecated use Mail_mail::send instead | ||
*/ | ||
function send($recipients, $headers, $body) | ||
{ | ||
$this->_sanitizeHeaders($headers); | ||
|
||
// if we're passed an array of recipients, implode it. | ||
if (is_array($recipients)) { | ||
$recipients = implode(', ', $recipients); | ||
} | ||
|
||
// get the Subject out of the headers array so that we can | ||
// pass it as a seperate argument to mail(). | ||
$subject = ''; | ||
if (isset($headers['Subject'])) { | ||
$subject = $headers['Subject']; | ||
unset($headers['Subject']); | ||
} | ||
|
||
// flatten the headers out. | ||
list(,$text_headers) = Mail::prepareHeaders($headers); | ||
|
||
return mail($recipients, $subject, $body, $text_headers); | ||
|
||
} | ||
|
||
/** | ||
* Sanitize an array of mail headers by removing any additional header | ||
* strings present in a legitimate header's value. The goal of this | ||
* filter is to prevent mail injection attacks. | ||
* | ||
* @param array $headers The associative array of headers to sanitize. | ||
* | ||
* @access private | ||
*/ | ||
function _sanitizeHeaders(&$headers) | ||
{ | ||
foreach ($headers as $key => $value) { | ||
$headers[$key] = | ||
preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', | ||
null, $value); | ||
} | ||
} | ||
|
||
/** | ||
* Take an array of mail headers and return a string containing | ||
* text usable in sending a message. | ||
* | ||
* @param array $headers The array of headers to prepare, in an associative | ||
* array, where the array key is the header name (ie, | ||
* 'Subject'), and the array value is the header | ||
* value (ie, 'test'). The header produced from those | ||
* values would be 'Subject: test'. | ||
* | ||
* @return mixed Returns false if it encounters a bad address, | ||
* otherwise returns an array containing two | ||
* elements: Any From: address found in the headers, | ||
* and the plain text version of the headers. | ||
* @access private | ||
*/ | ||
function prepareHeaders($headers) | ||
{ | ||
$lines = array(); | ||
$from = null; | ||
|
||
foreach ($headers as $key => $value) { | ||
if (strcasecmp($key, 'From') === 0) { | ||
include_once 'Mail/RFC822.php'; | ||
$parser = &new Mail_RFC822(); | ||
$addresses = $parser->parseAddressList($value, 'localhost', false); | ||
if (PEAR::isError($addresses)) { | ||
return $addresses; | ||
} | ||
|
||
$from = $addresses[0]->mailbox . '@' . $addresses[0]->host; | ||
|
||
// Reject envelope From: addresses with spaces. | ||
if (strstr($from, ' ')) { | ||
return false; | ||
} | ||
|
||
$lines[] = $key . ': ' . $value; | ||
} elseif (strcasecmp($key, 'Received') === 0) { | ||
$received = array(); | ||
if (is_array($value)) { | ||
foreach ($value as $line) { | ||
$received[] = $key . ': ' . $line; | ||
} | ||
} | ||
else { | ||
$received[] = $key . ': ' . $value; | ||
} | ||
// Put Received: headers at the top. Spam detectors often | ||
// flag messages with Received: headers after the Subject: | ||
// as spam. | ||
$lines = array_merge($received, $lines); | ||
} else { | ||
// If $value is an array (i.e., a list of addresses), convert | ||
// it to a comma-delimited string of its elements (addresses). | ||
if (is_array($value)) { | ||
$value = implode(', ', $value); | ||
} | ||
$lines[] = $key . ': ' . $value; | ||
} | ||
} | ||
|
||
return array($from, join($this->sep, $lines)); | ||
} | ||
|
||
/** | ||
* Take a set of recipients and parse them, returning an array of | ||
* bare addresses (forward paths) that can be passed to sendmail | ||
* or an smtp server with the rcpt to: command. | ||
* | ||
* @param mixed Either a comma-seperated list of recipients | ||
* (RFC822 compliant), or an array of recipients, | ||
* each RFC822 valid. | ||
* | ||
* @return mixed An array of forward paths (bare addresses) or a PEAR_Error | ||
* object if the address list could not be parsed. | ||
* @access private | ||
*/ | ||
function parseRecipients($recipients) | ||
{ | ||
include_once 'Mail/RFC822.php'; | ||
|
||
// if we're passed an array, assume addresses are valid and | ||
// implode them before parsing. | ||
if (is_array($recipients)) { | ||
$recipients = implode(', ', $recipients); | ||
} | ||
|
||
// Parse recipients, leaving out all personal info. This is | ||
// for smtp recipients, etc. All relevant personal information | ||
// should already be in the headers. | ||
$addresses = Mail_RFC822::parseAddressList($recipients, 'localhost', false); | ||
|
||
// If parseAddressList() returned a PEAR_Error object, just return it. | ||
if (PEAR::isError($addresses)) { | ||
return $addresses; | ||
} | ||
|
||
$recipients = array(); | ||
if (is_array($addresses)) { | ||
foreach ($addresses as $ob) { | ||
$recipients[] = $ob->mailbox . '@' . $ob->host; | ||
} | ||
} | ||
|
||
return $recipients; | ||
} | ||
|
||
} |
Oops, something went wrong.