Added Feature #16610: Provide a SwiftMailer transport that only saves send mails...
authorErnesto Baschny <ernst@cron-it.de>
Wed, 1 Dec 2010 22:30:19 +0000 (22:30 +0000)
committerErnesto Baschny <ernst@cron-it.de>
Wed, 1 Dec 2010 22:30:19 +0000 (22:30 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@9741 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/config_default.php
t3lib/core_autoload.php
t3lib/mail/class.t3lib_mail_mailer.php
t3lib/mail/class.t3lib_mail_mboxtransport.php [new file with mode: 0644]

index cf57f95..153e4fb 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,7 @@
        * Fixed bug #16601: tslib_menu and tslib_Xmenu use wrong cObj with stdWrap (since #16446) (Thanks to Thomas Maroschik)
        * Fixed bug #15794: File>List (and other new sysext) shown even though extension not installed
        * Fixed bug #16639: DBAL auto-loading rendered the Install Tool unuseable (was switching mode to "123")
+       * Added Feature #16610: Provide a SwiftMailer transport that only saves send mails to files (mbox format)
 
 2010-12-01  Francois Suter  <francois@typo3.org>
 
index 299b38b..c4fda62 100644 (file)
@@ -346,12 +346,13 @@ $TYPO3_CONF_VARS = array(
                'XCLASS' => array(),                                    // See 'Inside TYPO3' document for more information.
        ),
        'MAIL' => array(                // Mail configurations to tune how t3lib_mail classes will send their mails.
-               'transport' => 'mail',                                  // <p>String:</p><dl><dt>mail</dt><dd>Sends messages by delegating to PHP's internal mail() function. No further settings required. This is the most unreliable option. If you are serious about sending mails, consider using "smtp" or "sendmail".</dd><dt>smtp</dt><dd>Sends messages over the (standardized) Simple Message Transfer Protocol. It can deal with encryption and authentication. Most flexible option, requires a mail server and configurations in transport_smtp_* settings below. Works the same on Windows, Unix and MacOS.</dd><dt>sendmail</dt><dd>Sends messages by communicating with a locally installed MTA – such as sendmail. See setting transport_sendmail_command bellow.<dd></dl>
+               'transport' => 'mail',                                  // <p>String:</p><dl><dt>mail</dt><dd>Sends messages by delegating to PHP's internal mail() function. No further settings required. This is the most unreliable option. If you are serious about sending mails, consider using "smtp" or "sendmail".</dd><dt>smtp</dt><dd>Sends messages over the (standardized) Simple Message Transfer Protocol. It can deal with encryption and authentication. Most flexible option, requires a mail server and configurations in transport_smtp_* settings below. Works the same on Windows, Unix and MacOS.</dd><dt>sendmail</dt><dd>Sends messages by communicating with a locally installed MTA \96 such as sendmail. See setting transport_sendmail_command bellow.<dd><dt>mbox</dt><dd>This doesn't send any mail out, but instead will write every outgoing mail to a file adhering to the RFC 4155 mbox format, which is a simple text file where the mails are concatenated. Useful for debugging the mail sending process and on development machines which cannot send mails to the outside. Configure the file to write to in the 'transport_mbox_file' setting below</dd></dl>
                'transport_smtp_server' => 'localhost:25',                      // String: <em>only with transport=smtp</em>: &lt;server:port> of mailserver to connect to. &lt;port> defaults to "25".
                'transport_smtp_encrypt' => FALSE,              // Boolean: <em>only with transport=smtp</em>: Connect to the server using encryption and TLS. Requires openssl library.
                'transport_smtp_username' => '',                // String: <em>only with transport=smtp</em>: If your SMTP server requires authentication, enter your username here.
                'transport_smtp_password' => '',                // String: <em>only with transport=smtp</em>: If your SMTP server requires authentication, enter your password here.
                'transport_sendmail_command' => '/usr/sbin/sendmail -bs',       // String: <em>only with transport=sendmail</em>: The command to call to send a mail locally. The default works on most modern UNIX based mail server (sendmail, postfix, exim)
+               'transport_mbox_file' => '',    // String: <em>only with transport=mbox</em>: The file where to write the mails into. This file will be conforming the mbox format described in RFC 4155. It is a simple text file with a concatenation of all mails. Path must be absolute.
        ),
        'MODS' => array(                // Backend Module Configuration (obsolete, make extension instead)
        ),
index d960a3d..a6fa21c 100644 (file)
@@ -135,6 +135,7 @@ $t3libClasses = array(
        't3lib_tceformsinlinehook' => PATH_t3lib . 'interfaces/interface.t3lib_tceformsinlinehook.php',
        't3lib_tcemain_checkmodifyaccesslisthook' => PATH_t3lib . 'interfaces/interface.t3lib_tcemain_checkmodifyaccesslisthook.php',
        't3lib_tcemain_processuploadhook' => PATH_t3lib . 'interfaces/interface.t3lib_tcemain_processuploadhook.php',
+       't3lib_mail_mboxtransport' => PATH_t3lib . 'mail/class.t3lib_mail_mboxtransport.php', 
        't3lib_mail_message' => PATH_t3lib . 'mail/class.t3lib_mail_message.php',
        't3lib_mail_mailer' => PATH_t3lib . 'mail/class.t3lib_mail_mailer.php',
        'tx_t3lib_mail_hooks' => PATH_t3lib . 'mail/class.tx_t3lib_mail_hooks.php',
index e2c73f3..bde0038 100644 (file)
@@ -71,7 +71,7 @@ class t3lib_mail_Mailer extends Swift_Mailer {
         * Prepares a transport using the TYPO3_CONF_VARS configuration
         *
         * Used options:
-        * $TYPO3_CONF_VARS['MAIL']['transport'] = 'smtp' | 'sendmail' | 'mail'
+        * $TYPO3_CONF_VARS['MAIL']['transport'] = 'smtp' | 'sendmail' | 'mail' | 'mbox'
         *
         * $TYPO3_CONF_VARS['MAIL']['transport_smtp_server'] = 'smtp.example.org';
         * $TYPO3_CONF_VARS['MAIL']['transport_smtp_port'] = '25';
@@ -127,6 +127,15 @@ class t3lib_mail_Mailer extends Swift_Mailer {
                                $this->transport = Swift_SendmailTransport::newInstance($sendmailCommand);
                                break;
 
+                       case 'mbox':
+                               $mboxFile = $mailSettings['transport_mbox_file'];
+                               if ($mboxFile == '') {
+                                       throw new t3lib_exception('$TYPO3_CONF_VARS[\'MAIL\'][\'transport_mbox_file\'] needs to be set when transport is set to "mbox"');
+                               }
+                                       // Create our transport
+                               $this->transport = t3lib_div::makeInstance('t3lib_mail_mboxtransport', $mboxFile);
+                               break;
+
                        case 'mail':
                        default:
                                        // Create the transport, no configuration required
diff --git a/t3lib/mail/class.t3lib_mail_mboxtransport.php b/t3lib/mail/class.t3lib_mail_mboxtransport.php
new file mode 100644 (file)
index 0000000..8496522
--- /dev/null
@@ -0,0 +1,156 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2010 Ernesto Baschny <ernst@cron-it.de>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script 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 General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Adapter for Swift_Mailer to be used by TYPO3 extensions.
+ *
+ * This will use the setting in TYPO3_CONF_VARS to choose the correct transport
+ * for it to work out-of-the-box.
+ *
+ * $Id$
+ *
+ * @author Ernesto Baschny <ernst@cron-it.de>
+ * @package TYPO3
+ * @subpackage t3lib
+ */
+class t3lib_mail_MboxTransport implements Swift_Transport {
+
+       /**
+        * @var string The file to write our mails into
+        */
+       private $debugFile;
+
+       /**
+        * Create a new MailTransport
+        * @param Swift_Transport_Log $log
+        */
+       public function __construct($debugFile) {
+               $this->debugFile = $debugFile;
+       }
+
+       /**
+        * Not used.
+        */
+       public function isStarted() {
+               return FALSE;
+       }
+
+       /**
+        * Not used.
+        */
+       public function start() {
+       }
+
+       /**
+        * Not used.
+        */
+       public function stop() {
+       }
+
+       /**
+        * Outputs the mail to a text file according to RFC 4155.
+        *
+        * @param Swift_Mime_Message $message The message to send
+        * @param string[] &$failedRecipients To collect failures by-reference, nothing will fail in our debugging case
+        * @return int
+        * @throws Exception
+        */
+       public function send(Swift_Mime_Message $message, &$failedRecipients = null) {
+               $message->generateId();
+
+                       // Create a mbox-like header
+               $mboxFrom = $this->getReversePath($message);
+               $mboxDate = strftime('%c', $message->getDate());
+               $messageStr = sprintf('From %s  %s', $mboxFrom, $mboxDate) . LF;
+
+                       // Add the complete mail inclusive headers
+               $messageStr .= $message->toString();
+               $messageStr .= LF . LF;
+
+                       // Write the mbox file
+               $file = @fopen($this->debugFile, 'a');
+               if (!$file) {
+                       throw new Exception(
+                               sprintf('Could not write to file "%s" when sending an email to debug transport', $this->debugFile),
+                               1291064151
+                       );
+               }
+
+               flock($file, LOCK_EX);
+               @fwrite($file, $messageStr);
+               flock($file, LOCK_UN);
+               @fclose($file);
+
+               t3lib_div::fixPermissions($this->debugFile);
+
+                       // Return every receipient as "delivered"
+               $count = (
+                       count((array) $message->getTo())
+                       + count((array) $message->getCc())
+                       + count((array) $message->getBcc())
+               );
+               return $count;
+       }
+
+       /**
+        * Determine the best-use reverse path for this message
+        *
+        * @param Swift_Mime_Message $message
+        * @return mixed|null
+        */
+       private function getReversePath(Swift_Mime_Message $message) {
+               $return = $message->getReturnPath();
+               $sender = $message->getSender();
+               $from = $message->getFrom();
+               $path = NULL;
+               if (!empty($return)) {
+                       $path = $return;
+               } elseif (!empty($sender)) {
+                       $keys = array_keys($sender);
+                       $path = array_shift($keys);
+               } elseif (!empty($from)) {
+                       $keys = array_keys($from);
+                       $path = array_shift($keys);
+               }
+               return $path;
+       }
+
+       /**
+        * Register a plugin in the Transport.
+        *
+        * @param Swift_Events_EventListener $plugin
+        */
+       public function registerPlugin(Swift_Events_EventListener $plugin) {
+               return TRUE;
+       }
+}
+
+if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_mail_mboxtransport.php']) {
+       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_mail_mboxtransport.php']);
+}
+
+?>
\ No newline at end of file