From a20c809796bf143b53488b9d3f7c50728a46ac06 Mon Sep 17 00:00:00 2001 From: rchavik Date: Thu, 4 Feb 2010 09:13:11 +0700 Subject: [PATCH 1/2] EmailComponent: Accept arrays for $to variable (closes #293) --- cake/libs/controller/components/email.php | 37 ++++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/cake/libs/controller/components/email.php b/cake/libs/controller/components/email.php index cbd5acd7b..d96f2811d 100644 --- a/cake/libs/controller/components/email.php +++ b/cake/libs/controller/components/email.php @@ -363,7 +363,7 @@ class EmailComponent extends Object{ */ function reset() { $this->template = null; - $this->to = null; + $this->to = array(); $this->from = null; $this->replyTo = null; $this->return = null; @@ -473,7 +473,11 @@ class EmailComponent extends Object{ */ function __createHeader() { if ($this->delivery == 'smtp') { - $this->__header[] = 'To: ' . $this->__formatAddress($this->to); + if (is_array($this->to)) { + $this->__header[] = 'To: ' . implode(', ', array_map(array($this, '__formatAddress'), $this->to)); + } else { + $this->__header[] = 'To: ' . $this->__formatAddress($this->to); + } } $this->__header[] = 'From: ' . $this->__formatAddress($this->from); @@ -692,10 +696,15 @@ class EmailComponent extends Object{ function __mail() { $header = implode("\n", $this->__header); $message = implode("\n", $this->__message); - if (ini_get('safe_mode')) { - return @mail($this->to, $this->__encode($this->subject), $message, $header); + if (is_array($this->to)) { + $to = implode(', ', array_map(array($this, '__formatAddress'), $this->to)); + } else { + $to = $this->to; } - return @mail($this->to, $this->__encode($this->subject), $message, $header, $this->additionalParams); + if (ini_get('safe_mode')) { + return @mail($to, $this->__encode($this->subject), $message, $header); + } + return @mail($to, $this->__encode($this->subject), $message, $header, $this->additionalParams); } /** @@ -748,8 +757,15 @@ class EmailComponent extends Object{ return false; } - if (!$this->__smtpSend('RCPT TO: ' . $this->__formatAddress($this->to, true))) { - return false; + if (!is_array($this->to)) { + $tos = array($this->to); + } else { + $tos = $this->to; + } + foreach ($tos as $to) { + if (!$this->__smtpSend('RCPT TO: ' . $this->__formatAddress($to, true))) { + return false; + } } foreach ($this->cc as $cc) { @@ -814,12 +830,17 @@ class EmailComponent extends Object{ $message = implode($nl, $this->__message); $fm = '
';
 
+		if (is_array($this->to)) {
+			$to = implode(', ', array_map(array($this, '__formatAddress'), $this->to));
+		} else {
+			$to = $this->to;
+		}
 		if ($this->delivery == 'smtp') {
 			$fm .= sprintf('%s %s%s', 'Host:', $this->smtpOptions['host'], $nl);
 			$fm .= sprintf('%s %s%s', 'Port:', $this->smtpOptions['port'], $nl);
 			$fm .= sprintf('%s %s%s', 'Timeout:', $this->smtpOptions['timeout'], $nl);
 		}
-		$fm .= sprintf('%s %s%s', 'To:', $this->to, $nl);
+		$fm .= sprintf('%s %s%s', 'To:', $to, $nl);
 		$fm .= sprintf('%s %s%s', 'From:', $this->from, $nl);
 		$fm .= sprintf('%s %s%s', 'Subject:', $this->__encode($this->subject), $nl);
 		$fm .= sprintf('%s%3$s%3$s%s', 'Header:', $header, $nl);

From f585630286297452f71f1778fa7f9f6fd9869eca Mon Sep 17 00:00:00 2001
From: rchavik 
Date: Thu, 4 Feb 2010 09:35:33 +0700
Subject: [PATCH 2/2] Test case: EmailComponent $to accepts array (closes 293)

---
 .../libs/controller/components/email.test.php | 52 ++++++++++++++++++-
 1 file changed, 51 insertions(+), 1 deletion(-)

diff --git a/cake/tests/cases/libs/controller/components/email.test.php b/cake/tests/cases/libs/controller/components/email.test.php
index 80b51a3bf..078cfda5b 100644
--- a/cake/tests/cases/libs/controller/components/email.test.php
+++ b/cake/tests/cases/libs/controller/components/email.test.php
@@ -278,6 +278,56 @@ Message:
 
 This is the body of the message
 
+
+TEMPDOC; + $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message')); + $this->assertEqual($this->Controller->Session->read('Message.email.message'), $this->__osFix($expect)); + } + + +/** + * testSmtpSendMultipleTo method + * + * @access public + * @return void + */ + function testSmtpSendMultipleTo() { + if (!$this->skipIf(!fsockopen('localhost', 25), '%s No SMTP server running on localhost')) { + return; + } + $this->Controller->EmailTest->reset(); + $this->Controller->EmailTest->to = array('postmaster@localhost', 'root@localhost'); + $this->Controller->EmailTest->from = 'noreply@example.com'; + $this->Controller->EmailTest->subject = 'Cake SMTP multiple To test'; + $this->Controller->EmailTest->replyTo = 'noreply@example.com'; + $this->Controller->EmailTest->template = null; + + $this->Controller->EmailTest->delivery = 'smtp'; + $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message')); + + $this->Controller->EmailTest->_debug = true; + $this->Controller->EmailTest->sendAs = 'text'; + $expect = <<Host: localhost +Port: 25 +Timeout: 30 +To: postmaster@localhost, root@localhost +From: noreply@example.com +Subject: Cake SMTP multiple To test +Header: + +To: postmaster@localhost, root@localhost +From: noreply@example.com +Reply-To: noreply@example.com +Subject: Cake SMTP multiple To test +X-Mailer: CakePHP Email Component +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bitParameters: + +Message: + +This is the body of the message + TEMPDOC; $this->assertTrue($this->Controller->EmailTest->send('This is the body of the message')); @@ -664,7 +714,7 @@ TEXTBLOC; $this->Controller->EmailTest->reset(); $this->assertNull($this->Controller->EmailTest->template); - $this->assertNull($this->Controller->EmailTest->to); + $this->assertIdentical($this->Controller->EmailTest->to, array()); $this->assertNull($this->Controller->EmailTest->from); $this->assertNull($this->Controller->EmailTest->replyTo); $this->assertNull($this->Controller->EmailTest->return);