| | |
| | | * @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$ |
| | | * @version 1.8.5 |
| | | * @link http://pear.php.net/package/Mail_mime |
| | | */ |
| | | |
| | |
| | | * @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 Release: @package_version@ |
| | | * @version Release: 1.8.5 |
| | | * @link http://pear.php.net/package/Mail_mime |
| | | */ |
| | | 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 |
| | |
| | | $this->_eol = $params['eol']; |
| | | } else if (defined('MAIL_MIMEPART_CRLF')) { // backward-copat. |
| | | $this->_eol = MAIL_MIMEPART_CRLF; |
| | | } |
| | | |
| | | // Additional part headers |
| | | if (!empty($params['headers']) && is_array($params['headers'])) { |
| | | $headers = $params['headers']; |
| | | } |
| | | |
| | | foreach ($params as $key => $value) { |
| | |
| | | $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 |
| | | ); |
| | | } |
| | | |
| | |
| | | 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 |
| | |
| | | // 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) { |
| | |
| | | |
| | | // 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"; |
| | |
| | | // Structured header (make sure addr-spec inside is not encoded) |
| | | if (!empty($separator)) { |
| | | // Simple e-mail address regexp |
| | | $email_regexp = '(\S+|("[^\r\n"]+"))@\S+'; |
| | | $email_regexp = '([^\s<]+|("[^\r\n"]+"))@\S+'; |
| | | |
| | | $parts = Mail_mimePart::_explodeQuotedString($separator, $value); |
| | | $value = ''; |