2016-10-30 28 views
0

私のextbase 6.2拡張機能から、別の電子メールを送信したいと思います。私が作成しようとしたメール機能を呼び出す関数で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"; 
    } 
} 

から
(最後に私の質問を参照してください$attachmentための@paramに気付かない):私はこのようになりますメール機能を書いたコントローラクラスで
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. どのように成功した(事前にMailMessageオブジェクトを作成し、その中の添付ファイルを作成せずに)私のextbase延長のコントローラタイプSwift_Attachmentのオブジェクトを作成することができますか?
  2. の変数として@paramを入力すると、これを機能させるためのメール機能に何が追加されますか?

- EDIT -

オクラホマので、明らかに誰もあることを意味していないのでことしません。
私は、Reneの手法を複数の添付ファイルに対するDimitriのスケーラブルな回答と組み合わせて使用​​しました。私の@paramはarrayになりました。私は実際の添付ファイルをインスタンス化した後に作成する必要があるので、MailMessage - ありがとう!

答えて

1

は、いずれかを含むせずに動作します。キャッシュをクリアしようとしましたか? 2番目の質問に

:正しいのparam宣言は次のようになります。

@param \Swift_Mime_Attachment $attachment 

しかし、私は前方にリダイレクト、しかします$ this->をすることはないだろう。これのためにクライアント側でリダイレクトする必要はありません。私はバイパスに添付ファイルを使用することをお勧めします

-

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

- EDIT:このアクションは、唯一の他の作用によって呼び出された場合、私はまた、保護機能させることをお勧めANあなたの行動から直接呼び出します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'オブジェクトがインスタンス化されていません私は最初に添付ファイルをインスタンス化したいからです。そして彼の答えによると、 'Swift_Attachment'クラスは' MailMessage'クラスをインスタンス化するときにロードされます。だから、メールクラスなしでインスタンス化する方法、それ以外の場合は@param型をどのようにテストすることができるのだろうか。 私はあなたの前方および保護された提案が非常に有用な、感謝を見つける! –

+1

くそー、答えを正しく読まないより...もう一つの方法は、メール作成後にコンテンツ、ファイル名、およびMIMEタイプを関数にバイパスして、関数を初期化することです。私は私のansewerを編集しました。 –

1
  1. \TYPO3\CMS\Core\Mail\MailMessageには、swiftmailerクラス用にrequire_onceがあります。彼らはオートロードされていないようです。多分、レンダリングされたHTMLとして添付ファイルを渡し、MailMessageオブジェクトをインスタンス化した後にSwift_Attachmentオブジェクトを作成することはできますか?
  2. 1.のソリューションがうまくいく場合は、単純な文字列になります。

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

    だから、クラスのあなたの自動ロードが動作しませんなぜあなたは確認する必要があります:6.2.25イストのための私の延長で

+0

でなければなりませんので、あなたは、代わりに1の複数のファイルを渡すことができれば、私の意見では

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

は、それは '\ Swift_Attachment'せずに作成する方法があり、より理にかなっています前に 'MailMessage'オブジェクトを作成しましたか?もしそうなら、私は 'ext_autoload.php'を使ってそれを書いておけばいいですか?そうでなければ、おそらく ' - > setFilename()'、 ' - > setContentType()'と ' - > setBody()'の値を持つ配列を作るべきです。しかし、場合によっては.pdfファイルを添付したいので、文字列型についてはわかりません。 –

+1

mailMessageクラスは です。 '// Swiftのオートローダーが登録されていることを確認してください。 require_once PATH_typo3。 'contrib/swiftmailer/swift_required.php'; ' (クラス宣言のすぐ上)。 (これはよりよく実装されていて、すべてが自動ロードされています) –

+0

もう一度アップグレードすることを楽しみにしています:D –

1

は、すでに述べたように、あなたがはMailMessageオブジェクトを作成した後、クラスが自動的にロードされていないので、あなただけの添付ファイルのオブジェクトを作成することができますJigalバンHemertで述べました。私はあなたのメール機能へのファイルパスとして添付ファイルを渡すだけで、外部ではなくそこで処理する必要があります。 $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)); 
        } 
       } 
      } 
     } 
関連する問題