1

I want to send an email using crafts mailer in Craft 4. I've seen this post: How to send email from Craft 3 custom plugin?

But now I need this adapted for craft 4. Unfortunately I did not succeed so much.

I think something like this:

$mail = Craft::$app->mailer;

$mail->template = "My email template. How to use placeholders?"; $mail->send($message); // how do I set up that message? // where can I set the recipient address?

Links: https://docs.craftcms.com/api/v4/craft-mail-mailer.html#public-methods

I want to use the settings I have set in the CP:

enter image description here

I would be very thankful for an example, as the Craft 4 documentation is a bit to sparse for somebody like me .

Merc
  • 211
  • 1
  • 6

1 Answers1

3

You can do something like this

    $view               = Craft::$app->getView();
    $email              = 'example@example.com'
    $subject            = $view->renderString($messageSubject, $variables, View::TEMPLATE_MODE_SITE);
    $html               = $view->renderTemplate($template,$variables , View::TEMPLATE_MODE_SITE);
Craft::$app
    ->getMailer()
    ->compose()
    ->setTo($email)
    ->setSubject($subject)
    ->setHtmlBody($html)
    ->send();

aodihis
  • 801
  • 5
  • 10
  • Sorry to ask again... This looks promising, but I have still some noob questions:
    • what is the $template for example? Where can I define those, where can I get that?
    • What should the $variables array contain?

    The link here: https://docs.craftcms.com/api/v4/craft-mail-mailer.html#public-methods lists some but I still don't get how it works... :s

    • $messageSubject is just a string, right?
    • What is the View::TEMPLATE_MODE_SITE part?
    – Merc Feb 27 '23 at 13:50
  • 1
    @Merc, $template is your twig template path. $variables yes it is contain array. This contain variable you want to pass to your twig template, The View::TEMPLATE_MODE_SITE is option to identify Craft where they should search your template, so View::TEMPLATE_MODE_SITE is means is using the template folder you use normally.

    if you no need to render from twig template you can just put your html code inside the $html variable.

    – aodihis Feb 28 '23 at 03:21
  • Ah perfect. No I don't need a template. And thanks for all the other answers. I will try that! – Merc Feb 28 '23 at 08:59
  • I tried, for the sake of completeness, to render a twig template in my $html. But this line fails already: $view = Craft::$app->getView(); with this error: \"modules\\commentmodule\\controllers\\View\" not found", Is this related to: https://verbb.io/blog/everything-you-need-to-know-about-modules#templates > so I need to register views in my controller first? (I will try and report back here, if I find a solution :)) Sorry for all the beginners questions :S – Merc Feb 28 '23 at 09:17
  • I think I need to register the views, but I fail... I register the view like here (https://verbb.io/blog/everything-you-need-to-know-about-modules#templates) in my /modules/commentmodule/CommentModule.php.

    I have /modules/commentmodule/templates/emails/mail.twig and I try to render it $html = Craft::$app->getView()->renderTemplate('commentmodule/emails/mail.twig', $variables); – but then it will fail with Template could not be found. :(

    And I try to render that template within modules/commentmodule/controllers/MailController.php

    – Merc Feb 28 '23 at 09:37