aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Mail
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@owncloud.com>2016-04-20 12:49:23 +0200
committerRoeland Jago Douma <rullzer@owncloud.com>2016-04-20 12:49:23 +0200
commitbc4185a6fe3a91ae43a6a15ba73d913684c76fc7 (patch)
treef6aa86db1d7697436b5084a2bae58fb7eabc13fb /lib/private/Mail
parent34b753baa086c5e4957673f2dc78379fabc5c854 (diff)
downloadnextcloud-server-bc4185a6fe3a91ae43a6a15ba73d913684c76fc7.tar.gz
nextcloud-server-bc4185a6fe3a91ae43a6a15ba73d913684c76fc7.zip
Move \OC\Mail to PSR-4
Diffstat (limited to 'lib/private/Mail')
-rw-r--r--lib/private/Mail/Mailer.php223
-rw-r--r--lib/private/Mail/Message.php252
2 files changed, 475 insertions, 0 deletions
diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php
new file mode 100644
index 00000000000..742ff554892
--- /dev/null
+++ b/lib/private/Mail/Mailer.php
@@ -0,0 +1,223 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Mail;
+
+use OCP\IConfig;
+use OCP\Mail\IMailer;
+use OCP\ILogger;
+
+/**
+ * Class Mailer provides some basic functions to create a mail message that can be used in combination with
+ * \OC\Mail\Message.
+ *
+ * Example usage:
+ *
+ * $mailer = \OC::$server->getMailer();
+ * $message = $mailer->createMessage();
+ * $message->setSubject('Your Subject');
+ * $message->setFrom(array('cloud@domain.org' => 'ownCloud Notifier');
+ * $message->setTo(array('recipient@domain.org' => 'Recipient');
+ * $message->setBody('The message text');
+ * $mailer->send($message);
+ *
+ * This message can then be passed to send() of \OC\Mail\Mailer
+ *
+ * @package OC\Mail
+ */
+class Mailer implements IMailer {
+ /** @var \Swift_SmtpTransport|\Swift_SendmailTransport|\Swift_MailTransport Cached transport */
+ private $instance = null;
+ /** @var IConfig */
+ private $config;
+ /** @var ILogger */
+ private $logger;
+ /** @var \OC_Defaults */
+ private $defaults;
+
+ /**
+ * @param IConfig $config
+ * @param ILogger $logger
+ * @param \OC_Defaults $defaults
+ */
+ function __construct(IConfig $config,
+ ILogger $logger,
+ \OC_Defaults $defaults) {
+ $this->config = $config;
+ $this->logger = $logger;
+ $this->defaults = $defaults;
+ }
+
+ /**
+ * Creates a new message object that can be passed to send()
+ *
+ * @return Message
+ */
+ public function createMessage() {
+ return new Message(new \Swift_Message());
+ }
+
+ /**
+ * Send the specified message. Also sets the from address to the value defined in config.php
+ * if no-one has been passed.
+ *
+ * @param Message $message Message to send
+ * @return string[] Array with failed recipients. Be aware that this depends on the used mail backend and
+ * therefore should be considered
+ * @throws \Exception In case it was not possible to send the message. (for example if an invalid mail address
+ * has been supplied.)
+ */
+ public function send(Message $message) {
+ $debugMode = $this->config->getSystemValue('mail_smtpdebug', false);
+
+ if (sizeof($message->getFrom()) === 0) {
+ $message->setFrom([\OCP\Util::getDefaultEmailAddress($this->defaults->getName())]);
+ }
+
+ $failedRecipients = [];
+
+ $mailer = $this->getInstance();
+
+ // Enable logger if debug mode is enabled
+ if($debugMode) {
+ $mailLogger = new \Swift_Plugins_Loggers_ArrayLogger();
+ $mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($mailLogger));
+ }
+
+ $mailer->send($message->getSwiftMessage(), $failedRecipients);
+
+ // Debugging logging
+ $logMessage = sprintf('Sent mail to "%s" with subject "%s"', print_r($message->getTo(), true), $message->getSubject());
+ $this->logger->debug($logMessage, ['app' => 'core']);
+ if($debugMode && isset($mailLogger)) {
+ $this->logger->debug($mailLogger->dump(), ['app' => 'core']);
+ }
+
+ return $failedRecipients;
+ }
+
+ /**
+ * Checks if an e-mail address is valid
+ *
+ * @param string $email Email address to be validated
+ * @return bool True if the mail address is valid, false otherwise
+ */
+ public function validateMailAddress($email) {
+ return \Swift_Validate::email($this->convertEmail($email));
+ }
+
+ /**
+ * SwiftMailer does currently not work with IDN domains, this function therefore converts the domains
+ *
+ * FIXME: Remove this once SwiftMailer supports IDN
+ *
+ * @param string $email
+ * @return string Converted mail address if `idn_to_ascii` exists
+ */
+ protected function convertEmail($email) {
+ if (!function_exists('idn_to_ascii') || strpos($email, '@') === false) {
+ return $email;
+ }
+
+ list($name, $domain) = explode('@', $email, 2);
+ $domain = idn_to_ascii($domain);
+ return $name.'@'.$domain;
+ }
+
+ /**
+ * Returns whatever transport is configured within the config
+ *
+ * @return \Swift_SmtpTransport|\Swift_SendmailTransport|\Swift_MailTransport
+ */
+ protected function getInstance() {
+ if (!is_null($this->instance)) {
+ return $this->instance;
+ }
+
+ switch ($this->config->getSystemValue('mail_smtpmode', 'php')) {
+ case 'smtp':
+ $this->instance = $this->getSMTPInstance();
+ break;
+ case 'sendmail':
+ // FIXME: Move into the return statement but requires proper testing
+ // for SMTP and mail as well. Thus not really doable for a
+ // minor release.
+ $this->instance = \Swift_Mailer::newInstance($this->getSendMailInstance());
+ break;
+ default:
+ $this->instance = $this->getMailInstance();
+ break;
+ }
+
+ return $this->instance;
+ }
+
+ /**
+ * Returns the SMTP transport
+ *
+ * @return \Swift_SmtpTransport
+ */
+ protected function getSmtpInstance() {
+ $transport = \Swift_SmtpTransport::newInstance();
+ $transport->setTimeout($this->config->getSystemValue('mail_smtptimeout', 10));
+ $transport->setHost($this->config->getSystemValue('mail_smtphost', '127.0.0.1'));
+ $transport->setPort($this->config->getSystemValue('mail_smtpport', 25));
+ if ($this->config->getSystemValue('mail_smtpauth', false)) {
+ $transport->setUsername($this->config->getSystemValue('mail_smtpname', ''));
+ $transport->setPassword($this->config->getSystemValue('mail_smtppassword', ''));
+ $transport->setAuthMode($this->config->getSystemValue('mail_smtpauthtype', 'LOGIN'));
+ }
+ $smtpSecurity = $this->config->getSystemValue('mail_smtpsecure', '');
+ if (!empty($smtpSecurity)) {
+ $transport->setEncryption($smtpSecurity);
+ }
+ $transport->start();
+ return $transport;
+ }
+
+ /**
+ * Returns the sendmail transport
+ *
+ * @return \Swift_SendmailTransport
+ */
+ protected function getSendMailInstance() {
+ switch ($this->config->getSystemValue('mail_smtpmode', 'sendmail')) {
+ case 'qmail':
+ $binaryPath = '/var/qmail/bin/sendmail';
+ break;
+ default:
+ $binaryPath = '/usr/sbin/sendmail';
+ break;
+ }
+
+ return \Swift_SendmailTransport::newInstance($binaryPath . ' -bs');
+ }
+
+ /**
+ * Returns the mail transport
+ *
+ * @return \Swift_MailTransport
+ */
+ protected function getMailInstance() {
+ return \Swift_MailTransport::newInstance();
+ }
+
+}
diff --git a/lib/private/Mail/Message.php b/lib/private/Mail/Message.php
new file mode 100644
index 00000000000..0e33e6383f7
--- /dev/null
+++ b/lib/private/Mail/Message.php
@@ -0,0 +1,252 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Mail;
+
+use Swift_Message;
+
+/**
+ * Class Message provides a wrapper around SwiftMail
+ *
+ * @package OC\Mail
+ */
+class Message {
+ /** @var Swift_Message */
+ private $swiftMessage;
+
+ /**
+ * @param Swift_Message $swiftMessage
+ */
+ function __construct(Swift_Message $swiftMessage) {
+ $this->swiftMessage = $swiftMessage;
+ }
+
+ /**
+ * SwiftMailer does currently not work with IDN domains, this function therefore converts the domains
+ * FIXME: Remove this once SwiftMailer supports IDN
+ *
+ * @param array $addresses Array of mail addresses, key will get converted
+ * @return array Converted addresses if `idn_to_ascii` exists
+ */
+ protected function convertAddresses($addresses) {
+ if (!function_exists('idn_to_ascii')) {
+ return $addresses;
+ }
+
+ $convertedAddresses = array();
+
+ foreach($addresses as $email => $readableName) {
+ if(!is_numeric($email)) {
+ list($name, $domain) = explode('@', $email, 2);
+ $domain = idn_to_ascii($domain);
+ $convertedAddresses[$name.'@'.$domain] = $readableName;
+ } else {
+ list($name, $domain) = explode('@', $readableName, 2);
+ $domain = idn_to_ascii($domain);
+ $convertedAddresses[$email] = $name.'@'.$domain;
+ }
+ }
+
+ return $convertedAddresses;
+ }
+
+ /**
+ * Set the from address of this message.
+ *
+ * If no "From" address is used \OC\Mail\Mailer will use mail_from_address and mail_domain from config.php
+ *
+ * @param array $addresses Example: array('sender@domain.org', 'other@domain.org' => 'A name')
+ * @return $this
+ */
+ public function setFrom(array $addresses) {
+ $addresses = $this->convertAddresses($addresses);
+
+ $this->swiftMessage->setFrom($addresses);
+ return $this;
+ }
+
+ /**
+ * Get the from address of this message.
+ *
+ * @return array
+ */
+ public function getFrom() {
+ return $this->swiftMessage->getFrom();
+ }
+
+ /**
+ * Set the Reply-To address of this message
+ *
+ * @param array $addresses
+ * @return $this
+ */
+ public function setReplyTo(array $addresses) {
+ $addresses = $this->convertAddresses($addresses);
+
+ $this->swiftMessage->setReplyTo($addresses);
+ return $this;
+ }
+
+ /**
+ * Returns the Reply-To address of this message
+ *
+ * @return array
+ */
+ public function getReplyTo() {
+ return $this->swiftMessage->getReplyTo();
+ }
+
+ /**
+ * Set the to addresses of this message.
+ *
+ * @param array $recipients Example: array('recipient@domain.org', 'other@domain.org' => 'A name')
+ * @return $this
+ */
+ public function setTo(array $recipients) {
+ $recipients = $this->convertAddresses($recipients);
+
+ $this->swiftMessage->setTo($recipients);
+ return $this;
+ }
+
+ /**
+ * Get the to address of this message.
+ *
+ * @return array
+ */
+ public function getTo() {
+ return $this->swiftMessage->getTo();
+ }
+
+ /**
+ * Set the CC recipients of this message.
+ *
+ * @param array $recipients Example: array('recipient@domain.org', 'other@domain.org' => 'A name')
+ * @return $this
+ */
+ public function setCc(array $recipients) {
+ $recipients = $this->convertAddresses($recipients);
+
+ $this->swiftMessage->setCc($recipients);
+ return $this;
+ }
+
+ /**
+ * Get the cc address of this message.
+ *
+ * @return array
+ */
+ public function getCc() {
+ return $this->swiftMessage->getCc();
+ }
+
+ /**
+ * Set the BCC recipients of this message.
+ *
+ * @param array $recipients Example: array('recipient@domain.org', 'other@domain.org' => 'A name')
+ * @return $this
+ */
+ public function setBcc(array $recipients) {
+ $recipients = $this->convertAddresses($recipients);
+
+ $this->swiftMessage->setBcc($recipients);
+ return $this;
+ }
+
+ /**
+ * Get the Bcc address of this message.
+ *
+ * @return array
+ */
+ public function getBcc() {
+ return $this->swiftMessage->getBcc();
+ }
+
+ /**
+ * Set the subject of this message.
+ *
+ * @param $subject
+ * @return $this
+ */
+ public function setSubject($subject) {
+ $this->swiftMessage->setSubject($subject);
+ return $this;
+ }
+
+ /**
+ * Get the from subject of this message.
+ *
+ * @return string
+ */
+ public function getSubject() {
+ return $this->swiftMessage->getSubject();
+ }
+
+ /**
+ * Set the plain-text body of this message.
+ *
+ * @param string $body
+ * @return $this
+ */
+ public function setPlainBody($body) {
+ $this->swiftMessage->setBody($body);
+ return $this;
+ }
+
+ /**
+ * Get the plain body of this message.
+ *
+ * @return string
+ */
+ public function getPlainBody() {
+ return $this->swiftMessage->getBody();
+ }
+
+ /**
+ * Set the HTML body of this message. Consider also sending a plain-text body instead of only an HTML one.
+ *
+ * @param string $body
+ * @return $this
+ */
+ public function setHtmlBody($body) {
+ $this->swiftMessage->addPart($body, 'text/html');
+ return $this;
+ }
+
+ /**
+ * Get's the underlying SwiftMessage
+ * @return Swift_Message
+ */
+ public function getSwiftMessage() {
+ return $this->swiftMessage;
+ }
+
+ /**
+ * @param string $body
+ * @param string $contentType
+ * @return $this
+ */
+ public function setBody($body, $contentType) {
+ $this->swiftMessage->setBody($body, $contentType);
+ return $this;
+ }
+}