【问题标题】:PHP Symfony 2.8 Swiftmailer bundle 2.5, create message with PDF attachment from codePHP Symfony 2.8 Swiftmailer bundle 2.5,从代码创建带有 PDF 附件的消息
【发布时间】:2017-09-11 14:22:42
【问题描述】:

我正在尝试使用 Symfony 2.8 和 SwiftMailer Bundle 2.5 创建一个 SwiftMailer 消息,在其中我将带有​​简单 HTML 消息的 PDF 发送到一个地址。我可以发送电子邮件,但是所有示例代码都使用了诸如 addPart() 和 attach() 之类的方法,这些方法在Swift_Message 给出的方法列表中不存在,而且我找不到任何使用其他方法的示例。

我从渲染的 Twig 模板创建 PDF,然后创建一条消息以将其附加到

$pdf = $this->get('knp_snappy.pdf')->getOutputFromHtml($response);

$message = \Swift_Message::newInstance()
                ->setSubject('Hello Email')
                ->setFrom('send@example.com')
                ->setTo('recipient@example.com')
                ->setBody(
                    $this->renderView(
                    // app/Resources/views/Emails/registration.html.twig
                        'Emails/registration.html.twig',
                        array('name' => "test")
                    ),
                    'text/html'
                );

附件: $attachment = \Swift_Attachment::newInstance($pdf, $pdf_name, 'application/pdf');

两者

$message->addPart($attachment, $contentType = "application/pdf", $charset = null);

$message->attach(\Swift_Attachment::fromPath('/path/to/image.jpg')->setFilename('myfilename.jpg'));

方法根本不存在。

奇怪的是,突出显示的消息说

Method 'attach' not found in class \Swift_Mime_MimePart less...
Referenced method is not found in subject class.

但是鉴于Swift_Mime_MimePart 类在类层次结构中向上几层并且从未在代码中直接调用或引用,因此我无法弄清楚它的来源或如何正确调用消息类.

【问题讨论】:

  • 我觉得这里缺少一些代码会显示问题。您能否包含从创建$message 变量到尝试运行attach() 方法的所有代码?
  • @Augwa - 它几乎是直接从 Swiftmailer 文档本身swiftmailer.org/docs/messages.html 复制而来的,这就是我如此困惑的原因。我创建消息,然后立即尝试attach() 。中间应该有代码吗?
  • 我也尝试过重新安装整个捆绑包。我可以尝试回滚到旧版本以查看是否可以修复它,但是许多其他捆绑包都依赖于这个捆绑包,例如 FOSUserBundle,所以我认为它本身会带来一系列问题。
  • 我认为这不是问题所在。你说你说它是pretty much straight,这并不完全意味着。我有 99.9% 的把握,如果您发布请求的所有代码,错误就会自行显现。
  • 如果你只是做$message = \Swift_Message::newInstance()->attach(...); 会不会出错?

标签: php symfony email email-attachments swiftmailer


【解决方案1】:

查看所有调用的单个方法,它们都以return $this 结尾,它以泛型类型返回对象的实例,该方法位于层次结构的最低层。

由于 PHP 中没有泛型类型加载,因此 setBody 返回 Swift_Mime_MimePart 而其他方法返回 Swift_Mime_SimpleMessage,而不是 ? extends Swift_Mime_MimePart? extends Swift_Mime_SimpleMessage。因为该示例将消息设置在同一个链中,并且setBody 是最后调用的方法,所以$message 现在是Swift_Mime_MimePart,而不是Swift_Messageattach() 方法和其他方法所在的位置。

因此解决方案非常简单;将调用放在不同的行上,以便 $message 保持Swift_Message

$message = \Swift_Message::newInstance();
$message->setSubject('Hello Email')
$message->setFrom('send@example.com')
$message->setTo('recipient@example.com')
$message->setBody(
                    $this->renderView(
                    // app/Resources/views/Emails/registration.html.twig
                        'Emails/registration.html.twig',
                        array('name' => "test")
                    ),
                    'text/html'
                );
$attachment = \Swift_Attachment::newInstance($pdf, $pdf_name, 'application/pdf');
$message->attach($attachment);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多