Version 3.4.5

This commit is contained in:
Neo committed 2025-12-19 00:38:12 -08:00
1 parent fb6b5baabc
commit e4478369d8
1360 files changed
+228921 -179445

No files matched your search

+49 -24
View File
@@ -48,7 +48,7 @@
* @author Aleksander Machniak <alec@php.net>
* @copyright 2003-2006 PEAR <pear-group@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version CVS: $Id: mime.php 8229 2011-03-31 10:17:44Z ips_terabyte $
* @version CVS: $Id: mime.php 11977 2013-02-12 11:06:34Z mark $
* @link http://pear.php.net/package/Mail_mime
*
* This class is based on HTML Mime Mail class from
@@ -63,7 +63,7 @@
*
* This package depends on PEAR to raise errors.
*/
require_once 'PEAR.php';/*noLibHook*/
require_once 'PEAR.php';
/**
* require Mail_mimePart
@@ -72,7 +72,7 @@ require_once 'PEAR.php';/*noLibHook*/
* create all the different parts a mail can
* consist of.
*/
require_once 'Mail/mimePart.php';/*noLibHook*/
require_once 'Mail/mimePart.php';
/**
@@ -245,7 +245,7 @@ class Mail_mime
}
} else {
$cont = $this->_file2str($data);
if (PEAR::isError($cont)) {
if ($this->_isError($cont)) {
return $cont;
}
if (!$append) {
@@ -286,7 +286,7 @@ class Mail_mime
$this->_htmlbody = $data;
} else {
$cont = $this->_file2str($data);
if (PEAR::isError($cont)) {
if ($this->_isError($cont)) {
return $cont;
}
$this->_htmlbody = $cont;
@@ -336,7 +336,7 @@ class Mail_mime
$filedata = null;
$bodyfile = $file;
} else {
if (PEAR::isError($filedata = $this->_file2str($file))) {
if ($this->_isError($filedata = $this->_file2str($file))) {
return $filedata;
}
}
@@ -387,6 +387,8 @@ class Mail_mime
* @param string $description Content-Description header
* @param string $h_charset The character set of the headers e.g. filename
* If not specified, $charset will be used
* @param array $add_headers Additional part headers. Array keys can be in form
* of <header_name>:<parameter_name>
*
* @return mixed True on success or PEAR_Error object
* @access public
@@ -403,7 +405,8 @@ class Mail_mime
$n_encoding = null,
$f_encoding = null,
$description = '',
$h_charset = null
$h_charset = null,
$add_headers = array()
) {
$bodyfile = null;
@@ -413,12 +416,12 @@ class Mail_mime
$filedata = null;
$bodyfile = $file;
} else {
if (PEAR::isError($filedata = $this->_file2str($file))) {
if ($this->_isError($filedata = $this->_file2str($file))) {
return $filedata;
}
}
// Force the name the user supplied, otherwise use $file
$filename = ($name ? $name : $file);
$filename = ($name ? $name : $this->_basename($file));
} else {
$filedata = $file;
$filename = $name;
@@ -429,7 +432,6 @@ class Mail_mime
$err = PEAR::raiseError($msg);
return $err;
}
$filename = $this->_basename($filename);
$this->_parts[] = array(
'body' => $filedata,
@@ -442,6 +444,7 @@ class Mail_mime
'location' => $location,
'disposition' => $disposition,
'description' => $description,
'add_headers' => $add_headers,
'name_encoding' => $n_encoding,
'filename_encoding' => $f_encoding,
'headers_charset' => $h_charset,
@@ -458,7 +461,7 @@ class Mail_mime
* @return string Contents of $file_name
* @access private
*/
function &_file2str($file_name)
function _file2str($file_name)
{
// Check state of file and raise an error properly
if (!file_exists($file_name)) {
@@ -497,7 +500,7 @@ class Mail_mime
* @return object The text mimePart object
* @access private
*/
function &_addTextPart(&$obj, $text)
function _addTextPart(&$obj, $text)
{
$params['content_type'] = 'text/plain';
$params['encoding'] = $this->_build_params['text_encoding'];
@@ -523,7 +526,7 @@ class Mail_mime
* @return object The html mimePart object
* @access private
*/
function &_addHtmlPart(&$obj)
function _addHtmlPart(&$obj)
{
$params['content_type'] = 'text/html';
$params['encoding'] = $this->_build_params['html_encoding'];
@@ -547,7 +550,7 @@ class Mail_mime
* @return object The multipart/mixed mimePart object
* @access private
*/
function &_addMixedPart()
function _addMixedPart()
{
$params = array();
$params['content_type'] = 'multipart/mixed';
@@ -569,7 +572,7 @@ class Mail_mime
* @return object The multipart/mixed mimePart object
* @access private
*/
function &_addAlternativePart(&$obj)
function _addAlternativePart(&$obj)
{
$params['content_type'] = 'multipart/alternative';
$params['eol'] = $this->_build_params['eol'];
@@ -593,7 +596,7 @@ class Mail_mime
* @return object The multipart/mixed mimePart object
* @access private
*/
function &_addRelatedPart(&$obj)
function _addRelatedPart(&$obj)
{
$params['content_type'] = 'multipart/related';
$params['eol'] = $this->_build_params['eol'];
@@ -616,7 +619,7 @@ class Mail_mime
* @return object The image mimePart object
* @access private
*/
function &_addHtmlImagePart(&$obj, $value)
function _addHtmlImagePart(&$obj, $value)
{
$params['content_type'] = $value['c_type'];
$params['encoding'] = 'base64';
@@ -647,7 +650,7 @@ class Mail_mime
* @return object The image mimePart object
* @access private
*/
function &_addAttachmentPart(&$obj, $value)
function _addAttachmentPart(&$obj, $value)
{
$params['eol'] = $this->_build_params['eol'];
$params['filename'] = $value['name'];
@@ -680,6 +683,9 @@ class Mail_mime
if (!empty($value['description'])) {
$params['description'] = $value['description'];
}
if (is_array($value['add_headers'])) {
$params['headers'] = $value['add_headers'];
}
$ret = $obj->addSubpart($value['body'], $params);
return $ret;
@@ -712,7 +718,7 @@ class Mail_mime
$body = $this->get($params);
if (PEAR::isError($body)) {
if ($this->_isError($body)) {
return $body;
}
@@ -1013,7 +1019,7 @@ class Mail_mime
if ($filename) {
// Append mimePart message headers and body into file
$headers = $message->encodeToFile($filename, $boundary, $skip_head);
if (PEAR::isError($headers)) {
if ($this->_isError($headers)) {
return $headers;
}
$this->_headers = array_merge($this->_headers, $headers);
@@ -1021,7 +1027,7 @@ class Mail_mime
return $ret;
} else {
$output = $message->encode($boundary, $skip_head);
if (PEAR::isError($output)) {
if ($this->_isError($output)) {
return $output;
}
$this->_headers = array_merge($this->_headers, $output['headers']);
@@ -1142,8 +1148,8 @@ class Mail_mime
? $this->_build_params['eol'] : "\r\n";
// add parameters
$token_regexp = '#([^\x21,\x23-\x27,\x2A,\x2B,\x2D'
. ',\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])#';
$token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
. '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
if (is_array($params)) {
foreach ($params as $name => $value) {
if ($name == 'boundary') {
@@ -1319,7 +1325,8 @@ class Mail_mime
*/
function encodeHeader($name, $value, $charset, $encoding)
{
return Mail_mimePart::encodeHeader(
$mime_part = new Mail_mimePart;
return $mime_part->encodeHeader(
$name, $value, $charset, $encoding, $this->_build_params['eol']
);
}
@@ -1465,4 +1472,22 @@ class Mail_mime
}
}
/**
* PEAR::isError wrapper
*
* @param mixed $data Object
*
* @return bool True if object is an instance of PEAR_Error
* @access private
*/
function _isError($data)
{
// PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
if (is_object($data) && is_a($data, 'PEAR_Error')) {
return true;
}
return false;
}
} // End of class
+1 -1
View File
@@ -52,7 +52,7 @@
* @author Sean Coates <sean@php.net>
* @copyright 2003-2006 PEAR <pear-group@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version CVS: $Id: mimeDecode.php 10914 2012-06-12 14:14:49Z bfarber $
* @version CVS: $Id: mimeDecode.php 10705 2012-05-08 15:35:49Z mark $
* @link http://pear.php.net/package/Mail_mime
*/
+80 -23
View File
@@ -48,7 +48,7 @@
* @author Aleksander Machniak <alec@php.net>
* @copyright 2003-2006 PEAR <pear-group@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version CVS: $Id: mimePart.php 8229 2011-03-31 10:17:44Z ips_terabyte $
* @version CVS: $Id: mimePart.php 11977 2013-02-12 11:06:34Z mark $
* @link http://pear.php.net/package/Mail_mime
*/
@@ -131,6 +131,7 @@ class Mail_mimePart
*/
var $_eol = "\r\n";
/**
* Constructor.
*
@@ -144,7 +145,7 @@ class Mail_mimePart
* charset - Content character set
* cid - Content ID to apply
* disposition - Content disposition, inline or attachment
* dfilename - Filename parameter for content disposition
* filename - Filename parameter for content disposition
* description - Content description
* name_encoding - Encoding of the attachment name (Content-Type)
* By default filenames are encoded using RFC2231
@@ -155,6 +156,8 @@ class Mail_mimePart
* headers_charset - Charset of the headers e.g. filename, description.
* If not set, 'charset' will be used
* eol - End of line sequence. Default: "\r\n"
* headers - Hash array with additional part headers. Array keys can be
* in form of <header_name>:<parameter_name>
* body_file - Location of file with part's body (instead of $body)
*
* @access public
@@ -167,6 +170,11 @@ class Mail_mimePart
$this->_eol = MAIL_MIMEPART_CRLF;
}
// Additional part headers
if (!empty($params['headers']) && is_array($params['headers'])) {
$headers = $params['headers'];
}
foreach ($params as $key => $value) {
switch ($key) {
case 'encoding':
@@ -185,6 +193,11 @@ class Mail_mimePart
case 'body_file':
$this->_body_file = $value;
break;
// for backward compatibility
case 'dfilename':
$params['filename'] = $value;
break;
}
}
@@ -210,13 +223,17 @@ class Mail_mimePart
$params['headers_charset'] = $params['charset'];
}
}
// header values encoding parameters
$h_charset = !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII';
$h_language = !empty($params['language']) ? $params['language'] : null;
$h_encoding = !empty($params['name_encoding']) ? $params['name_encoding'] : null;
if (!empty($params['filename'])) {
$headers['Content-Type'] .= ';' . $this->_eol;
$headers['Content-Type'] .= $this->_buildHeaderParam(
'name', $params['filename'],
!empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII',
!empty($params['language']) ? $params['language'] : null,
!empty($params['name_encoding']) ? $params['name_encoding'] : null
'name', $params['filename'], $h_charset, $h_language, $h_encoding
);
}
@@ -226,23 +243,41 @@ class Mail_mimePart
if (!empty($params['filename'])) {
$headers['Content-Disposition'] .= ';' . $this->_eol;
$headers['Content-Disposition'] .= $this->_buildHeaderParam(
'filename', $params['filename'],
!empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII',
!empty($params['language']) ? $params['language'] : null,
'filename', $params['filename'], $h_charset, $h_language,
!empty($params['filename_encoding']) ? $params['filename_encoding'] : null
);
}
// add attachment size
$size = $this->_body_file ? filesize($this->_body_file) : strlen($body);
if ($size) {
$headers['Content-Disposition'] .= ';' . $this->_eol . ' size=' . $size;
}
}
if (!empty($params['description'])) {
$headers['Content-Description'] = $this->encodeHeader(
'Content-Description', $params['description'],
!empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII',
!empty($params['name_encoding']) ? $params['name_encoding'] : 'quoted-printable',
'Content-Description', $params['description'], $h_charset, $h_encoding,
$this->_eol
);
}
// Search and add existing headers' parameters
foreach ($headers as $key => $value) {
$items = explode(':', $key);
if (count($items) == 2) {
$header = $items[0];
$param = $items[1];
if (isset($headers[$header])) {
$headers[$header] .= ';' . $this->_eol;
}
$headers[$header] .= $this->_buildHeaderParam(
$param, $value, $h_charset, $h_language, $h_encoding
);
unset($headers[$key]);
}
}
// Default encoding
if (!isset($this->_encoding)) {
$this->_encoding = '7bit';
@@ -280,7 +315,7 @@ class Mail_mimePart
for ($i = 0; $i < count($this->_subparts); $i++) {
$encoded['body'] .= '--' . $boundary . $eol;
$tmp = $this->_subparts[$i]->encode();
if (PEAR::isError($tmp)) {
if ($this->_isError($tmp)) {
return $tmp;
}
foreach ($tmp['headers'] as $key => $value) {
@@ -303,7 +338,7 @@ class Mail_mimePart
@ini_set('magic_quotes_runtime', $magic_quote_setting);
}
if (PEAR::isError($body)) {
if ($this->_isError($body)) {
return $body;
}
$encoded['body'] = $body;
@@ -355,7 +390,7 @@ class Mail_mimePart
@ini_set('magic_quotes_runtime', $magic_quote_setting);
}
return PEAR::isError($res) ? $res : $this->_headers;
return $this->_isError($res) ? $res : $this->_headers;
}
/**
@@ -390,7 +425,7 @@ class Mail_mimePart
for ($i = 0; $i < count($this->_subparts); $i++) {
fwrite($fh, $f_eol . '--' . $boundary . $eol);
$res = $this->_subparts[$i]->_encodePartToFile($fh);
if (PEAR::isError($res)) {
if ($this->_isError($res)) {
return $res;
}
$f_eol = $eol;
@@ -405,7 +440,7 @@ class Mail_mimePart
$res = $this->_getEncodedDataFromFile(
$this->_body_file, $this->_encoding, $fh
);
if (PEAR::isError($res)) {
if ($this->_isError($res)) {
return $res;
}
}
@@ -633,8 +668,8 @@ class Mail_mimePart
// RFC 2045:
// value needs encoding if contains non-ASCII chars or is longer than 78 chars
if (!preg_match('#[^\x20-\x7E]#', $value)) {
$token_regexp = '#([^\x21,\x23-\x27,\x2A,\x2B,\x2D'
. ',\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])#';
$token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
. '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
if (!preg_match($token_regexp, $value)) {
// token
if (strlen($name) + strlen($value) + 3 <= $maxLength) {
@@ -656,7 +691,7 @@ class Mail_mimePart
// RFC2231:
$encValue = preg_replace_callback(
'/([^\x21,\x23,\x24,\x26,\x2B,\x2D,\x2E,\x30-\x39,\x41-\x5A,\x5E-\x7E])/',
'/([^\x21\x23\x24\x26\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])/',
array($this, '_encodeReplaceCallback'), $value
);
$value = "$charset'$language'$encValue";
@@ -780,6 +815,7 @@ class Mail_mimePart
'from', 'to', 'cc', 'bcc', 'sender', 'reply-to',
'resent-from', 'resent-to', 'resent-cc', 'resent-bcc',
'resent-sender', 'resent-reply-to',
'mail-reply-to', 'mail-followup-to',
'return-receipt-to', 'disposition-notification-to',
);
$other_headers = array(
@@ -800,6 +836,9 @@ class Mail_mimePart
// Structured header (make sure addr-spec inside is not encoded)
if (!empty($separator)) {
// Simple e-mail address regexp
$email_regexp = '([^\s<]+|("[^\r\n"]+"))@\S+';
$parts = Mail_mimePart::_explodeQuotedString($separator, $value);
$value = '';
@@ -817,12 +856,12 @@ class Mail_mimePart
}
// let's find phrase (name) and/or addr-spec
if (preg_match('/^<\S+@\S+>$/', $part)) {
if (preg_match('/^<' . $email_regexp . '>$/', $part)) {
$value .= $part;
} else if (preg_match('/^\S+@\S+$/', $part)) {
} else if (preg_match('/^' . $email_regexp . '$/', $part)) {
// address without brackets and without name
$value .= $part;
} else if (preg_match('/<*\S+@\S+>*$/', $part, $matches)) {
} else if (preg_match('/<*' . $email_regexp . '>*$/', $part, $matches)) {
// address with name (handle name)
$address = $matches[0];
$word = str_replace($address, '', $part);
@@ -1187,4 +1226,22 @@ class Mail_mimePart
return sprintf('%%%02X', ord($matches[1]));
}
/**
* PEAR::isError wrapper
*
* @param mixed $data Object
*
* @return bool True if object is an instance of PEAR_Error
* @access private
*/
function _isError($data)
{
// PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
if (is_object($data) && is_a($data, 'PEAR_Error')) {
return true;
}
return false;
}
} // End of class