2016-10-30 5 views
0

Von meiner extbase 6.2-Erweiterung möchte ich verschiedene E-Mails senden.
In einer Controller-Klasse schrieb ich eine E-Mail-Funktion, die wie folgt aussieht:
(keine @param für $attachment bemerken - meine Frage am Ende sehen)Erstellen eines Anhangs für 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"; 
    } 
} 

In einer Funktion, die die Mail-Funktion I ruft versuchte die Schaffung eine Anlage wie diese, aber es sagen fehlgeschlagen: Fatal error: Class 'Swift_Attachment' not found in.../...Controller.php

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

Dann rufe ich die E-Mail-Funktion wie folgt aus:

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

Meine Fragen:

  1. Wie kann ich ein Objekt vom Typ Swift_Attachment in einer Steuerung meiner extbase Erweiterung erfolgreich erstellen (ohne MailMessage Objekt vorher zu schaffen und die Anlage in der es zu schaffen)?
  2. Was soll ich nach @param als die Art meiner $attachment Variable in meine Mail-Funktion für dieses zu arbeiten?

- EDIT -

Ok, also offenbar nicht niemand, weil es zu sein, nicht gemeint.
Ich habe jetzt Renes Ansatz kombiniert mit Dimitri skalierbare Antwort für mehrere Anhänge. Mein @param ist jetzt array, weil ich den tatsächlichen Anhang nach der Instanziierung MailMessage erstellen muss - danke!

Antwort

1

In meiner Erweiterung für 6.2.25 ist arbeitet ohne einschließlich:

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

So sollten Sie überprüfen, warum Ihr automatisches Laden von Klassen funktionieren nicht. Haben Sie versucht, den Cache vollständig zu löschen?

Um Ihre zweite Frage: die richtige param Erklärung sollte sein:

@param \Swift_Mime_Attachment $attachment 

Aber ich würde nicht eine Umleitung machen, aber ein $ this-> nach vorn. Sie benötigen dafür keine Umleitung auf der Client-Seite.Wenn diese Aktion nur durch eine andere Aktion aufgerufen wird, ich empfehle es auch eine geschützte Funktion machen einen nennen es direkt von Ihrer Aktion:

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

- EDIT -

Ich empfehle die Anlage zu verwenden Bypass Informationen zur Funktion des Attachment-Objekt erstellen, nachdem die SwitftMailer initialisiert wurde:

/** 
* 
* @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

Ich denke, da ist das Problem, wie Jigal in seiner Antwort sagte - ich habe nicht das $ email Objekt instanziiert noch, weil ich den Anhang zuerst instanziieren möchte. Und nach seiner Antwort wird die Klasse 'Swift_Attachment' geladen, wenn die Klasse' MailMessage' instanziiert wird. Also frage ich mich, wie man es ohne die Mail-Klasse instanziiert, sonst IDK wie ich deinen @Param-Typ testen könnte. Ich finde Ihren vorwärts und geschützten Vorschlag sehr hilfreich, danke! –

+1

Verdammt, als ich die Antwort nicht richtig gelesen ... Eine andere Möglichkeit könnte sein, den Inhalt, den Dateinamen und den MIME-Typ an die Funktion zu übergeben, um sie nach der Mail-Erstellung zu initialisieren. Ich habe meine Antwort bearbeitet. –

1
  1. In \TYPO3\CMS\Core\Mail\MailMessage gibt es eine require_once für die Swiftmailer-Klassen; Sie scheinen nicht automatisch geladen zu werden. Vielleicht können Sie den Anhang als gerenderten HTML-Code übergeben und das Objekt Swift_Attachment erstellen, nachdem Sie das Objekt MailMessage instanziiert haben?
  2. Wenn die Lösung in 1. funktioniert, wäre es eine einfache Zeichenfolge.
+0

ist es eine Möglichkeit, ein '\ Swift_Attachment' ohne zu erstellen "MailMessage" -Objekte vorher erstellt? Wenn ja, sollte ich 'ext_autoload.php' dafür verwenden und was müsste ich darin schreiben? Ansonsten sollte ich wohl ein Array mit den Werten für '-> setFilename()', '-> setContentType()' und '-> setBody()' machen. Aber ich bin nicht sicher über den String-Typ, weil ich in einigen Fällen eine PDF-Datei anhängen möchte. –

+1

Die mailMessage-Klasse hat '// Stellen Sie sicher, dass der automatische Ladevorgang von Swift registriert ist ◦ require_once PATH_typo3. 'contrib/swiftmailer/swift_required.php'; ' in der Datei (direkt über der Klassendeklaration). (In v7 ist dies besser implementiert und alles wird automatisch geladen) –

+0

In Ordnung, wenn Sie wieder upgraden: D –

1

Wie bereits von Jigal van Hemert angegeben Sie die Befestigungs Objekte nur erstellen können, nachdem Sie das Mailmessage-Objekt erstellen, da die Klasse nicht automatisch geladen wird. Ich würde den Anhang einfach als Dateipfad an Ihre Mail-Funktion übergeben und sie sollte dort und nicht außerhalb behandelt werden.

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

Meiner Meinung nach ist es sinnvoller, wenn Sie mehrere Dateien anstelle von einem passieren kann, so dass die $attachment ein $attachments Array sein sollte

 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)); 
        } 
       } 
      } 
     } 
Verwandte Themen