summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_test/tests/inc/mailer.test.php46
-rw-r--r--inc/Mailer.class.php31
2 files changed, 66 insertions, 11 deletions
diff --git a/_test/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
index 053e216b8..ef78692b3 100644
--- a/_test/tests/inc/mailer.test.php
+++ b/_test/tests/inc/mailer.test.php
@@ -15,6 +15,11 @@ class TestMailer extends Mailer {
public function prepareHeaders() {
return parent::prepareHeaders();
}
+
+ public function cleanHeaders() {
+ parent::cleanHeaders();
+ }
+
}
class mailer_test extends DokuWikiTest {
@@ -67,6 +72,47 @@ class mailer_test extends DokuWikiTest {
$this->assertArrayNotHasKey('Test-Header',$headers);
}
+ function test_addresses(){
+ $mail = new TestMailer();
+
+ $mail->to('andi@splitbrain.org');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('andi@splitbrain.org', $headers['To']);
+
+ $mail->to('<andi@splitbrain.org>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('andi@splitbrain.org', $headers['To']);
+
+ $mail->to('Andreas Gohr <andi@splitbrain.org>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('Andreas Gohr <andi@splitbrain.org>', $headers['To']);
+
+ $mail->to('Andreas Gohr <andi@splitbrain.org> , foo <foo@example.com>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('Andreas Gohr <andi@splitbrain.org>, foo <foo@example.com>', $headers['To']);
+
+ $mail->to('Möp <moep@example.com> , foo <foo@example.com>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?TcO2cA==?= <moep@example.com>, foo <foo@example.com>', $headers['To']);
+
+ $mail->to(array('Möp <moep@example.com> ',' foo <foo@example.com>'));
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?TcO2cA==?= <moep@example.com>, foo <foo@example.com>', $headers['To']);
+
+ $mail->to(array('Beet, L van <lvb@example.com>',' foo <foo@example.com>'));
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?QmVldCwgTCB2YW4=?= <lvb@example.com>, foo <foo@example.com>', $headers['To']);
+
+
+ }
+
function test_simplemail(){
global $conf;
$conf['htmlmail'] = 0;
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index cb5f22f54..0f3321bb9 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -137,7 +137,13 @@ class Mailer {
}
// empty value deletes
- $value = trim($value);
+ if(is_array($value)){
+ $value = array_map('trim', $value);
+ $value = array_filter($value);
+ if(!$value) $value = '';
+ }else{
+ $value = trim($value);
+ }
if($value === '') {
if(isset($this->headers[$header])) unset($this->headers[$header]);
} else {
@@ -270,7 +276,7 @@ class Mailer {
* Add the To: recipients
*
* @see setAddress
- * @param string $address Multiple adresses separated by commas
+ * @param string|array $address Multiple adresses separated by commas or as array
*/
public function to($address) {
$this->setHeader('To', $address, false);
@@ -280,7 +286,7 @@ class Mailer {
* Add the Cc: recipients
*
* @see setAddress
- * @param string $address Multiple adresses separated by commas
+ * @param string|array $address Multiple adresses separated by commas or as array
*/
public function cc($address) {
$this->setHeader('Cc', $address, false);
@@ -290,7 +296,7 @@ class Mailer {
* Add the Bcc: recipients
*
* @see setAddress
- * @param string $address Multiple adresses separated by commas
+ * @param string|array $address Multiple adresses separated by commas or as array
*/
public function bcc($address) {
$this->setHeader('Bcc', $address, false);
@@ -327,18 +333,20 @@ class Mailer {
* Example:
* setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc");
*
- * @param string $address Multiple adresses separated by commas
+ * @param string|array $address Multiple adresses separated by commas or as array
* @return bool|string the prepared header (can contain multiple lines)
*/
- public function cleanAddress($address) {
+ public function cleanAddress($addresses) {
// No named recipients for To: in Windows (see FS#652)
$names = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? false : true;
- $address = preg_replace('/[\r\n\0]+/', ' ', $address); // remove attack vectors
-
$headers = '';
- $parts = explode(',', $address);
- foreach($parts as $part) {
+ if(!is_array($addresses)){
+ $addresses = explode(',', $addresses);
+ }
+
+ foreach($addresses as $part) {
+ $part = preg_replace('/[\r\n\0]+/', ' ', $part); // remove attack vectors
$part = trim($part);
// parse address
@@ -378,7 +386,7 @@ class Mailer {
$text = utf8_strip($text);
}
- if(!utf8_isASCII($text)) {
+ if(strpos($text, ',') !== false || !utf8_isASCII($text)) {
$text = '=?UTF-8?B?'.base64_encode($text).'?=';
}
} else {
@@ -392,6 +400,7 @@ class Mailer {
$headers .= $text.' '.$addr;
}
+ $headers = trim($headers);
if(empty($headers)) return false;
return $headers;