Bug #22410 » 14050_cleaning_t3lib_htmlmail.patch
t3lib/class.t3lib_htmlmail.php (revision ) | ||
---|---|---|
<?php
|
||
/***************************************************************
|
||
* Copyright notice
|
||
*
|
||
* (c) 1999-2010 Kasper Sk?rh?j (kasperYYYY@typo3.com)
|
||
* All rights reserved
|
||
*
|
||
* This script is part of the TYPO3 project. The TYPO3 project is
|
||
* free software; you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
* the Free Software Foundation; either version 2 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* The GNU General Public License can be found at
|
||
* http://www.gnu.org/copyleft/gpl.html.
|
||
* A copy is found in the textfile GPL.txt and important notices to the license
|
||
* from the author is found in LICENSE.txt distributed with these scripts.
|
||
*
|
||
*
|
||
* This script is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* This copyright notice MUST APPEAR in all copies of the script!
|
||
***************************************************************/
|
||
* Copyright notice
|
||
*
|
||
* (c) 1999-2010 Kasper Sk?rh?j (kasperYYYY@typo3.com)
|
||
* All rights reserved
|
||
*
|
||
* This script is part of the TYPO3 project. The TYPO3 project is
|
||
* free software; you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
* the Free Software Foundation; either version 2 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* The GNU General Public License can be found at
|
||
* http://www.gnu.org/copyleft/gpl.html.
|
||
* A copy is found in the textfile GPL.txt and important notices to the license
|
||
* from the author is found in LICENSE.txt distributed with these scripts.
|
||
*
|
||
*
|
||
* This script is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* This copyright notice MUST APPEAR in all copies of the script!
|
||
***************************************************************/
|
||
/**
|
||
* HTML mail class
|
||
*
|
||
... | ... | |
*
|
||
*
|
||
* 193: class t3lib_htmlmail
|
||
* 261: function t3lib_htmlmail ()
|
||
* 261: function t3lib_htmlmail ()
|
||
* 268: function start ()
|
||
* 268: function start ()
|
||
* 305: function useQuotedPrintable()
|
||
* 305: function useQuotedPrintable()
|
||
* 315: function useBase64()
|
||
* 315: function useBase64()
|
||
* 326: function use8Bit()
|
||
* 326: function use8Bit()
|
||
* 338: function encodeMsg($content)
|
||
* 338: function encodeMsg($content)
|
||
* 348: function addPlain ($content)
|
||
* 348: function addPlain ($content)
|
||
* 360: function addAttachment($file)
|
||
* 360: function addAttachment($file)
|
||
* 378: function addHTML ($file)
|
||
* 378: function addHTML ($file)
|
||
* 401: function extractHtmlInit($html,$url)
|
||
* 401: function extractHtmlInit($html,$url)
|
||
* 412: function send($recipient)
|
||
* 412: function send($recipient)
|
||
*
|
||
* SECTION: Main functions
|
||
* SECTION: Main functions
|
||
* 441: function setHeaders()
|
||
* 441: function setHeaders()
|
||
* 500: function setRecipient ($recip)
|
||
* 500: function setRecipient ($recip)
|
||
* 518: function getHTMLContentType()
|
||
* 518: function getHTMLContentType()
|
||
* 527: function setContent()
|
||
* 527: function setContent()
|
||
* 554: function constructMixed ($boundary)
|
||
* 554: function constructMixed ($boundary)
|
||
* 593: function constructHTML ($boundary)
|
||
* 593: function constructHTML ($boundary)
|
||
* 617: function constructAlternative($boundary)
|
||
* 617: function constructAlternative($boundary)
|
||
* 638: function constructHTML_media ($boundary)
|
||
* 638: function constructHTML_media ($boundary)
|
||
* 691: function sendTheMail ()
|
||
* 691: function sendTheMail ()
|
||
* 757: function getBoundary()
|
||
* 757: function getBoundary()
|
||
* 769: function setPlain ($content)
|
||
* 769: function setPlain ($content)
|
||
* 780: function setHtml ($content)
|
||
* 780: function setHtml ($content)
|
||
* 791: function add_header($header)
|
||
* 791: function add_header($header)
|
||
* 812: function add_message($string)
|
||
* 812: function add_message($string)
|
||
* 823: function getContent($type)
|
||
* 823: function getContent($type)
|
||
* 832: function preview()
|
||
* 832: function preview()
|
||
*
|
||
* SECTION: Functions for acquiring attachments, HTML, analyzing and so on **
|
||
* SECTION: Functions for acquiring attachments, HTML, analyzing and so on **
|
||
* 860: function fetchHTML($file)
|
||
* 860: function fetchHTML($file)
|
||
* 878: function fetchHTMLMedia()
|
||
* 878: function fetchHTMLMedia()
|
||
* 899: function extractMediaLinks()
|
||
* 899: function extractMediaLinks()
|
||
* 976: function extractHyperLinks()
|
||
* 976: function extractHyperLinks()
|
||
* 1025: function extractFramesInfo()
|
||
* 1025: function extractFramesInfo()
|
||
* 1051: function substMediaNamesInHTML($absolute)
|
||
* 1051: function substMediaNamesInHTML($absolute)
|
||
* 1078: function substHREFsInHTML()
|
||
* 1078: function substHREFsInHTML()
|
||
* 1106: function substHTTPurlsInPlainText($content)
|
||
* 1106: function substHTTPurlsInPlainText($content)
|
||
* 1142: function fixRollOvers()
|
||
* 1142: function fixRollOvers()
|
||
*
|
||
* SECTION: File and URL-functions
|
||
* SECTION: File and URL-functions
|
||
* 1189: function makeBase64($inputstr)
|
||
* 1189: function makeBase64($inputstr)
|
||
* 1200: function getExtendedURL($url)
|
||
* 1200: function getExtendedURL($url)
|
||
* 1222: function addUserPass($url)
|
||
* 1222: function addUserPass($url)
|
||
* 1238: function getURL($url)
|
||
* 1238: function getURL($url)
|
||
* 1250: function getStrippedURL($url)
|
||
* 1250: function getStrippedURL($url)
|
||
* 1271: function getMimeType($url)
|
||
* 1271: function getMimeType($url)
|
||
* 1300: function absRef($ref)
|
||
* 1300: function absRef($ref)
|
||
* 1320: function split_fileref($fileref)
|
||
* 1320: function split_fileref($fileref)
|
||
* 1347: function extParseUrl($path)
|
||
* 1347: function extParseUrl($path)
|
||
* 1362: function tag_regex($tagArray)
|
||
* 1362: function tag_regex($tagArray)
|
||
* 1384: function get_tag_attributes($tag)
|
||
* 1384: function get_tag_attributes($tag)
|
||
* 1426: function quoted_printable($string)
|
||
* 1426: function quoted_printable($string)
|
||
* 1437: function convertName($name)
|
||
* 1437: function convertName($name)
|
||
*
|
||
* TOTAL FUNCTIONS: 49
|
||
* (This index is automatically created/updated by the extension "extdeveval")
|
||
... | ... | |
* NOTES on MIME mail structures:
|
||
*
|
||
* Plain + HTML
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
*
|
||
* Plain + HTML + image
|
||
* multipart/related (m/a, cids)
|
||
* multipart/related (m/a, cids)
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
*
|
||
* multipart/related (m/a, cids)
|
||
* multipart/related (m/a, cids)
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
*
|
||
* plain + attachment
|
||
* multipart/mixed
|
||
* multipart/mixed
|
||
*
|
||
* HTML + Attachment:
|
||
* multipart/mixed (text/html , attachments)
|
||
* multipart/mixed (text/html , attachments)
|
||
*
|
||
* Plain + HTML + Attachments:
|
||
* multipart/mixed (m/a, attachments)
|
||
* multipart/mixed (m/a, attachments)
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
*
|
||
* Plain + HTML + image + attachment
|
||
*
|
||
* Outlook expr.
|
||
* Outlook expr.
|
||
* multipart/mixed (m/r, attachments)
|
||
* multipart/mixed (m/r, attachments)
|
||
* multipart/related (m/a, cids)
|
||
* multipart/related (m/a, cids)
|
||
* multipart/alternative (text, html)
|
||
* multipart/alternative (text, html)
|
||
*
|
||
*
|
||
*
|
||
... | ... | |
* platforms with different line break conventions.
|
||
* For formalists, the syntax of quoted-printable data is described by the following grammar:
|
||
*
|
||
* quoted-printable := ([*(ptext / SPACE / TAB) ptext] ["="] CRLF)
|
||
* quoted-printable := ([*(ptext / SPACE / TAB) ptext] ["="] CRLF)
|
||
* ; Maximum line length of 76 characters excluding CRLF
|
||
* ; Maximum line length of 76 characters excluding CRLF
|
||
*
|
||
* ptext := octet /<any ASCII character except "=", SPACE, or TAB>
|
||
* ptext := octet /<any ASCII character except "=", SPACE, or TAB>
|
||
* ; characters not listed as "mail-safe" in Appendix B
|
||
* ; characters not listed as "mail-safe" in Appendix B
|
||
* ; are also not recommended.
|
||
* ; are also not recommended.
|
||
*
|
||
* octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
|
||
* octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
|
||
* ; octet must be used for characters > 127, =, SPACE, or TAB,
|
||
* ; octet must be used for characters > 127, =, SPACE, or TAB,
|
||
* ; and is recommended for any characters not listed in
|
||
* ; and is recommended for any characters not listed in
|
||
* ; Appendix B as "mail-safe".
|
||
* ; Appendix B as "mail-safe".
|
||
*/
|
||
/**
|
||
* HTML mail class
|
||
... | ... | |
* @package TYPO3
|
||
* @subpackage t3lib
|
||
*/
|
||
class t3lib_htmlmail {
|
||
class t3lib_htmlmail
|
||
{
|
||
// Headerinfo:
|
||
var $recipient = '';
|
||
var $recipient = '';
|
||
var $recipient_copy = ''; // This recipient (or list of...) will also receive the mail. Regard it as a copy.
|
||
var $recipient_copy = ''; // This recipient (or list of...) will also receive the mail. Regard it as a copy.
|
||
var $recipient_blindcopy = ''; // This recipient (or list of...) will also receive the mail as a blind copy. Regard it as a copy.
|
||
var $subject = '';
|
||
var $subject = '';
|
||
var $from_email = '';
|
||
var $from_email = '';
|
||
var $from_name = '';
|
||
var $from_name = '';
|
||
var $replyto_email = '';
|
||
var $replyto_email = '';
|
||
var $replyto_name = '';
|
||
var $replyto_name = '';
|
||
var $organisation = '';
|
||
var $organisation = '';
|
||
var $priority = 3; // 1 = highest, 5 = lowest, 3 = normal
|
||
var $priority = 3; // 1 = highest, 5 = lowest, 3 = normal
|
||
var $mailer = ''; // X-mailer, set to TYPO3 Major.Minor in constructor
|
||
var $mailer = ''; // X-mailer, set to TYPO3 Major.Minor in constructor
|
||
var $alt_base64 = 0;
|
||
var $alt_base64 = 0;
|
||
var $alt_8bit = 0;
|
||
var $alt_8bit = 0;
|
||
var $jumperURL_prefix = ''; // This is a prefix that will be added to all links in the mail. Example: 'http://www.mydomain.com/jump?userid=###FIELD_uid###&url='. if used, anything after url= is urlencoded.
|
||
var $jumperURL_prefix = ''; // This is a prefix that will be added to all links in the mail. Example: 'http://www.mydomain.com/jump?userid=###FIELD_uid###&url='. if used, anything after url= is urlencoded.
|
||
var $jumperURL_useId = 0; // If set, then the array-key of the urls are inserted instead of the url itself. Smart in order to reduce link-length
|
||
var $jumperURL_useId = 0; // If set, then the array-key of the urls are inserted instead of the url itself. Smart in order to reduce link-length
|
||
var $mediaList = ''; // If set, this is a list of the media-files (index-keys to the array) that should be represented in the html-mail
|
||
var $mediaList = ''; // If set, this is a list of the media-files (index-keys to the array) that should be represented in the html-mail
|
||
var $http_password = '';
|
||
var $http_password = '';
|
||
var $http_username = '';
|
||
var $http_username = '';
|
||
var $postfix_version1 = false;
|
||
var $postfix_version1 = FALSE;
|
||
// Internal
|
||
// Internal
|
||
/*
|
||
This is how the $theParts-array is normally looking
|
||
var $theParts = array(
|
||
... | ... | |
var $messageid = '';
|
||
var $returnPath = '';
|
||
var $Xid = '';
|
||
var $dontEncodeHeader = false; // If set, the header will not be encoded
|
||
var $dontEncodeHeader = FALSE; // If set, the header will not be encoded
|
||
var $headers = '';
|
||
var $message = '';
|
||
... | ... | |
var $defaultCharset = 'iso-8859-1';
|
||
/**
|
||
* Constructor. If the configuration variable forceReturnPath is set,
|
||
* calls to mail will be called with a 5th parameter.
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function t3lib_htmlmail() {
|
||
public function t3lib_htmlmail()
|
||
{
|
||
$this->forceReturnPath = $GLOBALS['TYPO3_CONF_VARS']['SYS']['forceReturnPath'];
|
||
$this->mailer = 'TYPO3';
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function start() {
|
||
public function start()
|
||
{
|
||
global $TYPO3_CONF_VARS;
|
||
// Sets the message id
|
||
... | ... | |
$this->charset = $GLOBALS['LANG']->charSet;
|
||
} elseif ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset']) {
|
||
$this->charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'];
|
||
} else {
|
||
} else {
|
||
$this->charset = $this->defaultCharset;
|
||
}
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function useQuotedPrintable() {
|
||
public function useQuotedPrintable()
|
||
{
|
||
$this->plain_text_header = 'Content-Type: text/plain; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: quoted-printable';
|
||
$this->plain_text_header = 'Content-Type: text/plain; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: quoted-printable';
|
||
$this->html_text_header = 'Content-Type: text/html; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: quoted-printable';
|
||
$this->html_text_header = 'Content-Type: text/html; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: quoted-printable';
|
||
}
|
||
/**
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function useBase64() {
|
||
public function useBase64()
|
||
{
|
||
$this->plain_text_header = 'Content-Type: text/plain; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: base64';
|
||
$this->plain_text_header = 'Content-Type: text/plain; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: base64';
|
||
$this->html_text_header = 'Content-Type: text/html; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: base64';
|
||
$this->html_text_header = 'Content-Type: text/html; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: base64';
|
||
$this->alt_base64 = 1;
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function use8Bit() {
|
||
public function use8Bit()
|
||
{
|
||
$this->plain_text_header = 'Content-Type: text/plain; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: 8bit';
|
||
$this->plain_text_header = 'Content-Type: text/plain; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: 8bit';
|
||
$this->html_text_header = 'Content-Type: text/html; charset='.$this->charset.$this->linebreak.'Content-Transfer-Encoding: 8bit';
|
||
$this->html_text_header = 'Content-Type: text/html; charset=' . $this->charset . $this->linebreak . 'Content-Transfer-Encoding: 8bit';
|
||
$this->alt_8bit = 1;
|
||
}
|
||
... | ... | |
* @param string $content the content that will be encoded
|
||
* @return string the encoded content
|
||
*/
|
||
public function encodeMsg($content) {
|
||
public function encodeMsg($content)
|
||
{
|
||
if ($this->alt_base64) {
|
||
return $this->makeBase64($content);
|
||
} elseif ($this->alt_8bit) {
|
||
return $content;
|
||
} else {
|
||
} else {
|
||
return t3lib_div::quoted_printable($content);
|
||
}
|
||
}
|
||
... | ... | |
* @param string $content that will be added
|
||
* @return void
|
||
*/
|
||
public function addPlain($content) {
|
||
public function addPlain($content)
|
||
{
|
||
$content = $this->substHTTPurlsInPlainText($content);
|
||
$this->setPlain($this->encodeMsg($content));
|
||
}
|
||
... | ... | |
* @param string $file: the filename to add
|
||
* @return boolean whether the attachment was added or not
|
||
*/
|
||
public function addAttachment($file) {
|
||
public function addAttachment($file)
|
||
{
|
||
// Fetching the content and the mime-type
|
||
$fileInfo = $this->getExtendedURL($file);
|
||
if ($fileInfo) {
|
||
... | ... | |
$temp = $this->split_fileref($file);
|
||
if ($temp['file']) {
|
||
$fileInfo['filename'] = $temp['file'];
|
||
} elseif (strpos(' '.$fileInfo['content_type'], 'htm')) {
|
||
} elseif (strpos(' ' . $fileInfo['content_type'], 'htm')) {
|
||
$fileInfo['filename'] = 'index.html';
|
||
} else {
|
||
} else {
|
||
$fileInfo['filename'] = 'unknown';
|
||
}
|
||
$this->theParts['attach'][] = $fileInfo;
|
||
return true;
|
||
return TRUE;
|
||
}
|
||
return false;
|
||
return FALSE;
|
||
}
|
||
... | ... | |
* @param string $file: the filename to add
|
||
* @return boolean whether the attachment was added or not
|
||
*/
|
||
public function addHTML($file) {
|
||
public function addHTML($file)
|
||
{
|
||
$status = $this->fetchHTML($file);
|
||
if (!$status) {
|
||
return false;
|
||
return FALSE;
|
||
}
|
||
if ($this->extractFramesInfo()) {
|
||
return 'Document was a frameset. Stopped';
|
||
... | ... | |
$this->extractMediaLinks();
|
||
$this->extractHyperLinks();
|
||
$this->fetchHTMLMedia();
|
||
$this->substMediaNamesInHTML(0); // 0 = relative
|
||
$this->substMediaNamesInHTML(0); // 0 = relative
|
||
$this->substHREFsInHTML();
|
||
$this->setHtml($this->encodeMsg($this->theParts['html']['content']));
|
||
}
|
||
... | ... | |
* @param string $url: will be added to the html "path" part
|
||
* @return void
|
||
*/
|
||
public function extractHtmlInit($html,$url) {
|
||
public function extractHtmlInit($html, $url)
|
||
{
|
||
$this->theParts['html']['content'] = $html;
|
||
$this->theParts['html']['path'] = $url;
|
||
}
|
||
... | ... | |
* @param string $recipient: The recipient the message should be delivered to (if blank, $this->recipient will be used instead)
|
||
* @return boolean Returns whether the mail was sent (successfully accepted for delivery)
|
||
*/
|
||
public function send($recipient) {
|
||
public function send($recipient)
|
||
{
|
||
if ($recipient) {
|
||
$this->recipient = $recipient;
|
||
}
|
||
... | ... | |
}
|
||
/*****************************************
|
||
*
|
||
* Main functions
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function setHeaders() {
|
||
public function setHeaders()
|
||
{
|
||
$this->headers = '';
|
||
// Message_id
|
||
$this->add_header('Message-ID: <'.$this->messageid.'>');
|
||
$this->add_header('Message-ID: <' . $this->messageid . '>');
|
||
// Return path
|
||
if ($this->returnPath) {
|
||
$this->add_header('Return-Path: '.$this->returnPath);
|
||
$this->add_header('Return-Path: ' . $this->returnPath);
|
||
$this->add_header('Errors-To: '.$this->returnPath);
|
||
$this->add_header('Errors-To: ' . $this->returnPath);
|
||
}
|
||
// X-id
|
||
if ($this->Xid) {
|
||
$this->add_header('X-Typo3MID: '.$this->Xid);
|
||
$this->add_header('X-Typo3MID: ' . $this->Xid);
|
||
}
|
||
// From
|
||
if ($this->from_email) {
|
||
if ($this->from_name && !t3lib_div::isBrokenEmailEnvironment()) {
|
||
$this->add_header('From: '.$this->from_name.' <'.$this->from_email.'>');
|
||
$this->add_header('From: ' . $this->from_name . ' <' . $this->from_email . '>');
|
||
} else {
|
||
$this->add_header('From: '.$this->from_email);
|
||
$this->add_header('From: ' . $this->from_email);
|
||
}
|
||
}
|
||
... | ... | |
// Reply
|
||
if ($this->replyto_email) {
|
||
if ($this->replyto_name) {
|
||
$this->add_header('Reply-To: '.$this->replyto_name.' <'.$this->replyto_email.'>');
|
||
$this->add_header('Reply-To: ' . $this->replyto_name . ' <' . $this->replyto_email . '>');
|
||
} else {
|
||
$this->add_header('Reply-To: '.$this->replyto_email);
|
||
$this->add_header('Reply-To: ' . $this->replyto_email);
|
||
}
|
||
}
|
||
// Organization, using american english spelling (organization / organisation) as defined in RFC 1036 / 2076
|
||
... | ... | |
}
|
||
// mailer
|
||
if ($this->mailer) {
|
||
$this->add_header('X-Mailer: '.$this->mailer);
|
||
$this->add_header('X-Mailer: ' . $this->mailer);
|
||
}
|
||
// priority
|
||
if ($this->priority) {
|
||
$this->add_header('X-Priority: '.$this->priority);
|
||
$this->add_header('X-Priority: ' . $this->priority);
|
||
}
|
||
$this->add_header('Mime-Version: 1.0');
|
||
if (!$this->dontEncodeHeader) {
|
||
$enc = $this->alt_base64 ? 'base64' : 'quoted_printable'; // Header must be ASCII, therefore only base64 or quoted_printable are allowed!
|
||
$enc = $this->alt_base64 ? 'base64' : 'quoted_printable'; // Header must be ASCII, therefore only base64 or quoted_printable are allowed!
|
||
// Quote recipient and subject
|
||
$this->recipient = t3lib_div::encodeHeader($this->recipient,$enc,$this->charset);
|
||
$this->recipient = t3lib_div::encodeHeader($this->recipient, $enc, $this->charset);
|
||
$this->subject = t3lib_div::encodeHeader($this->subject,$enc,$this->charset);
|
||
$this->subject = t3lib_div::encodeHeader($this->subject, $enc, $this->charset);
|
||
}
|
||
}
|
||
... | ... | |
* @param mixed $recipient: the recipient(s) to set
|
||
* @return void
|
||
*/
|
||
public function setRecipient($recipient) {
|
||
public function setRecipient($recipient)
|
||
{
|
||
$this->recipient = (is_array($recipient) ? implode(',', $recipient) : $recipient);
|
||
}
|
||
... | ... | |
*
|
||
* @return string the content type
|
||
*/
|
||
public function getHTMLContentType() {
|
||
public function getHTMLContentType()
|
||
{
|
||
return (count($this->theParts['html']['media']) ? 'multipart/related' : 'multipart/alternative');
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function setContent() {
|
||
public function setContent()
|
||
{
|
||
$this->message = '';
|
||
$boundary = $this->getBoundary();
|
||
// Setting up headers
|
||
if (count($this->theParts['attach'])) {
|
||
// Generate (plain/HTML) / attachments
|
||
// Generate (plain/HTML) / attachments
|
||
$this->add_header('Content-Type: multipart/mixed;');
|
||
$this->add_header(' boundary="' . $boundary . '"');
|
||
$this->add_message('This is a multi-part message in MIME format.' . LF);
|
||
$this->constructMixed($boundary);
|
||
} elseif ($this->theParts['html']['content']) {
|
||
// Generate plain/HTML mail
|
||
// Generate plain/HTML mail
|
||
$this->add_header('Content-Type: ' . $this->getHTMLContentType() . ';');
|
||
$this->add_header(' boundary="' . $boundary . '"');
|
||
$this->add_message('This is a multi-part message in MIME format.' . LF);
|
||
$this->constructHTML($boundary);
|
||
} else {
|
||
// Generate plain only
|
||
// Generate plain only
|
||
$this->add_header($this->plain_text_header);
|
||
$this->add_message($this->getContent('plain'));
|
||
}
|
||
... | ... | |
* @param string $boundary: the mail boundary
|
||
* @return void
|
||
*/
|
||
public function constructMixed($boundary) {
|
||
public function constructMixed($boundary)
|
||
{
|
||
$this->add_message('--' . $boundary);
|
||
if ($this->theParts['html']['content']) {
|
||
// HTML and plain is added
|
||
// HTML and plain is added
|
||
$newBoundary = $this->getBoundary();
|
||
$this->add_message('Content-Type: '.$this->getHTMLContentType() . ';');
|
||
$this->add_message('Content-Type: ' . $this->getHTMLContentType() . ';');
|
||
$this->add_message(' boundary="' . $newBoundary . '"');
|
||
$this->add_message('');
|
||
$this->constructHTML($newBoundary);
|
||
} else {
|
||
// Purely plain
|
||
// Purely plain
|
||
$this->add_message($this->plain_text_header);
|
||
$this->add_message('');
|
||
$this->add_message($this->getContent('plain'));
|
||
}
|
||
// attachments are added
|
||
// attachments are added
|
||
if (is_array($this->theParts['attach'])) {
|
||
foreach ($this->theParts['attach'] as $media) {
|
||
$this->add_message('--' . $boundary);
|
||
... | ... | |
* @param string $boundary: the boundary to use
|
||
* @return void
|
||
*/
|
||
public function constructHTML($boundary) {
|
||
public function constructHTML($boundary)
|
||
{
|
||
// If media, then we know, the multipart/related content-type has been set before this function call
|
||
// If media, then we know, the multipart/related content-type has been set before this function call
|
||
if (count($this->theParts['html']['media'])) {
|
||
$this->add_message('--' . $boundary);
|
||
// HTML has media
|
||
// HTML has media
|
||
$newBoundary = $this->getBoundary();
|
||
$this->add_message('Content-Type: multipart/alternative;');
|
||
$this->add_message(' boundary="' . $newBoundary . '"');
|
||
... | ... | |
// Adding the plaintext/html mix, and use $newBoundary
|
||
$this->constructAlternative($newBoundary);
|
||
$this->constructHTML_media($boundary);
|
||
} else {
|
||
} else {
|
||
// if no media, just use the $boundary for adding plaintext/html mix
|
||
// if no media, just use the $boundary for adding plaintext/html mix
|
||
$this->constructAlternative($boundary);
|
||
}
|
||
}
|
||
... | ... | |
* @param string $boundary: the boundary to use
|
||
* @return void
|
||
*/
|
||
public function constructAlternative($boundary) {
|
||
public function constructAlternative($boundary)
|
||
{
|
||
$this->add_message('--'.$boundary);
|
||
$this->add_message('--' . $boundary);
|
||
// plain is added
|
||
$this->add_message($this->plain_text_header);
|
||
... | ... | |
* @param string $boundary: the boundary to use
|
||
* @return void
|
||
*/
|
||
public function constructHTML_media($boundary) {
|
||
public function constructHTML_media($boundary)
|
||
{
|
||
// media is added
|
||
// media is added
|
||
if (is_array($this->theParts['html']['media'])) {
|
||
foreach($this->theParts['html']['media'] as $key => $media) {
|
||
foreach ($this->theParts['html']['media'] as $key => $media) {
|
||
if (!$this->mediaList || t3lib_div::inList($this->mediaList, $key)) {
|
||
$this->add_message('--' . $boundary);
|
||
$this->add_message('Content-Type: ' . $media['ctype']);
|
||
... | ... | |
*
|
||
* @return boolean Returns whether the mail was sent (successfully accepted for delivery)
|
||
*/
|
||
public function sendTheMail() {
|
||
$mailWasSent = false;
|
||
public function sendTheMail()
|
||
{
|
||
$mailWasSent = FALSE;
|
||
// Sending the mail requires the recipient and message to be set.
|
||
if (!trim($this->recipient) || !trim($this->message)) {
|
||
return false;
|
||
return FALSE;
|
||
}
|
||
// On windows the -f flag is not used (specific for Sendmail and Postfix),
|
||
... | ... | |
}
|
||
$recipient = t3lib_div::normalizeMailAddress($this->recipient);
|
||
// If safe mode is on, the fifth parameter to mail is not allowed, so the fix wont work on unix with safe_mode=On
|
||
// If safe mode is on, the fifth parameter to mail is not allowed, so the fix wont work on unix with safe_mode=On
|
||
$returnPathPossible = (!t3lib_utility_PhpOptions::isSafeModeEnabled() && $this->forceReturnPath);
|
||
if ($returnPathPossible) {
|
||
$mailWasSent = t3lib_utility_Mail::mail($recipient,
|
||
$this->subject,
|
||
$this->message,
|
||
$this->headers,
|
||
$returnPath);
|
||
$this->subject,
|
||
$this->message,
|
||
$this->headers,
|
||
$returnPath);
|
||
} else {
|
||
$mailWasSent = t3lib_utility_Mail::mail($recipient,
|
||
$this->subject,
|
||
$this->message,
|
||
$this->headers);
|
||
$this->subject,
|
||
$this->message,
|
||
$this->headers);
|
||
}
|
||
// Auto response
|
||
if ($this->auto_respond_msg) {
|
||
$theParts = explode('/',$this->auto_respond_msg,2);
|
||
$theParts = explode('/', $this->auto_respond_msg, 2);
|
||
$theParts[0] = str_replace('###SUBJECT###', $this->subject, $theParts[0]);
|
||
$theParts[1] = str_replace("/",LF,$theParts[1]);
|
||
$theParts[1] = str_replace("/", LF, $theParts[1]);
|
||
$theParts[1] = str_replace("###MESSAGE###", $this->getContent('plain'), $theParts[1]);
|
||
if ($returnPathPossible) {
|
||
$mailWasSent = t3lib_utility_Mail::mail($this->from_email,
|
||
$theParts[0],
|
||
$theParts[1],
|
||
'From: ' . $recipient,
|
||
$returnPath);
|
||
$theParts[0],
|
||
$theParts[1],
|
||
'From: ' . $recipient,
|
||
$returnPath);
|
||
} else {
|
||
$mailWasSent = t3lib_utility_Mail::mail($this->from_email,
|
||
$theParts[0],
|
||
$theParts[1],
|
||
'From: ' . $recipient);
|
||
$theParts[0],
|
||
$theParts[1],
|
||
'From: ' . $recipient);
|
||
}
|
||
}
|
||
if ($this->returnPath) {
|
||
... | ... | |
*
|
||
* @return string the boundary
|
||
*/
|
||
public function getBoundary() {
|
||
public function getBoundary()
|
||
{
|
||
$this->part++;
|
||
return "----------".uniqid("part_".$this->part."_");
|
||
return "----------" . uniqid("part_" . $this->part . "_");
|
||
}
|
||
... | ... | |
* @param string $content: the plain content
|
||
* @return void
|
||
*/
|
||
public function setPlain($content) {
|
||
public function setPlain($content)
|
||
{
|
||
$this->theParts['plain']['content'] = $content;
|
||
}
|
||
... | ... | |
* @param string $content: the HTML content
|
||
* @return void
|
||
*/
|
||
public function setHtml($content) {
|
||
public function setHtml($content)
|
||
{
|
||
$this->theParts['html']['content'] = $content;
|
||
}
|
||
... | ... | |
* @param string $header: the header in form of "key: value"
|
||
* @return void
|
||
*/
|
||
public function add_header($header) {
|
||
public function add_header($header)
|
||
{
|
||
// Mail headers must be ASCII, therefore we convert the whole header to either base64 or quoted_printable
|
||
if (!$this->dontEncodeHeader && !stristr($header,'Content-Type') && !stristr($header,'Content-Transfer-Encoding')) {
|
||
if (!$this->dontEncodeHeader && !stristr($header, 'Content-Type') && !stristr($header, 'Content-Transfer-Encoding')) {
|
||
// Field tags must not be encoded
|
||
$parts = explode(': ',$header,2);
|
||
$parts = explode(': ', $header, 2);
|
||
if (count($parts) == 2) {
|
||
$enc = $this->alt_base64 ? 'base64' : 'quoted_printable';
|
||
$parts[1] = t3lib_div::encodeHeader($parts[1], $enc, $this->charset);
|
||
... | ... | |
}
|
||
}
|
||
$this->headers .= $header.LF;
|
||
$this->headers .= $header . LF;
|
||
}
|
||
... | ... | |
* @param string $msg: the message to add
|
||
* @return void
|
||
*/
|
||
public function add_message($msg) {
|
||
public function add_message($msg)
|
||
{
|
||
$this->message .= $msg.LF;
|
||
$this->message .= $msg . LF;
|
||
}
|
||
... | ... | |
* @param string $type: the content type, can either plain or html
|
||
* @return void
|
||
*/
|
||
public function getContent($type) {
|
||
public function getContent($type)
|
||
{
|
||
return $this->theParts[$type]['content'];
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function preview() {
|
||
public function preview()
|
||
{
|
||
echo nl2br(htmlspecialchars($this->headers));
|
||
echo "<BR>";
|
||
echo nl2br(htmlspecialchars($this->message));
|
||
}
|
||
/****************************************************
|
||
*
|
||
* Functions for acquiring attachments, HTML, analyzing and so on **
|
||
... | ... | |
* @param string $file: the file to load
|
||
* @return boolean whether the data was fetched or not
|
||
*/
|
||
public function fetchHTML($file) {
|
||
public function fetchHTML($file)
|
||
{
|
||
// Fetches the content of the page
|
||
$this->theParts['html']['content'] = $this->getURL($file);
|
||
if ($this->theParts['html']['content']) {
|
||
$addr = $this->extParseUrl($file);
|
||
$path = ($addr['scheme']) ? $addr['scheme'].'://'.$addr['host'].(($addr['port'])?':'.$addr['port']:'').(($addr['filepath'])?$addr['filepath']:'/') : $addr['filepath'];
|
||
$path = ($addr['scheme']) ? $addr['scheme'] . '://' . $addr['host'] . (($addr['port']) ? ':' . $addr['port'] : '') . (($addr['filepath']) ? $addr['filepath'] : '/') : $addr['filepath'];
|
||
$this->theParts['html']['path'] = $path;
|
||
return true;
|
||
return TRUE;
|
||
} else {
|
||
} else {
|
||
return false;
|
||
return FALSE;
|
||
}
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function fetchHTMLMedia() {
|
||
if (!is_array($this->theParts['html']['media']) || !count($this->theParts['html']['media'])) return;
|
||
public function fetchHTMLMedia()
|
||
{
|
||
if (!is_array($this->theParts['html']['media']) || !count($this->theParts['html']['media'])) {
|
||
return;
|
||
}
|
||
foreach ($this->theParts['html']['media'] as $key => $media) {
|
||
// fetching the content and the mime-type
|
||
$picdata = $this->getExtendedURL($this->theParts['html']['media'][$key]['absRef']);
|
||
if (is_array($picdata)) {
|
||
$this->theParts['html']['media'][$key]['content'] = $picdata['content'];
|
||
$this->theParts['html']['media'][$key]['ctype'] = $picdata['content_type'];
|
||
$this->theParts['html']['media'][$key]['ctype'] = $picdata['content_type'];
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function extractMediaLinks() {
|
||
public function extractMediaLinks()
|
||
{
|
||
$html_code = $this->theParts['html']['content'];
|
||
$attribRegex = $this->tag_regex(array('img','table','td','tr','body','iframe','script','input','embed'));
|
||
$attribRegex = $this->tag_regex(array('img', 'table', 'td', 'tr', 'body', 'iframe', 'script', 'input', 'embed'));
|
||
// split the document by the beginning of the above tags
|
||
$codepieces = preg_split($attribRegex, $html_code);
|
||
... | ... | |
$pieces = count($codepieces);
|
||
$reg = array();
|
||
for ($i = 1; $i < $pieces; $i++) {
|
||
$tag = strtolower(strtok(substr($html_code,$len+1,10),' '));
|
||
$tag = strtolower(strtok(substr($html_code, $len + 1, 10), ' '));
|
||
$len += strlen($tag)+strlen($codepieces[$i])+2;
|
||
$len += strlen($tag) + strlen($codepieces[$i]) + 2;
|
||
$dummy = preg_match('/[^>]*/', $codepieces[$i], $reg);
|
||
$attributes = $this->get_tag_attributes($reg[0]); // Fetches the attributes for the tag
|
||
$attributes = $this->get_tag_attributes($reg[0]); // Fetches the attributes for the tag
|
||
$imageData = array();
|
||
// Finds the src or background attribute
|
||
$imageData['ref'] = ($attributes['src'] ? $attributes['src'] : $attributes['background']);
|
||
if ($imageData['ref']) {
|
||
// find out if the value had quotes around it
|
||
$imageData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $imageData['ref'])-1,1) == '"') ? '"' : '';
|
||
$imageData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $imageData['ref']) - 1, 1) == '"') ? '"' : '';
|
||
// subst_str is the string to look for, when substituting lateron
|
||
$imageData['subst_str'] = $imageData['quotes'].$imageData['ref'].$imageData['quotes'];
|
||
$imageData['subst_str'] = $imageData['quotes'] . $imageData['ref'] . $imageData['quotes'];
|
||
if ($imageData['ref'] && !strstr($this->image_fullpath_list,"|".$imageData["subst_str"]."|")) {
|
||
if ($imageData['ref'] && !strstr($this->image_fullpath_list, "|" . $imageData["subst_str"] . "|")) {
|
||
$this->image_fullpath_list .= "|".$imageData['subst_str']."|";
|
||
$this->image_fullpath_list .= "|" . $imageData['subst_str'] . "|";
|
||
$imageData['absRef'] = $this->absRef($imageData['ref']);
|
||
$imageData['tag'] = $tag;
|
||
$imageData['use_jumpurl'] = $attributes['dmailerping']?1:0;
|
||
$imageData['use_jumpurl'] = $attributes['dmailerping'] ? 1 : 0;
|
||
$this->theParts['html']['media'][] = $imageData;
|
||
}
|
||
}
|
||
... | ... | |
// Finds the src or background attribute
|
||
$imageData['ref'] = $attributes['href'];
|
||
// Finds out if the value had quotes around it
|
||
$imageData['quotes'] = (substr($codepieces[$i],strpos($codepieces[$i], $imageData['ref'])-1,1) == '"') ? '"' : '';
|
||
$imageData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $imageData['ref']) - 1, 1) == '"') ? '"' : '';
|
||
// subst_str is the string to look for, when substituting lateron
|
||
$imageData['subst_str'] = $imageData['quotes'].$imageData['ref'].$imageData['quotes'];
|
||
$imageData['subst_str'] = $imageData['quotes'] . $imageData['ref'] . $imageData['quotes'];
|
||
if ($imageData['ref'] && !strstr($this->image_fullpath_list,"|".$imageData["subst_str"]."|")) {
|
||
if ($imageData['ref'] && !strstr($this->image_fullpath_list, "|" . $imageData["subst_str"] . "|")) {
|
||
$this->image_fullpath_list .= "|".$imageData["subst_str"]."|";
|
||
$this->image_fullpath_list .= "|" . $imageData["subst_str"] . "|";
|
||
$imageData['absRef'] = $this->absRef($imageData["ref"]);
|
||
$this->theParts['html']['media'][] = $imageData;
|
||
}
|
||
... | ... | |
// fixes javascript rollovers
|
||
$codepieces = explode('.src', $html_code);
|
||
$pieces = count($codepieces);
|
||
$expr = '/^[^'.quotemeta('"').quotemeta("'").']*/';
|
||
$expr = '/^[^' . quotemeta('"') . quotemeta("'") . ']*/';
|
||
for($i = 1; $i < $pieces; $i++) {
|
||
for ($i = 1; $i < $pieces; $i++) {
|
||
$temp = $codepieces[$i];
|
||
$temp = trim(str_replace('=','',trim($temp)));
|
||
$temp = trim(str_replace('=', '', trim($temp)));
|
||
preg_match($expr,substr($temp,1,strlen($temp)),$reg);
|
||
preg_match($expr, substr($temp, 1, strlen($temp)), $reg);
|
||
$imageData['ref'] = $reg[0];
|
||
$imageData['quotes'] = substr($temp,0,1);
|
||
$imageData['quotes'] = substr($temp, 0, 1);
|
||
// subst_str is the string to look for, when substituting lateron
|
||
$imageData['subst_str'] = $imageData['quotes'].$imageData['ref'].$imageData['quotes'];
|
||
$imageData['subst_str'] = $imageData['quotes'] . $imageData['ref'] . $imageData['quotes'];
|
||
$theInfo = $this->split_fileref($imageData['ref']);
|
||
switch ($theInfo['fileext']) {
|
||
case 'gif':
|
||
case 'jpeg':
|
||
case 'jpg':
|
||
if ($imageData['ref'] && !strstr($this->image_fullpath_list,"|".$imageData["subst_str"]."|")) {
|
||
if ($imageData['ref'] && !strstr($this->image_fullpath_list, "|" . $imageData["subst_str"] . "|")) {
|
||
$this->image_fullpath_list .= "|".$imageData['subst_str']."|";
|
||
$this->image_fullpath_list .= "|" . $imageData['subst_str'] . "|";
|
||
$imageData['absRef'] = $this->absRef($imageData['ref']);
|
||
$this->theParts['html']['media'][] = $imageData;
|
||
}
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function extractHyperLinks() {
|
||
public function extractHyperLinks()
|
||
{
|
||
$html_code = $this->theParts['html']['content'];
|
||
$attribRegex = $this->tag_regex(array('a','form','area'));
|
||
$attribRegex = $this->tag_regex(array('a', 'form', 'area'));
|
||
$codepieces = preg_split($attribRegex, $html_code); // Splits the document by the beginning of the above tags
|
||
$codepieces = preg_split($attribRegex, $html_code); // Splits the document by the beginning of the above tags
|
||
$len = strlen($codepieces[0]);
|
||
$pieces = count($codepieces);
|
||
for($i = 1; $i < $pieces; $i++) {
|
||
for ($i = 1; $i < $pieces; $i++) {
|
||
$tag = strtolower(strtok(substr($html_code,$len+1,10)," "));
|
||
$tag = strtolower(strtok(substr($html_code, $len + 1, 10), " "));
|
||
$len += strlen($tag) + strlen($codepieces[$i]) + 2;
|
||
$dummy = preg_match('/[^>]*/', $codepieces[$i], $reg);
|
||
... | ... | |
$hrefData['ref'] = ($attributes['href'] ? $attributes['href'] : $hrefData['ref'] = $attributes['action']);
|
||
if ($hrefData['ref']) {
|
||
// Finds out if the value had quotes around it
|
||
$hrefData['quotes'] = (substr($codepieces[$i],strpos($codepieces[$i], $hrefData["ref"])-1,1) == '"') ? '"' : '';
|
||
$hrefData['quotes'] = (substr($codepieces[$i], strpos($codepieces[$i], $hrefData["ref"]) - 1, 1) == '"') ? '"' : '';
|
||
// subst_str is the string to look for, when substituting lateron
|
||
$hrefData['subst_str'] = $hrefData['quotes'].$hrefData['ref'].$hrefData['quotes'];
|
||
$hrefData['subst_str'] = $hrefData['quotes'] . $hrefData['ref'] . $hrefData['quotes'];
|
||
if ($hrefData['ref'] && substr(trim($hrefData['ref']),0,1) != "#" && !strstr($this->href_fullpath_list,"|".$hrefData['subst_str']."|")) {
|
||
if ($hrefData['ref'] && substr(trim($hrefData['ref']), 0, 1) != "#" && !strstr($this->href_fullpath_list, "|" . $hrefData['subst_str'] . "|")) {
|
||
$this->href_fullpath_list .= "|".$hrefData['subst_str']."|";
|
||
$this->href_fullpath_list .= "|" . $hrefData['subst_str'] . "|";
|
||
$hrefData['absRef'] = $this->absRef($hrefData['ref']);
|
||
$hrefData['tag'] = $tag;
|
||
$this->theParts['html']['hrefs'][] = $hrefData;
|
||
... | ... | |
// Extracts TYPO3 specific links made by the openPic() JS function
|
||
$codepieces = explode("onClick=\"openPic('", $html_code);
|
||
$pieces = count($codepieces);
|
||
for($i = 1; $i < $pieces; $i++) {
|
||
for ($i = 1; $i < $pieces; $i++) {
|
||
$showpic_linkArr = explode("'",$codepieces[$i]);
|
||
$showpic_linkArr = explode("'", $codepieces[$i]);
|
||
$hrefData['ref'] = $showpic_linkArr[0];
|
||
if ($hrefData['ref']) {
|
||
$hrefData['quotes'] = "'";
|
||
// subst_str is the string to look for, when substituting lateron
|
||
$hrefData['subst_str'] = $hrefData['quotes'].$hrefData['ref'].$hrefData['quotes'];
|
||
$hrefData['subst_str'] = $hrefData['quotes'] . $hrefData['ref'] . $hrefData['quotes'];
|
||
if ($hrefData['ref'] && !strstr($this->href_fullpath_list,"|".$hrefData['subst_str']."|")) {
|
||
if ($hrefData['ref'] && !strstr($this->href_fullpath_list, "|" . $hrefData['subst_str'] . "|")) {
|
||
$this->href_fullpath_list .= "|".$hrefData['subst_str']."|";
|
||
$this->href_fullpath_list .= "|" . $hrefData['subst_str'] . "|";
|
||
$hrefData['absRef'] = $this->absRef($hrefData['ref']);
|
||
$this->theParts['html']['hrefs'][] = $hrefData;
|
||
}
|
||
... | ... | |
*
|
||
* @return array two-dimensional array with information about each frame
|
||
*/
|
||
public function extractFramesInfo() {
|
||
public function extractFramesInfo()
|
||
{
|
||
$htmlCode = $this->theParts['html']['content'];
|
||
$info = array();
|
||
if (strpos(' '.$htmlCode,'<frame ')) {
|
||
if (strpos(' ' . $htmlCode, '<frame ')) {
|
||
$attribRegex = $this->tag_regex('frame');
|
||
// Splits the document by the beginning of the above tags
|
||
$codepieces = preg_split($attribRegex, $htmlCode, 1000000);
|
||
$pieces = count($codepieces);
|
||
for($i = 1; $i < $pieces; $i++) {
|
||
for ($i = 1; $i < $pieces; $i++) {
|
||
$dummy = preg_match('/[^>]*/', $codepieces[$i], $reg);
|
||
// Fetches the attributes for the tag
|
||
$attributes = $this->get_tag_attributes($reg[0]);
|
||
... | ... | |
* @param boolean $absolute: If true, then the refs are substituted with http:// ref's indstead of Content-ID's (cid).
|
||
* @return void
|
||
*/
|
||
public function substMediaNamesInHTML($absolute) {
|
||
public function substMediaNamesInHTML($absolute)
|
||
{
|
||
if (is_array($this->theParts['html']['media'])) {
|
||
foreach ($this->theParts['html']['media'] as $key => $val) {
|
||
if ($val['use_jumpurl'] && $this->jumperURL_prefix) {
|
||
$subst = $this->jumperURL_prefix.t3lib_div::rawUrlEncodeFP($val['absRef']);
|
||
$subst = $this->jumperURL_prefix . t3lib_div::rawUrlEncodeFP($val['absRef']);
|
||
} else {
|
||
$subst = ($absolute) ? $val['absRef'] : 'cid:part'.$key.'.'.$this->messageid;
|
||
$subst = ($absolute) ? $val['absRef'] : 'cid:part' . $key . '.' . $this->messageid;
|
||
}
|
||
$this->theParts['html']['content'] = str_replace(
|
||
$val['subst_str'],
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function substHREFsInHTML() {
|
||
if (!is_array($this->theParts['html']['hrefs'])) return;
|
||
public function substHREFsInHTML()
|
||
{
|
||
if (!is_array($this->theParts['html']['hrefs'])) {
|
||
return;
|
||
}
|
||
foreach ($this->theParts['html']['hrefs'] as $key => $val) {
|
||
// Form elements cannot use jumpurl!
|
||
if ($this->jumperURL_prefix && $val['tag'] != 'form') {
|
||
if ($this->jumperURL_useId) {
|
||
$substVal = $this->jumperURL_prefix.$key;
|
||
$substVal = $this->jumperURL_prefix . $key;
|
||
} else {
|
||
$substVal = $this->jumperURL_prefix.t3lib_div::rawUrlEncodeFP($val['absRef']);
|
||
$substVal = $this->jumperURL_prefix . t3lib_div::rawUrlEncodeFP($val['absRef']);
|
||
}
|
||
} else {
|
||
$substVal = $val['absRef'];
|
||
... | ... | |
* @param string $content: the content to use to substitute
|
||
* @return string the changed content
|
||
*/
|
||
public function substHTTPurlsInPlainText($content) {
|
||
if (!$this->jumperURL_prefix) return $content;
|
||
public function substHTTPurlsInPlainText($content)
|
||
{
|
||
if (!$this->jumperURL_prefix) {
|
||
return $content;
|
||
}
|
||
$textpieces = explode("http://", $content);
|
||
$pieces = count($textpieces);
|
||
$textstr = $textpieces[0];
|
||
for($i = 1; $i<$pieces; $i++) {
|
||
for ($i = 1; $i < $pieces; $i++) {
|
||
$len = strcspn($textpieces[$i],chr(32).TAB.CRLF);
|
||
$len = strcspn($textpieces[$i], chr(32) . TAB . CRLF);
|
||
if (trim(substr($textstr,-1)) == '' && $len) {
|
||
if (trim(substr($textstr, -1)) == '' && $len) {
|
||
$lastChar = substr($textpieces[$i],$len-1,1);
|
||
$lastChar = substr($textpieces[$i], $len - 1, 1);
|
||
if (!preg_match('/[A-Za-z0-9\/#]/',$lastChar)) {
|
||
if (!preg_match('/[A-Za-z0-9\/#]/', $lastChar)) {
|
||
$len--;
|
||
}
|
||
$parts = array();
|
||
$parts[0] = "http://".substr($textpieces[$i],0,$len);
|
||
$parts[0] = "http://" . substr($textpieces[$i], 0, $len);
|
||
$parts[1] = substr($textpieces[$i],$len);
|
||
$parts[1] = substr($textpieces[$i], $len);
|
||
if ($this->jumperURL_useId) {
|
||
$this->theParts['plain']['link_ids'][$i] = $parts[0];
|
||
$parts[0] = $this->jumperURL_prefix.'-'.$i;
|
||
$parts[0] = $this->jumperURL_prefix . '-' . $i;
|
||
} else {
|
||
$parts[0] = $this->jumperURL_prefix.t3lib_div::rawUrlEncodeFP($parts[0]);
|
||
$parts[0] = $this->jumperURL_prefix . t3lib_div::rawUrlEncodeFP($parts[0]);
|
||
}
|
||
$textstr .= $parts[0].$parts[1];
|
||
$textstr .= $parts[0] . $parts[1];
|
||
} else {
|
||
$textstr .= 'http://'.$textpieces[$i];
|
||
$textstr .= 'http://' . $textpieces[$i];
|
||
}
|
||
}
|
||
return $textstr;
|
||
... | ... | |
*
|
||
* @return void
|
||
*/
|
||
public function fixRollOvers() {
|
||
public function fixRollOvers()
|
||
{
|
||
$newContent = '';
|
||
$items = explode('.src',$this->theParts['html']['content']);
|
||
$items = explode('.src', $this->theParts['html']['content']);
|
||
if (count($items) <= 1) return;
|
||
if (count($items) <= 1) {
|
||
return;
|
||
}
|
||
foreach($items as $key => $part) {
|
||
foreach ($items as $key => $part) {
|
||
$sub = substr($part, 0, 200);
|
||
if (preg_match('/cid:part[^ "\']*/',$sub,$reg)) {
|
||
if (preg_match('/cid:part[^ "\']*/', $sub, $reg)) {
|
||
// The position of the string
|
||
$thePos = strpos($part,$reg[0]);
|
||
$thePos = strpos($part, $reg[0]);
|
||
// Finds the id of the media...
|
||
preg_match('/cid:part([^\.]*).*/',$sub,$reg2);
|
||
preg_match('/cid:part([^\.]*).*/', $sub, $reg2);
|
||
$theSubStr = $this->theParts['html']['media'][intval($reg2[1])]['absRef'];
|
||
if ($thePos && $theSubStr) {
|
||
// ... and substitutes the javaScript rollover image with this instead
|
||
// If the path is NOT and url, the reference is set to nothing
|
||
// ... and substitutes the javaScript rollover image with this instead
|
||
// If the path is NOT and url, the reference is set to nothing
|
||
if (!strpos(' '.$theSubStr, 'http://')) {
|
||
if (!strpos(' ' . $theSubStr, 'http://')) {
|
||
$theSubStr = 'http://';
|
||
}
|
||
$part = substr($part, 0, $thePos) . $theSubStr . substr($part,$thePos+strlen($reg[0]),strlen($part));
|
||
$part = substr($part, 0, $thePos) . $theSubStr . substr($part, $thePos + strlen($reg[0]), strlen($part));
|
||
}
|
||
}
|
||
$newContent .= $part . ((($key+1) != count($items)) ? '.src' : '');
|
||
$newContent .= $part . ((($key + 1) != count($items)) ? '.src' : '');
|
||
}
|
||
$this->theParts['html']['content'] = $newContent;
|
||
}
|
||
/*******************************************
|
||
*
|
||
* File and URL-functions
|
||
... | ... | |
* @param string $inputstr: the string to encode
|
||
* @return string the encoded string
|
||
*/
|
||
public function makeBase64($inputstr) {
|
||
public function makeBase64($inputstr)
|
||
{
|
||
return chunk_split(base64_encode($inputstr));
|
||
}
|
||
... | ... | |
* @param string $url: the URL to get information of
|
||
* @return mixed either false or the array with information
|
||
*/
|
||
public function getExtendedURL($url) {
|
||
public function getExtendedURL($url)
|
||
{
|
||
$res = array();
|
||
$res['content'] = $this->getURL($url);
|
||
if (!$res['content']) return false;
|
||
if (!$res['content']) {
|
||
return FALSE;
|
||
}
|
||
$pathInfo = parse_url($url);
|
||
$fileInfo = $this->split_fileref($pathInfo['path']);
|
||
switch ($fileInfo['fileext']) {
|
||
case 'gif':
|
||
case 'png':
|
||
$res['content_type'] = 'image/'.$fileInfo['fileext'];
|
||
$res['content_type'] = 'image/' . $fileInfo['fileext'];
|
||
break;
|
||
break;
|
||
case 'jpg':
|
||
case 'jpeg':
|
||
$res['content_type'] = 'image/jpeg';
|
||
break;
|
||
break;
|
||
case 'html':
|
||
case 'htm':
|
||
$res['content_type'] = 'text/html';
|
||
break;
|
||
break;
|
||
case 'css':
|
||
$res['content_type'] = 'text/css';
|
||
break;
|
||
break;
|
||
case 'swf':
|
||
$res['content_type'] = 'application/x-shockwave-flash';
|
||
break;
|
||
break;
|
||
default:
|
||
$res['content_type'] = $this->getMimeType($url);
|
||
}
|
||
... | ... | |
* @param string $url: the URL
|
||
* @return string the URL with the added values
|
||
*/
|
||
public function addUserPass($url) {
|
||
public function addUserPass($url)
|
||
{
|
||
$user = $this->http_username;
|
||
$pass = $this->http_password;
|
||
$matches = array();
|
||
if ($user && $pass && preg_match('/^(https?:\/\/)/', $url, $matches)) {
|
||
return $matches[1].$user.':'.$pass.'@'.substr($url,strlen($matches[1]));
|
||
return $matches[1] . $user . ':' . $pass . '@' . substr($url, strlen($matches[1]));
|
||
}
|
||
return $url;
|
||
}
|
||
... | ... | |
* @param string $url: the URL to fetch
|
||
* @return string the content of the URL
|
||
*/
|
||
public function getURL($url) {
|
||
public function getURL($url)
|
||
{
|
||
$url = $this->addUserPass($url);
|
||
return t3lib_div::getURL($url);
|
||
}
|
||
... | ... | |
* @param string $url: the URL to load
|
||
* @return the content
|
||
*/
|
||
public function getStrippedURL($url) {
|
||
public function getStrippedURL($url)
|
||
{
|
||
$content = '';
|
||
if ($fd = fopen($url, "rb")) {
|
||
while (!feof($fd)) {
|
||
... | ... | |
* @param string $url: the url
|
||
* @return string $mimeType: the mime type found in the header
|
||
*/
|
||
public function getMimeType($url) {
|
||
public function getMimeType($url)
|
||
{
|
||
$mimeType = '';
|
||
$headers = trim(t3lib_div::getURL($url, 2));
|
||
if ($headers) {
|
||
... | ... | |
* @param string $ref: address to use
|
||
* @return string the absolute address
|
||
*/
|
||
public function absRef($ref) {
|
||
public function absRef($ref)
|
||
{
|
||
$ref = trim($ref);
|
||
$info = parse_url($ref);
|
||
if ($info['scheme']) {
|
||
return $ref;
|
||
} elseif (preg_match('/^\//',$ref)) {
|
||
} elseif (preg_match('/^\//', $ref)) {
|
||
$addr = parse_url($this->theParts['html']['path']);
|
||
return $addr['scheme'].'://'.$addr['host'].($addr['port']?':'.$addr['port']:'').$ref;
|
||
return $addr['scheme'] . '://' . $addr['host'] . ($addr['port'] ? ':' . $addr['port'] : '') . $ref;
|
||
} else {
|
||
// If the reference is relative, the path is added, in order for us to fetch the content
|
||
// If the reference is relative, the path is added, in order for us to fetch the content
|
||
return $this->theParts['html']['path'] . $ref;
|
||
}
|
||
}
|
||
... | ... | |
* @param string $fileref: the file to use
|
||
* @return array path, filename, filebody, fileext
|
||
*/
|
||
public function split_fileref($fileref) {
|
||
public function split_fileref($fileref)
|
||
{
|
||
$info = array();
|
||
if (preg_match('/(.*\/)(.*)$/', $fileref, $reg)) {
|
||
$info['path'] = $reg[1];
|
||
$info['file'] = $reg[2];
|
||
} else {
|
||
} else {
|
||
$info['path'] = '';
|
||
$info['file'] = $fileref;
|
||
}
|
||
... | ... | |
$info['filebody'] = $reg[1];
|
||
$info['fileext'] = strtolower($reg[2]);
|
||
$info['realFileext'] = $reg[2];
|
||
} else {
|
||
} else {
|
||
$info['filebody'] = $info['file'];
|
||
$info['fileext'] = '';
|
||
}
|
||
... | ... | |
* @param string $path: url to check
|
||
* @return array information about the path / URL
|
||
*/
|
||
public function extParseUrl($path) {
|
||
public function extParseUrl($path)
|
||
{
|
||
$res = parse_url($path);
|
||
preg_match('/(.*\/)([^\/]*)$/', $res['path'], $reg);
|
||
$res['filepath'] = $reg[1];
|
||
... | ... | |
* @param mixed $tagArray: the list of tags (either as array or string if it is one tag)
|
||
* @return string the regular expression
|
||
*/
|
||
public function tag_regex($tags) {
|
||
public function tag_regex($tags)
|
||
{
|
||
$tags = (!is_array($tags) ? array($tags) : $tags);
|
||
$regexp = '/';
|
||
$c = count($tags);
|
||
foreach($tags as $tag) {
|
||
foreach ($tags as $tag) {
|
||
$c--;
|
||
$regexp .= '<' . $tag . '[[:space:]]' . (($c) ? '|' : '');
|
||
}
|
||
... | ... | |
* If an attribute is empty (like OPTION) the value of that key is just empty. Check it with is_set();
|
||
*
|
||
* @param string $tag: is either like this "<TAG OPTION ATTRIB=VALUE>" or
|
||
* this " OPTION ATTRIB=VALUE>" which means you can omit the tag-name
|
||
* this " OPTION ATTRIB=VALUE>" which means you can omit the tag-name
|
||
* @return array array with attributes as keys in lower-case
|
||
*/
|
||
public function get_tag_attributes($tag) {
|
||
public function get_tag_attributes($tag)
|
||
{
|
||
$attributes = array();
|
||
$tag = ltrim(preg_replace('/^<[^ ]*/','',trim($tag)));
|
||
$tag = ltrim(preg_replace('/^<[^ ]*/', '', trim($tag)));
|
||
$tagLen = strlen($tag);
|
||
$safetyCounter = 100;
|
||
// Find attribute
|
||
... | ... | |
$reg = preg_split('/[[:space:]=>]/', $tag, 2);
|
||
$attrib = $reg[0];
|
||
$tag = ltrim(substr($tag,strlen($attrib),$tagLen));
|
||
$tag = ltrim(substr($tag, strlen($attrib), $tagLen));
|
||
if (substr($tag,0,1) == '=') {
|
||
if (substr($tag, 0, 1) == '=') {
|
||
$tag = ltrim(substr($tag,1,$tagLen));
|
||
$tag = ltrim(substr($tag, 1, $tagLen));
|
||
if (substr($tag,0,1) == '"') {
|
||
if (substr($tag, 0, 1) == '"') {
|
||
// Quotes around the value
|
||
$reg = explode('"',substr($tag,1,$tagLen),2);
|
||
$reg = explode('"', substr($tag, 1, $tagLen), 2);
|
||
$tag = ltrim($reg[1]);
|
||
$value = $reg[0];
|
||
} else {
|
||
// No quotes around value
|
||
preg_match('/^([^[:space:]>]*)(.*)/',$tag,$reg);
|
||
preg_match('/^([^[:space:]>]*)(.*)/', $tag, $reg);
|
||
$value = trim($reg[1]);
|
||
$tag = ltrim($reg[2]);
|
||
if (substr($tag,0,1) == '>') {
|
||
if (substr($tag, 0, 1) == '>') {
|
||
$tag = '';
|
||
}
|
||
}
|
||
}
|
||
$attributes[strtolower($attrib)] = $value;
|
||
$safetyCounter--;
|
||
if ($safetyCounter < 0) break;
|
||
if ($safetyCounter < 0) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return $attributes;
|
||
}
|
||
... | ... | |
*
|
||
* @param string Content to encode
|
||
* @return string The QP encoded string
|
||
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
|
||
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
|
||
*/
|
||
public function quoted_printable($string) {
|
||
public function quoted_printable($string)
|
||
{
|
||
t3lib_div::logDeprecatedFunction();
|
||
return t3lib_div::quoted_printable($string, 76);
|
||
... | ... | |
*
|
||
* @param string $name: the name
|
||
* @return string the name
|
||
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
|
||
* @deprecated since TYPO3 4.0, will be removed in TYPO3 4.6
|
||
*/
|
||
public function convertName($name) {
|
||
public function convertName($name)
|
||
{
|
||
t3lib_div::logDeprecatedFunction();
|
||
return $name;
|