how to render an emailbody

72 views Asked by At

I'd like to use a view as an email body.

I tried this one:

    $renderer = new PhpRenderer();

    $bodyHtml = $renderer->render(
        '/user/email/reset-password-email',
        [
            'passwordResetUrl' => $passwordResetUrl,
        ]);

    $html = new MimePart($bodyHtml);

I get the following error:

Unable to render template "/user/email/reset-password-email"; resolver could not resolve to a file

My view-template is located in: enter image description here

Any help appreciated.

2

There are 2 answers

0
Gautam Rai On BEST ANSWER

To render view as string, you need a renderer "ViewRenderer".

If you can get ServiceManager, then,

$renderer = $serviceManager->get('ViewRenderer');

Now,

 $bodyHtml = $renderer->render(
        '/user/email/reset-password-email',
        [
            'passwordResetUrl' => $passwordResetUrl,
        ]);

    $html = new MimePart($bodyHtml);
2
Ermenegildo On

You need to retrieve the renderer from the service locator in the factory, and not instantiating it directly in the class where you are using it.

Email sender class factory

class EmailSenderFactory {
    public function __invoke($services) {
        $viewRenderer = $services->get('ViewRenderer');
        return new EmailSender($viewRenderer);
    }
}

Email sender class

class EmailSender {

    private $viewRenderer;

    public function __construct($viewRenderer) {
        $this->viewRenderer = $viewRenderer;
    }

    public function createEmail() {
        $template = '/user/email/reset-password-email';
        $variables = ['passwordResetUrl' => $passwordResetUrl];
        $bodyHtml = $renderer->render($template, $variables);
        $html = new MimePart($bodyHtml);
    }
}

I had the same problem (sending an email for password reset) and I solved this way. Hope this will help you :)