]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/Emailer.php
Merge pull request #13161 from annando/bluesky-activities
[friendica.git] / src / Util / Emailer.php
index 717366248f7a9f11e332c345809c99612cbd8f5c..5e4d98d4c9e83e18ca46ebac609dd7e7d1b76658 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
 namespace Friendica\Util;
 
 use Friendica\App;
-use Friendica\Core\Config\IConfig;
+use Friendica\Core\Config\Capability\IManageConfigValues;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
-use Friendica\Core\PConfig\IPConfig;
+use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Object\EMail\IEmail;
 use Friendica\Protocol\Email;
@@ -38,9 +38,9 @@ use Psr\Log\LoggerInterface;
  */
 class Emailer
 {
-       /** @var IConfig */
+       /** @var IManageConfigValues */
        private $config;
-       /** @var IPConfig */
+       /** @var IManagePersonalConfigValues */
        private $pConfig;
        /** @var LoggerInterface */
        private $logger;
@@ -54,7 +54,7 @@ class Emailer
        /** @var string */
        private $siteEmailName;
 
-       public function __construct(IConfig $config, IPConfig $pConfig, App\BaseURL $baseURL, LoggerInterface $logger,
+       public function __construct(IManageConfigValues $config, IManagePersonalConfigValues $pConfig, App\BaseURL $baseURL, LoggerInterface $logger,
                                    L10n $defaultLang)
        {
                $this->config      = $config;
@@ -65,7 +65,7 @@ class Emailer
 
                $this->siteEmailAddress = $this->config->get('config', 'sender_email');
                if (empty($this->siteEmailAddress)) {
-                       $hostname = $this->baseUrl->getHostname();
+                       $hostname = $this->baseUrl->getHost();
                        if (strpos($hostname, ':')) {
                                $hostname = substr($hostname, 0, strpos($hostname, ':'));
                        }
@@ -134,6 +134,17 @@ class Emailer
                        return true;
                }
 
+               // @see https://github.com/friendica/friendica/issues/9142
+               $countMessageId = 0;
+               foreach ($email->getAdditionalMailHeader() as $name => $value) {
+                       if (strtolower($name) == 'message-id') {
+                               $countMessageId += count($value);
+                       }
+               }
+               if ($countMessageId > 1) {
+                       $this->logger->warning('More than one Message-ID found - RFC violation', ['email' => $email]);
+               }
+
                $email_textonly = false;
                if (!empty($email->getRecipientUid())) {
                        $email_textonly = $this->pConfig->get($email->getRecipientUid(), 'system', 'email_textonly');
@@ -151,10 +162,10 @@ class Emailer
                                . rand(10000, 99999);
 
                // generate a multipart/alternative message header
-               $messageHeader = $email->getAdditionalMailHeader() .
-                                "From: $fromName <{$fromAddress}>\n" .
-                                "Reply-To: $fromName <{$replyTo}>\n" .
-                                "MIME-Version: 1.0\n" .
+               $messageHeader = $email->getAdditionalMailHeaderString() .
+                                "From: $fromName <{$fromAddress}>\r\n" .
+                                "Reply-To: $fromName <{$replyTo}>\r\n" .
+                                "MIME-Version: 1.0\r\n" .
                                 "Content-Type: multipart/alternative; boundary=\"{$mimeBoundary}\"";
 
                // assemble the final multipart message body with the text and html types included
@@ -197,15 +208,34 @@ class Emailer
                        return true;
                }
 
-               $res = mail(
+               $res = $this->mail(
                        $hookdata['to'],
                        $hookdata['subject'],
                        $hookdata['body'],
                        $hookdata['headers'],
                        $hookdata['parameters']
                );
+
                $this->logger->debug('header ' . 'To: ' . $email->getToAddress() . '\n' . $messageHeader);
                $this->logger->debug('return value ' . (($res) ? 'true' : 'false'));
+
                return $res;
        }
+
+       /**
+        * Wrapper around the mail() method (mainly used to overwrite for tests)
+        * @see mail()
+        *
+        * @param string $to         Recipient of this mail
+        * @param string $subject    Subject of this mail
+        * @param string $body       Message body of this mail
+        * @param string $headers    Headers of this mail
+        * @param string $parameters Additional (sendmail) parameters of this mail
+        *
+        * @return boolean true if the mail was successfully accepted for delivery, false otherwise.
+        */
+       protected function mail(string $to, string $subject, string $body, string $headers, string $parameters)
+       {
+               return mail($to, $subject, $body, $headers, $parameters);
+       }
 }