Swiftmailer decoration
Probeer op dit moment een mailfunctie te maken in symfony met swiftmailer en de decorator plugin hiervan. De bedoeling is dat ik in het mailtje naar elk persoon een 'naam' parameter meegeef die in de body van het bericht terechtkomt. Ik heb dit nu gemaakt aan de hand van de voorbeeldcodes op de swiftmailer site.
Ik zit nu met 1 probleem en dat is dat het mailtje wel wordt aangepast maar alleen voor de 1e persoon. De volgende personen in de lijst krijgen dus exact hetzelfde mailtje als de 1e persoon (met daarin dus ook de naam van de 1e persoon). De mails gaan er dus wel uit alleen wordt het niet correct bij iedereen doorgevoerd.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$replacements = array();
$gebruikers = array();
$gebruikers[] = array('email' => '[email protected]', 'naam' => 'Kees');
$gebruikers[] = array('email' => '[email protected]', 'naam' => 'Sjaak');
foreach($gebruikers as $gebruiker)
{
$replacements[$gebruiker['email']] = array(
'{naam}'=>$gebruiker['naam']
);
}
//Registreer de plugin
$plugin = new \Swift_Plugins_DecoratorPlugin($replacements);
$this->get('mailer')->registerPlugin($plugin);
//Maak bericht aan
$message = \Swift_Message::newInstance()
->setSubject('Hallo {naam}')
->setFrom("[email protected]")
->setBody("Beste {naam},<br>Dit is een bericht","text/html");
foreach ($gebruikers as $gebruiker) {
$message->addTo($gebruiker['email']);
}
//Verstuur bericht
$this->get('mailer')->send($message);
//Toon een response
return new Response('<h1>Het is verstuurd</h1>');
$gebruikers = array();
$gebruikers[] = array('email' => '[email protected]', 'naam' => 'Kees');
$gebruikers[] = array('email' => '[email protected]', 'naam' => 'Sjaak');
foreach($gebruikers as $gebruiker)
{
$replacements[$gebruiker['email']] = array(
'{naam}'=>$gebruiker['naam']
);
}
//Registreer de plugin
$plugin = new \Swift_Plugins_DecoratorPlugin($replacements);
$this->get('mailer')->registerPlugin($plugin);
//Maak bericht aan
$message = \Swift_Message::newInstance()
->setSubject('Hallo {naam}')
->setFrom("[email protected]")
->setBody("Beste {naam},<br>Dit is een bericht","text/html");
foreach ($gebruikers as $gebruiker) {
$message->addTo($gebruiker['email']);
}
//Verstuur bericht
$this->get('mailer')->send($message);
//Toon een response
return new Response('<h1>Het is verstuurd</h1>');
De mails komen wel gewoon aan dus de instellingen staan ok (gebruik nu gmail als instelling).
Code (php)
1
2
3
4
5
6
2
3
4
5
6
//Uit config.yml
swiftmailer:
transport: "gmail"
host: "%mailer_host%"
username: "[email protected]"
password: "xxx"
swiftmailer:
transport: "gmail"
host: "%mailer_host%"
username: "[email protected]"
password: "xxx"
Alleen krijg iedereen in de array gebruikers hetzelfde bericht als Kees heeft (dus de 1e die erin staat)
Voor zover ik kan zien heb ik alles goed gedaan alleen wil hij het laatste stukje niet goed doen. Heeft iemand hier een idee waar het aan kan liggen? Alvast bedankt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
public function indexAction($name)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('[email protected]')
->setTo('[email protected]')
->setBody(
$this->renderView(
// app/Resources/views/Emails/registration.html.twig
'Emails/registration.html.twig',
array('name' => $name)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'Emails/registration.txt.twig',
array('name' => $name)
),
'text/plain'
)
*/
;
$this->get('mailer')->send($message);
return $this->render(...);
}
?>
public function indexAction($name)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('[email protected]')
->setTo('[email protected]')
->setBody(
$this->renderView(
// app/Resources/views/Emails/registration.html.twig
'Emails/registration.html.twig',
array('name' => $name)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'Emails/registration.txt.twig',
array('name' => $name)
),
'text/plain'
)
*/
;
$this->get('mailer')->send($message);
return $this->render(...);
}
?>
Gewijzigd op 13/05/2015 12:55:16 door Frank Nietbelangrijk
Dat had ik eerst maar om uit te sluiten dat het door het twigtemplate niet goed ging heb had ik gewoon een testje in de body gezet.
Daarna adviseer ik een (private) functie te maken die slechts één email verstuurd. Deze functie verwacht dan als parameter een user entity.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
/**
* User controller.
*
* @Route("/user")
*/
class UserController extends Controller
{
/**
* Mail to all Users.
*
* @Route("/sendmail", name="sendmail_users")
* @Method("GET")
* @Template()
*/
public function emailAction($name)
{
$em = $this->getDoctrine()->getManager();
$users = $em->getRepository('AppBundle:User')->findAll();
foreach($users as $user)
$this->sendmail($user);
return array(
'users' => $users,
);
}
private function sendmail(User $user)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('[email protected]')
->setTo($user->getEmail())
->setBody(
$this->renderView(
// app/Resources/views/Emails/registration.html.twig
'Emails/registration.html.twig',
array('user' => $user)
),
'text/html'
);
$this->get('mailer')->send($message);
}
}
?>
/**
* User controller.
*
* @Route("/user")
*/
class UserController extends Controller
{
/**
* Mail to all Users.
*
* @Route("/sendmail", name="sendmail_users")
* @Method("GET")
* @Template()
*/
public function emailAction($name)
{
$em = $this->getDoctrine()->getManager();
$users = $em->getRepository('AppBundle:User')->findAll();
foreach($users as $user)
$this->sendmail($user);
return array(
'users' => $users,
);
}
private function sendmail(User $user)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('[email protected]')
->setTo($user->getEmail())
->setBody(
$this->renderView(
// app/Resources/views/Emails/registration.html.twig
'Emails/registration.html.twig',
array('user' => $user)
),
'text/html'
);
$this->get('mailer')->send($message);
}
}
?>
Gewijzigd op 13/05/2015 17:47:36 door Frank Nietbelangrijk
Een email sturen is op zich het probleem niet dat gaat helemaal goed. Ik vond alleen die decorator functie zo mooi dat je de placeholders kan laten invullen (met de replacements) krijg het alleen nog niet goed voor elkaar maar ben er nog mee bezig.
Dat kan toch ook met een template?