2016-10-30 66 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. 我怎樣才能成功地創建我的extbase擴展的控制器Swift_Attachment類型的對象(而無需事先創建一個MailMessage對象和創建它裏面的附件)?
  2. @param作爲我的郵件函數中的$attachment變量的類型後應該如何工作?

- 編輯 -

好了,顯然沒有一個人是因爲它並不意味着是。
我現在使用Rene的方法將它與Dimitri的可擴展的答案結合起來用於多個附件。我的@param現在是array,因爲我必須在實例化MailMessage後創建實際附件 - 謝謝!

回答

1

在我的擴展6.2.25 IST工作沒有任何包括:

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

所以,你應該檢查爲什麼你的類自動加載不起作用。您是否嘗試清除緩存完成?

你的第二個問題:正確的PARAM聲明應該是:

@param \Swift_Mime_Attachment $attachment 

但我不會做一個重定向,而是$這個 - >前進。你不需要在客戶端進行重定向。如果這個動作只能由其他動作叫我還建議,使其成爲一個受保護的功能,直接從你的行動稱之爲:

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

- 編輯 -

我建議使用旁路附件信息的函數來創建安裝對象的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

我認爲這就是Jigal在他的答案中說的問題 - 我沒有實例化$ email對象但是因爲我想先實例化附件。根據他的回答,在實例化MailMessage類時,會加載Swift_Attachment類。所以我想知道如何在沒有郵件類的情況下實例化它,否則我會怎麼測試你的@param類型。 我發現你的轉發和受保護的建議非常有幫助,謝謝! –

+1

該死的,比我沒有正確地閱讀答案...另一種方式可能是繞過內容,文件名和mimetype函數來創建郵件後初始化它。我編輯了我的ansewer。 –

1
  1. \TYPO3\CMS\Core\Mail\MailMessage存在用於swiftmailer類一個require_once;他們似乎不自動加載。也許您可以將附件作爲呈現的HTML傳遞並在實例化MailMessage對象後創建Swift_Attachment對象?
  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';' (位於類聲明之上)。 (在v7中這是更好的實現,一切都自動加載) –

+0

好的東西期待再次升級時:D –

1

正如已經Jigal凡赫默特指出創建對象MAILMESSAGE後,因爲該類沒有自動載入你只能創建連接對象。我只是將附件作爲文件路徑傳遞給您的郵件功能,應該在那裏處理,而不是在外面處理。

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

在我看來它更有意義,如果你可以傳遞的,而不是一個多個文件,所以$attachment應該是一個​​陣列

 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)); 
        } 
       } 
      } 
     } 
相關問題