From dd89cf84f7fe339f20843961d34a1c086a367e74 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 26 Nov 2014 14:08:52 +0000 Subject: [PATCH] parseFileIntoMailObject and parseRawMessageIntoMailObject using new egw_mailer --- mail/inc/class.mail_ui.inc.php | 6 +- phpgwapi/inc/class.egw_mailer.inc.php | 137 +++++++++++++++++++++++--- 2 files changed, 124 insertions(+), 19 deletions(-) diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php index fcd60a95a3..8b3c4ae0d9 100644 --- a/mail/inc/class.mail_ui.inc.php +++ b/mail/inc/class.mail_ui.inc.php @@ -3271,7 +3271,7 @@ class mail_ui $Body = ''; try { - $this->mail_bo->parseFileIntoMailObject($mailObject,$tmpFileName,$Header,$Body); + $this->mail_bo->parseFileIntoMailObject($mailObject, $tmpFileName); } catch (egw_exception_assertion_failed $e) { @@ -3292,8 +3292,8 @@ class mail_ui try { $messageUid = $this->mail_bo->appendMessage($_folder, - $Header.$mailObject->LE.$mailObject->LE, - $Body,'\\Seen'); + $mailObject->getRaw(), + null,'\\Seen'); } catch (egw_exception_wrong_userinput $e) { diff --git a/phpgwapi/inc/class.egw_mailer.inc.php b/phpgwapi/inc/class.egw_mailer.inc.php index 74ce927cdb..d7abdc55a7 100644 --- a/phpgwapi/inc/class.egw_mailer.inc.php +++ b/phpgwapi/inc/class.egw_mailer.inc.php @@ -37,6 +37,17 @@ class egw_mailer extends Horde_Mime_Mail protected $cc; protected $bcc; protected $replyto; + /** + * Translates between interal Horde_Mail_Rfc822_List attributes and header names + * + * @var array + */ + static $type2header = array( + 'to' => 'To', + 'cc' => 'Cc', + 'bcc' => 'Bcc', + 'replyto' => 'Reply-To', + ); /** * Constructor: always throw exceptions instead of echoing errors and EGw pathes @@ -55,21 +66,21 @@ class egw_mailer extends Horde_Mime_Mail $this->is_html = false; - $this->clearAddresses(); + $this->clearAllRecipients(); + $this->clearReplyTos(); $this->clearParts(); } /** - * Clear all addresses + * Clear all recipients: to, cc, bcc (but NOT reply-to!) */ - function clearAddresses() + function clearAllRecipients() { // clear all addresses - $this->to = new Horde_Mail_Rfc822_List(); - $this->cc = new Horde_Mail_Rfc822_List(); - $this->bcc = new Horde_Mail_Rfc822_List(); - $this->replyto = new Horde_Mail_Rfc822_List(); + $this->clearAddresses(); + $this->clearCCs(); + $this->clearBCCs(); } /** @@ -122,13 +133,7 @@ class egw_mailer extends Horde_Mime_Mail */ function addAddress($address, $personal='', $type='to') { - static $type2header = array( - 'to' => 'To', - 'cc' => 'Cc', - 'bcc' => 'Bcc', - 'replyto' => 'Reply-To', - ); - if (!isset($type2header[$type])) + if (!isset(self::$type2header[$type])) { throw new egw_exception_wrong_parameter("Unknown type '$type'!"); } @@ -138,7 +143,19 @@ class egw_mailer extends Horde_Mime_Mail $this->$type->add($address); // add as header - $this->addHeader($type2header[$type], $this->$type, true); + $this->addHeader(self::$type2header[$type], $this->$type, true); + } + + /** + * Remove all addresses from To, Cc, Bcc or Reply-To + * + * @param string $type ='to' type of address to add "to", "cc", "bcc" or "replyto" + */ + function clearAddresses($type='to') + { + $this->$type = new Horde_Mail_Rfc822_List(); + + $this->removeHeader(self::$type2header[$type]); } /** @@ -191,6 +208,14 @@ class egw_mailer extends Horde_Mime_Mail $this->AddAddress($address, $personal, 'cc'); } + /** + * Clear all cc + */ + function clearCCs() + { + $this->clearAddresses('cc'); + } + /** * Add one or multiple addresses to Bcc * @@ -202,6 +227,14 @@ class egw_mailer extends Horde_Mime_Mail $this->AddAddress($address, $personal, 'bcc'); } + /** + * Clear all bcc + */ + function clearBCCs() + { + $this->clearAddresses('bcc'); + } + /** * Add one or multiple addresses to Reply-To * @@ -213,6 +246,24 @@ class egw_mailer extends Horde_Mime_Mail $this->AddAddress($address, $personal, 'replyto'); } + /** + * Clear all reply-to + */ + function clearReplyTos() + { + $this->clearAddresses('replyto'); + } + + /** + * Get set ReplyTo addressses + * + * @return Horde_Mail_Rfc822_List supporting arrayAccess and Iterable + */ + function getReplyTo() + { + return $this->replyto; + } + /** * Adds an attachment * @@ -349,7 +400,57 @@ class egw_mailer extends Horde_Mime_Mail unset($e); parent::send(new Horde_Mail_Transport_Null(), true); // true: keep Message-ID } - return parent::getRaw($stream); + // code copied from Horde_Mime_Mail, as there is no way to inject charset in _headers->toString() + // which is required to encode headers containing non-ascii chars correct + if ($stream) { + $hdr = new Horde_Stream(); + $hdr->add($this->_headers->toString(array('charset' => 'utf-8')), true); + return Horde_Stream_Wrapper_Combine::getStream( + array($hdr->stream, + $this->getBasePart()->toString( + array('stream' => true, 'encode' => Horde_Mime_Part::ENCODE_7BIT | Horde_Mime_Part::ENCODE_8BIT | Horde_Mime_Part::ENCODE_BINARY)) + ) + ); + } + + return $this->_headers->toString(array('charset' => 'utf-8')) . $this->getBasePart()->toString(); + } + + /** + * Find body: 1. part with mimetype "text/$subtype" + * + * Use getContents() on non-null return-value to get string content + * + * @param string $subtype =null + * @return Horde_Mime_Part part with body or null + */ + function findBody($subtype=null) + { + try { + $base = $this->getBasePart(); + return $base->findBody($subtype); + } + catch (Exception $e) { + unset($e); + return $subtype == 'html' ? $this->_htmlBody : $this->_body; + } + } + + /** + * Clear all non-standard headers + * + * Used in merge-print to remove headers before sending "new" mail + */ + function ClearCustomHeaders() + { + foreach($this->_headers->toArray() as $header => $value) + { + if (stripos($header, 'x-') === 0 || $header == 'Received') + { + $this->_headers->removeHeader($header); + } + unset($value); + } } /** @@ -547,6 +648,10 @@ class egw_mailer extends Horde_Mime_Mail return $this->getHeader('Return-Path'); case 'From': return $this->getHeader('From'); + case 'Body': + case 'AltBody': + $body = $this->findBody($name == 'Body' ? 'plain' : 'html'); + return $body ? $body->getContents() : null; } error_log(__METHOD__."('$name') unsupported attribute '$name' --> returning NULL"); return null;