为 MailMessage 创建附件
Creating an attachment for MailMessage
我想从我的 extbase 6.2 扩展发送不同的电子邮件。
在控制器 class 中,我写了一个邮件函数,如下所示:
(注意 $attachment
没有 @param
- 最后看我的问题)
/**
*
* @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));
我的问题:
- 如何在我的 extbase 扩展的控制器中成功创建类型为
Swift_Attachment
的对象(无需事先创建 MailMessage
对象并在其中创建附件) ?
- 我应该在
@param
之后放置什么作为我的邮件函数中 $attachment
变量的类型才能使它起作用?
-- 编辑 --
好吧,显然没有人这样做,因为这不是本意。
我现在使用 Rene 的方法,将其与 Dimitri 对多个附件的可扩展答案相结合。我的@param 现在是 array
因为我必须在实例化 MailMessage
之后创建实际的附件 - 谢谢!
- 在
\TYPO3\CMS\Core\Mail\MailMessage
中有一个 require_once
用于 swiftmailer 类;他们似乎没有自动加载。也许您可以将附件作为渲染 HTML 传递并在实例化 MailMessage
对象后创建 Swift_Attachment
对象?
- 如果 1. 中的解决方案有效,它将是一个简单的字符串。
在我的 6.2.25 扩展中,ist 没有任何包括:
$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']));
}
...
}
正如 Jigal van Hemert 所说,您只能在创建 MailMessage 对象后创建附件对象,因为 class 不会自动加载。我只是将附件作为文件路径传递给您的邮件功能,它应该在那里处理,而不是在外面处理。
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));
}
}
}
}
我想从我的 extbase 6.2 扩展发送不同的电子邮件。
在控制器 class 中,我写了一个邮件函数,如下所示:
(注意 $attachment
没有 @param
- 最后看我的问题)
/**
*
* @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));
我的问题:
- 如何在我的 extbase 扩展的控制器中成功创建类型为
Swift_Attachment
的对象(无需事先创建MailMessage
对象并在其中创建附件) ? - 我应该在
@param
之后放置什么作为我的邮件函数中$attachment
变量的类型才能使它起作用?
-- 编辑 --
好吧,显然没有人这样做,因为这不是本意。
我现在使用 Rene 的方法,将其与 Dimitri 对多个附件的可扩展答案相结合。我的@param 现在是 array
因为我必须在实例化 MailMessage
之后创建实际的附件 - 谢谢!
- 在
\TYPO3\CMS\Core\Mail\MailMessage
中有一个require_once
用于 swiftmailer 类;他们似乎没有自动加载。也许您可以将附件作为渲染 HTML 传递并在实例化MailMessage
对象后创建Swift_Attachment
对象? - 如果 1. 中的解决方案有效,它将是一个简单的字符串。
在我的 6.2.25 扩展中,ist 没有任何包括:
$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']));
}
...
}
正如 Jigal van Hemert 所说,您只能在创建 MailMessage 对象后创建附件对象,因为 class 不会自动加载。我只是将附件作为文件路径传递给您的邮件功能,它应该在那里处理,而不是在外面处理。
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));
}
}
}
}