为 MailMessage 创建附件

问题描述 投票:0回答:3

我想通过我的 extbase 6.2 扩展发送不同的电子邮件。
在控制器类中,我编写了一个邮件函数,如下所示:
(注意

@param
没有
$attachment
- 请参阅最后我的问题)

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

php typo3 extbase typo3-6.2.x
3个回答
1
投票

在我的 6.2.25 扩展中,它可以正常工作,不包含任何内容:

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

所以你应该检查为什么你的类自动加载不起作用。您是否尝试过彻底清除缓存?

对于你的第二个问题:正确的参数声明应该是:

@param \Swift_Mime_Attachment $attachment

但我不会进行重定向,而是进行 $this->forward。为此,您不需要在客户端进行重定向。如果此操作仅由其他操作调用,我还建议将其设为受保护的函数,并直接从您的操作中调用它:

$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']));
  }
  ...
}

1
投票
  1. \TYPO3\CMS\Core\Mail\MailMessage
    中,有一个
    require_once
    用于 swiftmailer 类;它们似乎没有自动加载。也许您可以将附件作为渲染的 HTML 传递,并在实例化
    Swift_Attachment
    对象后创建
    MailMessage
    对象?
  2. 如果 1. 中的解决方案有效,它将是一个简单的字符串。

1
投票

正如 Jigal van 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));
                    }
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.