2016-10-30 5 views
0

Из моего расширения extbase 6.2 я хочу отправить разные электронные письма.
В классе контроллера я написал функцию почты, которая выглядит следующим образом:
(не заметить не @param для $attachment - см моего вопроса в конце)Создание вложения для MailMessage

/** 
* 
* @param string $to 
* @param string $subject 
* @param string $email_prefix 
* @param string $msg 
* @param string $email_suffix 
*/ 
public function mailAction($to, $subject, $email_prefix, $msg, $email_suffix, $attachment = null) { 
    try { 
     $from = \TYPO3\CMS\Core\Utility\MailUtility::getSystemFrom(); 
     $body = $email_prefix 
       . PHP_EOL . PHP_EOL 
       . $msg 
       . PHP_EOL . PHP_EOL 
       . $email_suffix; 
     $htmlBody = nl2br($body); 
     $toEmail = $to; 
     $mail = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Mail\\MailMessage'); 
     $mail->setFrom($from) 
       ->setTo(array($toEmail)) 
       ->setSubject($subject) 
       ->setBody($htmlBody, 'text/html'); 
     $mail->addPart($body, 'text/plain'); 
     if ($attachment) { 
      $mail->attach($attachment); 
     } 
     if (empty($toEmail) || strpos($toEmail, '@') === FALSE) { 
      $this->addFlashMessage('Die Mail konnte nicht verschickt werden! Keine Email-Adresse des Empfängers', '', \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR 
      ); 
     } else { 
      if ($mail->send()) { 
       $this->addFlashMessage('Die Mail für wurde verschickt!', ''); 
      } else { 
       $this->addFlashMessage('Die Mail konnte nicht verschickt werden!', '', \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR 
       ); 
      } 
     } 
     $this->redirect('list'); 
    } catch (Exception $e) { 
     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    } 
} 

В функции, которая вызывает функцию почты, когда я пытался создать вложение как это, но он не сказал: Fatal error: Class 'Swift_Attachment' not found in.../...Controller.php

$attachment = \Swift_Attachment::newInstance() 
       ->setFilename('Termine.html') 
       ->setContentType('text/html') 
       ->setBody($emailView->render()); 

Тогда я вызываю функцию почты, как это:

$this->redirect('mail', null, null, array(
      $to, 
      $subject, 
      $email_prefix, 
      $msg, 
      $email_suffix, 
      $attachment)); 

Мои вопросы:

  1. Как я могу успешно создать объект типа Swift_Attachment в контроллере моего расширения Extbase (без создания MailMessage объекта заранее и создать вложение внутри него)?
  2. Что следует положить после @param как тип переменной $attachment в моей почтовой функции для этого?

- EDIT -

Итак, по-видимому, никто не делает это, потому что это не должно быть.
Теперь я использовал подход Рене, сочетающий его с масштабируемым ответом Димитрия для нескольких приложений. Мой @param теперь array, потому что мне нужно создать фактическое вложение после создания экземпляра MailMessage - спасибо!

ответ

1

В моем продлении 6.2.25 ист работает без какого-либо в том числе:

$email->attach(\Swift_Attachment::newInstance(
    $emailView->render(), 
    'Termine.html', 
    'text/html' 
)); 

Таким образом, вы должны проверить, почему ваша автозагрузка классов не работает. Вы пытались очистить кеш?

Для вашего второго вопроса: правильное заявление паров должно быть:

@param \Swift_Mime_Attachment $attachment 

Но я бы не сделать редирект, но $ this-> вперед. Для этого вам не требуется перенаправление на стороне клиента.Если это действие вызывается только с помощью других действий, я также рекомендую сделать его защищенную функцию вызова непосредственно из ваших действий:

$this->sendMail($to, $subject, $email_prefix, $msg, $email_suffix, $attachment) 

- EDIT -

Я рекомендую использовать байпас для крепления информация о функции для создания объекта вложения после SwitftMailer инициализации:

/** 
* 
* @param string $to 
* @param string $subject 
* @param string $email_prefix 
* @param string $msg 
* @param string $email_suffix 
* @param array $attachment 
*/ 
public function mailAction($to, $subject, $email_prefix, $msg, $email_suffix, $attachment = null) { 
    ... 
    if (is_array($attachment) && array_key_exist('content', $attachment) && array_key_exist('filename', $attachment) && array_key_exist('mime', $attachment)) { 
    $mail->attach(\Swift_Attachment::newInstance($attachment['content'], $attachment['filename'], $attachment['mime'])); 
    } 
    ... 
} 
+0

Я думаю, что есть проблема, подобная Джигалю в его ответе - у меня нет экземпляра '$ email ' но потому, что я хочу сначала создать экземпляр приложения. И, согласно его ответу, класс 'Swift_Attachment' загружается при создании класса' MailMessage'. Поэтому мне интересно, как создать экземпляр без класса mail, иначе idk, как я могу проверить ваш тип @param. Я нахожу ваше вперед и защищенное предложение очень полезным, спасибо! –

+1

Черт, чем я не правильно прочитал ответ ... Другим способом может быть обход содержимого, имени файла и mimetype функции, чтобы инициализировать его после создания почты. Я отредактировал мой ansewer. –

1
  1. В \TYPO3\CMS\Core\Mail\MailMessage для классов swiftmailer имеется require_once; они, похоже, не загружаются автоматически. Возможно, вы можете передать вложение как визуализированный HTML и создать объект Swift_Attachment после создания экземпляра объекта MailMessage?
  2. Если решение в 1. работает, это будет простая строка.
+0

есть способ, чтобы создать '\ Swift_Attachment' без создав объекты «MailMessage» раньше? Если это так, я должен использовать 'ext_autoload.php' для этого и что мне нужно написать в нем? В противном случае я должен, вероятно, создать массив со значениями для '-> setFilename()', '-> setContentType()' и '-> setBody()'. Но не уверен в строковом типе, потому что в некоторых случаях я хочу прикрепить файл .pdf. –

+1

Класс mailMessage имеет '// Удостоверьтесь, что автозагрузчик Swift зарегистрирован ↵ require_once PATH_typo3. 'contrib/swiftmailer/swift_required.php'; ' в файле (чуть выше объявления класса). (В версии 7 это лучше реализовано и все автозагружается) –

+0

Хорошо, что с нетерпением ждем при обновлении снова: D –

1

Как уже заявил Jigal ван Hemert вы можете создать только объекты вложений после создания объекта MailMessage, потому что класс не автозагрузки. Я просто передал вложение в качестве файла пути к вашей почтовой функции, и он должен обрабатываться там, а не снаружи.

if ($attachment) { 
    $email->attach(\Swift_Attachment::fromPath($attachment)); 
} 

На мой взгляд, это имеет смысл, если вы можете передать несколько файлов вместо одного, так что $attachment должен быть $attachments массив

 if(count($attachments)) { 
      foreach ($attachments as $name => $file) { 
       if(file_exists($file)) { 
        if(trim($name) && !is_numeric($name)) { 
         $email->attach(\Swift_Attachment::fromPath($file)->setFilename($name)); 
        } else { 
         $email->attach(\Swift_Attachment::fromPath($file)); 
        } 
       } 
      } 
     }