diff --git a/Classes/Command/InvokeMailerEngineCommand.php b/Classes/Command/InvokeMailerEngineCommand.php index 6ae76c9a4..7f5e0aaac 100644 --- a/Classes/Command/InvokeMailerEngineCommand.php +++ b/Classes/Command/InvokeMailerEngineCommand.php @@ -18,6 +18,7 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -45,7 +46,6 @@ class InvokeMailerEngineCommand extends Command public function configure() { $this->setDescription('Invoke Mailer Engine of EXT:directmail'); - $this->setHelp('Describe ...'); $this->setHelp(' Sends newsletters which are ready to send. @@ -63,17 +63,21 @@ public function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { + $io = new SymfonyStyle($input, $output); + $io->title($this->getDescription()); + $lockfile = Environment::getPublicPath() . '/typo3temp/tx_directmail_cron.lock'; + // Check if cronjob is already running: - if (@file_exists(Environment::getPublicPath() . '/typo3temp/tx_directmail_cron.lock')) { - // If the lock is not older than 1 day, skip index creation: - if (filemtime(Environment::getPublicPath() . '/typo3temp/tx_directmail_cron.lock') > (time() - (60 * 60 * 24))) { - die('TYPO3 Direct Mail Cron: Aborting, another process is already running!' . LF); + if (@file_exists($lockfile)) { + // If the lock is not older than 1 day, skip: + if (filemtime($lockfile) > (time() - (60 * 60 * 24))) { + $io->warning('TYPO3 Direct Mail Cron: Aborting, another process is already running!'); + return 0; } else { - echo('TYPO3 Direct Mail Cron: A .lock file was found but it is older than 1 day! Processing mails ...' . LF); + $io->writeln('TYPO3 Direct Mail Cron: A .lock file was found but it is older than 1 day! Processing mails ...'); } } - - $lockfile = Environment::getPublicPath() . '/typo3temp/tx_directmail_cron.lock'; + touch($lockfile); // Fixing filepermissions GeneralUtility::fixPermissions($lockfile); @@ -87,5 +91,6 @@ protected function execute(InputInterface $input, OutputInterface $output) $htmlmail->runcron(); unlink($lockfile); + return 0; } } diff --git a/Classes/DirectMailUtility.php b/Classes/DirectMailUtility.php index 3af5744ff..d8900c4ce 100644 --- a/Classes/DirectMailUtility.php +++ b/Classes/DirectMailUtility.php @@ -1079,20 +1079,13 @@ public static function createDirectMailRecordFromPage($pageUid, array $parameter } $pageRecord = BackendUtility::getRecord('pages', $pageUid); - // Fetch page title from pages_language_overlay + // Fetch page title from translated page if ($newRecord['sys_language_uid'] > 0) { - if (strpos(VersionNumberUtility::getNumericTypo3Version(), '9') === 0) { - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); - $queryBuilder - ->select('title') - ->from('pages') - ->where($queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($pageUid, \PDO::PARAM_INT))); - } else { - $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages_language_overlay'); - $queryBuilder->select('title') - ->from('pages_language_overlay') - ->where($queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pageUid, \PDO::PARAM_INT))); - } + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); + $queryBuilder + ->select('title') + ->from('pages') + ->where($queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($pageUid, \PDO::PARAM_INT))); $pageRecordOverlay = $queryBuilder->andWhere( $queryBuilder->expr()->eq( diff --git a/Classes/Dmailer.php b/Classes/Dmailer.php index 3dcfd1790..0028e2a88 100755 --- a/Classes/Dmailer.php +++ b/Classes/Dmailer.php @@ -465,7 +465,7 @@ public function getListOfRecipentCategories(string $table, int $uid): string $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table); $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); $statement = $queryBuilder - ->select('uid_foreign') + ->select($relationTable . '.uid_foreign') ->from($relationTable, $relationTable) ->leftJoin($relationTable, $table, $table, $relationTable . '.uid_local = ' . $table . '.uid') ->where($queryBuilder->expr()->eq($relationTable . '.uid_local', $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT))) @@ -904,7 +904,7 @@ public function setContent(&$mailer) { // todo: css?? // iterate through the media array and embed them - if ($this->includeMedia) { + if ($this->includeMedia && !empty($this->theParts['html']['content'])) { // extract all media path from the mail message $this->extractMediaLinks(); foreach ($this->theParts['html']['media'] as $media) { @@ -923,11 +923,11 @@ public function setContent(&$mailer) } // set the html content - if ($this->theParts['html']) { + if ($this->theParts['html']['content']) { $mailer->html($this->theParts['html']['content']); } // set the plain content as alt part - if ($this->theParts['plain']) { + if ($this->theParts['plain']['content']) { $mailer->text($this->theParts['plain']['content']); } @@ -967,7 +967,7 @@ public function sendTheMail($recipient, $recipRow = null) } if (GeneralUtility::validEmail($this->dmailer['sys_dmail_rec']['return_path'])) { - $mailer->returnPath($this->dmailer['sys_dmail_rec']['return_path']); + $mailer->sender($this->dmailer['sys_dmail_rec']['return_path']); } // TODO: setContent should set the images (includeMedia) or add attachment diff --git a/Classes/Importer.php b/Classes/Importer.php index 39b3df625..8f30e84f8 100644 --- a/Classes/Importer.php +++ b/Classes/Importer.php @@ -119,7 +119,7 @@ public function cmd_displayImport() // TYPO3 6.0 returns an object... if (is_object($this->indata['newFile'][0])) { $storageConfig = $this->indata['newFile'][0]->getStorage()->getConfiguration(); - $this->indata['newFile'] = $storageConfig['basePath'] . ltrim($this->indata['newFile'][0]->getIdentifier(), '/'); + $this->indata['newFile'] = rtrim($storageConfig['basePath'], '/') . '/' . ltrim($this->indata['newFile'][0]->getIdentifier(), '/'); } } elseif (!empty($this->indata['csv']) && empty($_FILES['upload_1']['name'])) { if (((strpos($currentFileInfo['file'], 'import')=== false)?0:1) && ($currentFileInfo['realFileext'] === 'txt')) { @@ -137,7 +137,7 @@ public function cmd_displayImport() $stepCurrent = 'mapping'; } - if ($this->indata['csv'] !== '') { + if (strlen($this->indata['csv']) > 0) { $this->indata['mode'] = 'csv'; $this->indata['newFile'] = $this->writeTempFile(); } elseif (!empty($this->indata['newFile'])) { @@ -890,6 +890,9 @@ public function readCSV() ini_set('auto_detect_line_endings', true); $mydata = array(); $handle = fopen($this->indata['newFile'], 'r'); + if($handle === false) { + return $mydata; + } $delimiter = $this->indata['delimiter']; $encaps = $this->indata['encapsulation']; $delimiter = ($delimiter === 'comma') ? ',' : $delimiter; @@ -929,6 +932,9 @@ public function readExampleCSV($records=3) $this->indata['newFile'] = Environment::getPublicPath() . '/' . $this->indata['newFile']; } $handle = fopen($this->indata['newFile'], 'r'); + if($handle === false) { + return $mydata; + } $i = 0; $delimiter = $this->indata['delimiter']; $encaps = $this->indata['encapsulation']; @@ -969,7 +975,7 @@ public function convCharset(array $data) if ($dbCharset != $this->indata['charset']) { $converter = GeneralUtility::makeInstance(CharsetConverter::class); foreach ($data as $k => $v) { - $data[$k] = $converter->conv($v, $this->indata['charset'], $dbCharset); + $data[$k] = $converter->conv($v, strtolower($this->indata['charset']), $dbCharset); } } return $data; @@ -1095,7 +1101,7 @@ public function writeTempFile() } if ($newfile) { - $csvFile['data'] = $this->indata['csv']; + $csvFile['data'] = $this->indata['csv'] ?? ''; $csvFile['target'] = $newfile; $write = $this->fileProcessor->func_edit($csvFile); } diff --git a/Classes/Module/MailerEngine.php b/Classes/Module/MailerEngine.php index 28c67e2a6..4cae567d9 100644 --- a/Classes/Module/MailerEngine.php +++ b/Classes/Module/MailerEngine.php @@ -465,7 +465,9 @@ public function deleteLink($uid) $icon = $this->iconFactory->getIcon('actions-edit-delete', Icon::SIZE_SMALL); $dmail = BackendUtility::getRecord('sys_dmail', $uid); - if (!empty($dmail['scheduled_begin'])) { + // show delete icon if newsletter hasn't been sent, or not yet finished sending + if (!($dmail['scheduled_begin']) || + ($dmail['scheduled_begin'] && $dmail['scheduled_end'] === 0)) { /** @var UriBuilder $uriBuilder */ $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class); $moduleUrl = $uriBuilder->buildUriFromRoute( diff --git a/Classes/Scheduler/AnalyzeBounceMailAdditionalFields.php b/Classes/Scheduler/AnalyzeBounceMailAdditionalFields.php index 4eddda12c..7ddef8156 100644 --- a/Classes/Scheduler/AnalyzeBounceMailAdditionalFields.php +++ b/Classes/Scheduler/AnalyzeBounceMailAdditionalFields.php @@ -18,7 +18,7 @@ use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Scheduler\AdditionalFieldProviderInterface; +use TYPO3\CMS\Scheduler\AbstractAdditionalFieldProvider; use TYPO3\CMS\Scheduler\Controller\SchedulerModuleController; use TYPO3\CMS\Scheduler\Task\AbstractTask; @@ -29,7 +29,7 @@ * @package DirectMailTeam\DirectMail\Scheduler * @author Ivan Kartolo */ -class AnalyzeBounceMailAdditionalFields implements AdditionalFieldProviderInterface +class AnalyzeBounceMailAdditionalFields extends AbstractAdditionalFieldProvider { public function __construct() { @@ -128,7 +128,7 @@ public function validateAdditionalFields(array &$submittedData, SchedulerModuleC $imapStream = $mailServer->getImapStream(); $return = true; } catch (\Exception $e) { - $schedulerModule->addMessage( + $this->addMessage( $this->getLanguangeService()->getLL('scheduler.bounceMail.dataVerification') . $e->getMessage(), FlashMessage::ERROR @@ -136,7 +136,7 @@ public function validateAdditionalFields(array &$submittedData, SchedulerModuleC $return = false; } } else { - $schedulerModule->addMessage( + $this->addMessage( $this->getLanguangeService()->getLL('scheduler.bounceMail.phpImapError'), FlashMessage::ERROR ); diff --git a/Classes/Scheduler/MailFromDraftAdditionalFields.php b/Classes/Scheduler/MailFromDraftAdditionalFields.php index 4bff41042..be8340c66 100644 --- a/Classes/Scheduler/MailFromDraftAdditionalFields.php +++ b/Classes/Scheduler/MailFromDraftAdditionalFields.php @@ -15,9 +15,12 @@ */ use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Messaging\FlashMessage; -use TYPO3\CMS\Scheduler\AdditionalFieldProviderInterface; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Scheduler\AbstractAdditionalFieldProvider; use TYPO3\CMS\Scheduler\Controller\SchedulerModuleController; +use TYPO3\CMS\Scheduler\Task\AbstractTask; /** * Aditional fields provider class for usage with the Scheduler's MailFromDraft task @@ -26,7 +29,7 @@ * @package TYPO3 * @subpackage direct_mail */ -class MailFromDraftAdditionalFields implements AdditionalFieldProviderInterface +class MailFromDraftAdditionalFields extends AbstractAdditionalFieldProvider { /** @@ -35,7 +38,7 @@ class MailFromDraftAdditionalFields implements AdditionalFieldProviderInterface * * @param array $taskInfo reference to the array containing the info used in the add/edit form * @param object $task when editing, reference to the current task object. Null when adding. - * @param \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject reference to the calling object (Scheduler's BE module) + * @param SchedulerModuleController $schedulerModuleController reference to the calling object (Scheduler's BE module) * * @return array Array containg all the information pertaining to the additional fields * The array is multidimensional, keyed to the task class name and each field's id @@ -45,12 +48,11 @@ class MailFromDraftAdditionalFields implements AdditionalFieldProviderInterface * ['cshKey'] => The CSH key for the field * ['cshLabel'] => The code of the CSH label */ - public function getAdditionalFields(array &$taskInfo, $task, SchedulerModuleController $parentObject) + public function getAdditionalFields(array &$taskInfo, $task, SchedulerModuleController $schedulerModuleController) { - - // Initialize extra field value + // Initialize extra field value if (empty($taskInfo['selecteddraft'])) { - if ($parentObject->CMD == 'edit') { + if ($schedulerModuleController->CMD === 'edit') { // In case of edit, and editing a test task, set to internal value if not data was submitted already $taskInfo['selecteddraft'] = $task->draftUid; } else { @@ -62,7 +64,7 @@ public function getAdditionalFields(array &$taskInfo, $task, SchedulerModuleCont // fetch all available drafts $drafts = array(); - $queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class) + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('sys_dmail'); $draftsInternal = $queryBuilder ->select('*') @@ -99,13 +101,12 @@ public function getAdditionalFields(array &$taskInfo, $task, SchedulerModuleCont } else { foreach ($drafts as $draft) { // see #44577 - $selected = ($task->draftUid == $draft['uid'] ? ' selected="selected"' : ''); + $selected = ($task->draftUid === $draft['uid'] ? ' selected="selected"' : ''); $fieldHtml .= ''; } } $fieldHtml = ''; - $additionalFields = array(); $additionalFields[$fieldID] = array( 'code' => $fieldHtml, @@ -124,17 +125,17 @@ public function getAdditionalFields(array &$taskInfo, $task, SchedulerModuleCont * If the task class is not relevant, the method is expected to return true * * @param array $submittedData Reference to the array containing the data submitted by the user - * @param \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject Reference to the calling object (Scheduler's BE module) + * @param SchedulerModuleController $schedulerModuleController Reference to the calling object (Scheduler's BE module) * * @return bool True if validation was ok (or selected class is not relevant), false otherwise */ - public function validateAdditionalFields(array &$submittedData, \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject) + public function validateAdditionalFields(array &$submittedData, SchedulerModuleController $schedulerModuleController) { - $draftUid = $submittedData['selecteddraft'] = intval($submittedData['selecteddraft']); + $draftUid = $submittedData['selecteddraft'] = (int) $submittedData['selecteddraft']; if ($draftUid > 0) { $draftRecord = BackendUtility::getRecord('sys_dmail', $draftUid); - $queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\ConnectionPool::class) + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('sys_dmail'); $draftsInternal = $queryBuilder ->select('*') @@ -145,19 +146,16 @@ public function validateAdditionalFields(array &$submittedData, \TYPO3\CMS\Sched ->execute() ->fetchAll(); - - - if ($draftRecord['type'] == 2 || $draftRecord['type'] == 3) { $result = true; } else { // TODO: localization - $parentObject->addMessage('No draft record selected', FlashMessage::ERROR); + $this->addMessage('No draft record selected', FlashMessage::ERROR); $result = false; } } else { // TODO: localization - $parentObject->addMessage('No drafts found. Please add one first through the direct mail process', FlashMessage::ERROR); + $this->addMessage('No drafts found. Please add one first through the direct mail process', FlashMessage::ERROR); $result = false; } @@ -169,11 +167,11 @@ public function validateAdditionalFields(array &$submittedData, \TYPO3\CMS\Sched * if the task class matches * * @param array $submittedData Array containing the data submitted by the user - * @param \TYPO3\CMS\Scheduler\Task\AbstractTask $task Reference to the current task object + * @param AbstractTask $task Reference to the current task object * * @return void */ - public function saveAdditionalFields(array $submittedData, \TYPO3\CMS\Scheduler\Task\AbstractTask $task) + public function saveAdditionalFields(array $submittedData, AbstractTask $task) { $task->setDraft($submittedData['selecteddraft']); } diff --git a/Configuration/Commands.php b/Configuration/Commands.php deleted file mode 100644 index c0873a013..000000000 --- a/Configuration/Commands.php +++ /dev/null @@ -1,15 +0,0 @@ - [ - 'class' => \DirectMailTeam\DirectMail\Command\InvokeMailerEngineCommand::class - ], -]; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml new file mode 100644 index 000000000..afa018cf1 --- /dev/null +++ b/Configuration/Services.yaml @@ -0,0 +1,17 @@ +services: + _defaults: + autowire: true + autoconfigure: true + public: false + + DirectMailTeam\DirectMail\: + resource: '../Classes/*' + + DirectMailTeam\DirectMail\Command\InvokeMailerEngineCommand: + tags: + - name: 'console.command' + command: 'directmail:invokemailerengine' + description: 'Invoke Mailer Engine of EXT:directmail' + # not required, defaults to false + #hidden: false + #schedulable: false \ No newline at end of file diff --git a/composer.json b/composer.json index 2d11433f8..d4565fb37 100644 --- a/composer.json +++ b/composer.json @@ -46,6 +46,9 @@ "class-alias-maps": [ "Migrations/Code/ClassAliasMap.php" ] + }, + "typo3/cms": { + "extension-key": "direct_mail" } } } diff --git a/ext_emconf.php b/ext_emconf.php index 1f713e1fd..f830e8749 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -10,28 +10,17 @@ * writing. "version" and "dependencies" must not be touched! ***************************************************************/ -$EM_CONF['direct_mail'] = [ +$EM_CONF[$_EXTKEY] = [ 'title' => 'Direct Mail', 'description' => 'Advanced Direct Mail/Newsletter mailer system with sophisticated options for personalization of emails including response statistics.', 'category' => 'module', - 'shy' => 0, - 'version' => '7.0.0', - 'dependencies' => 'cms,tt_address', - 'conflicts' => 'sr_direct_mail_ext,it_dmail_fix,plugin_mgm,direct_mail_123', - 'priority' => '', - 'loadOrder' => '', - 'module' => 'mod1,mod2,mod3,mod4,mod5,mod6', + 'version' => '7.0.1', 'state' => 'stable', - 'uploadfolder' => 1, - 'createDirs' => '', - 'modify_tables' => 'tt_content,tt_address,fe_users', 'clearcacheonload' => 0, 'lockType' => '', 'author' => 'Ivan Kartolo', 'author_email' => 'ivan.kartolo@dkd.de', 'author_company' => 'd.k.d Internet Service GmbH', - 'CGLcompliance' => '', - 'CGLcompliance_note' => '', 'constraints' => [ 'depends' => [ 'tt_address' => '4.0.0-', @@ -49,7 +38,6 @@ 'suggests' => [ ], ], - '_md5_values_when_last_written' => 'a:99:{s:9:"ChangeLog";s:4:"c147";s:20:"class.ext_update.php";s:4:"0ab1";s:31:"class.tx_directmail_gabriel.php";s:4:"6de4";s:33:"class.tx_directmail_scheduler.php";s:4:"1a0e";s:16:"ext_autoload.php";s:4:"2e3e";s:21:"ext_conf_template.txt";s:4:"7c49";s:12:"ext_icon.gif";s:4:"a143";s:17:"ext_localconf.php";s:4:"33b2";s:14:"ext_tables.php";s:4:"bc0a";s:14:"ext_tables.sql";s:4:"2388";s:17:"locallang_tca.xml";s:4:"6e8b";s:35:"Classes/Scheduler/MailFromDraft.php";s:4:"4f4c";s:52:"Classes/Scheduler/MailFromDraft_AdditionalFields.php";s:4:"eaa9";s:21:"Configuration/tca.php";s:4:"0000";s:42:"Interfaces/Scheduler/MailFromDraftHook.php";s:4:"938b";s:40:"Resources/Public/StyleSheets/modules.css";s:4:"bf1f";s:23:"cli/cli_direct_mail.php";s:4:"a2b3";s:14:"doc/manual.sxw";s:4:"811a";s:36:"locallang/locallang_csh_sysdmail.xml";s:4:"f4a1";s:39:"locallang/locallang_csh_sysdmailcat.xml";s:4:"a2b1";s:37:"locallang/locallang_csh_sysdmailg.xml";s:4:"0ecd";s:42:"locallang/locallang_csh_txdirectmailM2.xml";s:4:"2fa2";s:42:"locallang/locallang_csh_txdirectmailM3.xml";s:4:"3846";s:42:"locallang/locallang_csh_txdirectmailM4.xml";s:4:"761f";s:42:"locallang/locallang_csh_txdirectmailM5.xml";s:4:"e511";s:42:"locallang/locallang_csh_txdirectmailM6.xml";s:4:"3f6d";s:44:"locallang/locallang_csh_web_txdirectmail.xml";s:4:"1764";s:30:"locallang/locallang_mod2-6.xml";s:4:"d14a";s:14:"mod1/clear.gif";s:4:"cc11";s:13:"mod1/conf.php";s:4:"f25a";s:14:"mod1/index.php";s:4:"4f8b";s:22:"mod1/locallang_mod.xml";s:4:"9b3c";s:17:"mod1/mod_icon.gif";s:4:"a143";s:22:"mod1/mod_template.html";s:4:"65bd";s:34:"mod2/class.tx_directmail_dmail.php";s:4:"5beb";s:13:"mod2/conf.php";s:4:"f24c";s:14:"mod2/index.php";s:4:"6421";s:22:"mod2/locallang_mod.xml";s:4:"6088";s:17:"mod2/mod_icon.gif";s:4:"a143";s:22:"mod2/mod_template.html";s:4:"f729";s:43:"mod3/class.tx_directmail_recipient_list.php";s:4:"7ad3";s:14:"mod3/clear.gif";s:4:"cc11";s:13:"mod3/conf.php";s:4:"ba64";s:14:"mod3/index.php";s:4:"e742";s:22:"mod3/locallang_mod.xml";s:4:"c2ce";s:17:"mod3/mod_icon.gif";s:4:"a143";s:22:"mod3/mod_template.html";s:4:"2581";s:39:"mod4/class.tx_directmail_statistics.php";s:4:"95da";s:14:"mod4/clear.gif";s:4:"cc11";s:13:"mod4/conf.php";s:4:"2c51";s:14:"mod4/index.php";s:4:"e2b7";s:22:"mod4/locallang_mod.xml";s:4:"fc77";s:17:"mod4/mod_icon.gif";s:4:"a143";s:22:"mod4/mod_template.html";s:4:"2581";s:42:"mod5/class.tx_directmail_mailer_engine.php";s:4:"8129";s:14:"mod5/clear.gif";s:4:"cc11";s:13:"mod5/conf.php";s:4:"4ad5";s:14:"mod5/index.php";s:4:"2077";s:22:"mod5/locallang_mod.xml";s:4:"a0d7";s:17:"mod5/mod_icon.gif";s:4:"a143";s:22:"mod5/mod_template.html";s:4:"2581";s:42:"mod6/class.tx_directmail_configuration.php";s:4:"9037";s:14:"mod6/clear.gif";s:4:"cc11";s:13:"mod6/conf.php";s:4:"2862";s:14:"mod6/index.php";s:4:"c58e";s:22:"mod6/locallang_mod.xml";s:4:"87d6";s:17:"mod6/mod_icon.gif";s:4:"a143";s:31:"pi1/class.tx_directmail_pi1.php";s:4:"ef59";s:17:"pi1/locallang.php";s:4:"ff9e";s:17:"pi1/locallang.xml";s:4:"2d6b";s:36:"pi1/tx_directmail_pi1_plaintext.tmpl";s:4:"2027";s:33:"Resources/Public/Icons/attach.gif";s:4:"5559";s:32:"Resources/Public/Icons/dmail.gif";s:4:"4d4f";s:37:"Resources/Public/Icons/dmail_list.gif";s:4:"8d58";s:38:"Resources/Public/Icons/dmailerping.gif";s:4:"cc11";s:48:"Resources/Public/Icons/ext_icon_dmail_folder.gif";s:4:"a143";s:54:"Resources/Public/Icons/icon_tx_directmail_category.gif";s:4:"9398";s:31:"Resources/Public/Icons/mail.gif";s:4:"4174";s:36:"Resources/Public/Icons/mailgroup.gif";s:4:"1cc5";s:40:"Resources/Public/Icons/modules_dmail.gif";s:4:"a143";s:43:"Resources/Public/Icons/modules_dmail__h.gif";s:4:"040c";s:34:"Resources/Public/Icons/newmail.gif";s:4:"ffa9";s:39:"Resources/Public/Icons/preview_html.gif";s:4:"1e65";s:38:"Resources/Public/Icons/preview_txt.gif";s:4:"4d9a";s:29:"res/scripts/class.dmailer.php";s:4:"4089";s:32:"res/scripts/class.mailselect.php";s:4:"43dd";s:30:"res/scripts/class.readmail.php";s:4:"c526";s:48:"res/scripts/class.tx_directmail_checkjumpurl.php";s:4:"6bf9";s:45:"res/scripts/class.tx_directmail_container.php";s:4:"b13c";s:44:"res/scripts/class.tx_directmail_importer.php";s:4:"6f7e";s:53:"res/scripts/class.tx_directmail_select_categories.php";s:4:"0c1f";s:42:"res/scripts/class.tx_directmail_static.php";s:4:"171f";s:47:"res/scripts/class.tx_directmail_tsparserext.php";s:4:"a5fe";s:52:"res/scripts/class.tx_directmail_ttnews_plaintext.php";s:4:"c28d";s:28:"res/scripts/returnmail.phpsh";s:4:"c0be";s:27:"static/boundaries/setup.txt";s:4:"9409";s:30:"static/plaintext/constants.txt";s:4:"59ce";s:26:"static/plaintext/setup.txt";s:4:"ee48";s:34:"static/tt_news_plaintext/setup.txt";s:4:"1a31";}', 'suggests' => [ ], 'autoload' => [