From 6be717dbb579e1cc7e2fbb82d7ddade3e5892c47 Mon Sep 17 00:00:00 2001
From: Michael Hamann <michael@content-space.de>
Date: Sun, 1 Dec 2013 21:25:29 +0100
Subject: [PATCH] Fix sending empty and duplicated headers, FS#2887

This fixes sending empty and duplicated To/Cc/Bcc, Subject and From
headers in the additional headers. The To-header in the additional
headers prevented mail sending on some systems.
---
 _test/tests/inc/mailer.test.php | 14 +++++++++++++-
 inc/Mailer.class.php            | 10 +++++-----
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/_test/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
index bac0c39ba..4541d9906 100644
--- a/_test/tests/inc/mailer.test.php
+++ b/_test/tests/inc/mailer.test.php
@@ -154,7 +154,19 @@ class mailer_test extends DokuWikiTest {
         $headers['Cc'] = '';
         $header = $mail->prepareHeaders();
         $this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.');
-        $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Bcc found in headers.');
+        $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Cc found in headers.');
+    }
+
+    function test_nullTOorCCorBCC() {
+        $mail = new TestMailer();
+        $headers = &$mail->propRef('headers');
+        $headers['Bcc'] = NULL;
+        $headers['Cc'] = NULL;
+        $headers['To'] = NULL;
+        $header = $mail->prepareHeaders();
+        $this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.');
+        $this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Cc found in headers.');
+        $this->assertEquals(0, preg_match('/(^|\n)To: (\n|$)/', $header), 'To found in headers.');
     }
 
     /**
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index 186bd531a..2ac2c1d60 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -576,7 +576,7 @@ class Mailer {
     protected function prepareHeaders() {
         $headers = '';
         foreach($this->headers as $key => $val) {
-            if ($val === '') continue;
+            if ($val === '' || is_null($val)) continue;
             $headers .= $this->wrappedHeaderLine($key, $val);
         }
         return $headers;
@@ -640,16 +640,16 @@ class Mailer {
             ) return false;
 
             // The To: header is special
-            if(isset($this->headers['To'])) {
-                $to = $this->headers['To'];
+            if(array_key_exists('To', $this->headers)) {
+                $to = (string)$this->headers['To'];
                 unset($this->headers['To']);
             } else {
                 $to = '';
             }
 
             // so is the subject
-            if(isset($this->headers['Subject'])) {
-                $subject = $this->headers['Subject'];
+            if(array_key_exists('Subject', $this->headers)) {
+                $subject = (string)$this->headers['Subject'];
                 unset($this->headers['Subject']);
             } else {
                 $subject = '';
-- 
GitLab