Symfony2でメールを送る際にSwiftmailを利用しますが、テンプレート読み込みなどまとめてライブラリ化すると非常に便利に、素早くメールを送ることが出来ます。
ライブラリにまとめたので是非活用してみてください。
1.parameters.yml記述
parameters: swiftmailer.from: "noreply@example.com" swiftmailer.admin: "noreply@example.com" swiftmailer.name: "Sender Name"
2.config.yml記述
services: swiftmailer: class: App\CommonBundle\Classes\Swiftmailer arguments: ["@service_container", "@mailer"]
3.クラスを作成
App/CommonBundle/Classes/Swiftmailer に下記ファイル、2つのファイルを作成します。
App/CommonBundle/Classes/Swiftmailer/Swiftmailer.php App/CommonBundle/Classes/Swiftmailer/SwiftmailerConfigure.php
App/CommonBundle/Classes/Swiftmailer/Swiftmailer.php の内容
<?php namespace App\CommonBundle\Classes; use App\CommonBundle\Classes\SwiftmailerConfigure; use Symfony\Component\Security\Core\SecurityContextInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class Swiftmailer { private $serviceContainer; private $mailer; private $template_text; private $template_html; private $options; private $subject; private $admin; public $from; public $to; public function __construct($serviceContainer, $mailer) { new SwiftmailerConfigure(); $this->data_pack = array(); $this->serviceContainer = $serviceContainer; $this->mailer = $mailer; $this->from = array( $this->serviceContainer->getParameter('swiftmailer.from') => $this->serviceContainer->getParameter('swiftmailer.name') ); $this->admin = array( $this->serviceContainer->getParameter('swiftmailer.admin') => $this->serviceContainer->getParameter('swiftmailer.name') ); } public function setTemplate($template_name) { $this->template_text = 'AppCommonBundle:Swiftmailer:'.$template_name.'.text.twig'; $this->template_html = 'AppCommonBundle:Swiftmailer:'.$template_name.'.html.twig'; } public function debug() { return $this->prepare(); } private function prepare() { $template = $this->serviceContainer->get('templating'); if(!isset($this->data_pack['options'])) $this->data_pack['options'] = array(); $html_body = $template->render($this->template_html, $this->data_pack['options']); $text_body = $template->render($this->template_text, $this->data_pack['options']); $message = \Swift_Message::newInstance() ->setCharset('iso-2022-jp') ->setEncoder(new \Swift_Mime_ContentEncoder_PlainContentEncoder('7bit')) ->setSubject( $this->subject ) ->setFrom( $this->from ) ->setBody($text_body, 'text/plain', 'iso-2022-jp') ->addPart($html_body, 'text/html', 'iso-2022-jp'); $message->setTo($this->to); return $message; } public function send() { $message = $this->prepare(); $this->mailer->send( $this->prepare() ); } public function setTo($to, $to_name) { $this->to = array($to => $to_name); } public function setFrom($from_mail, $from_name) { $this->from = array($from_mail => $from_name); } public function setSubject($subject) { $this->subject = $subject; } public function setEnclosure($file_path) { $this->data_pack['enclosure'] = $file_path; } public function setOptions($options) { $this->data_pack['options'] = $options; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'App\CommonBundle\Classes\Swiftmailer' )); } public function getAdmin(){ return $this->admin; } public function getName() { return 'swiftmailer'; } public function __toString(){ return $this->prepare()->toString(); } }
App/CommonBundle/Classes/Swiftmailer/SwiftmailerConfigure.php の内容
<?php namespace App\CommonBundle\Classes; class SwiftmailerConfigure { public function __construct() { $this->configureSwiftMailer(); } protected function configureSwiftMailer(){ \Swift::init(function () { \Swift_DependencyContainer::getInstance() ->register('mime.qpheaderencoder') ->asAliasOf('mime.base64headerencoder'); \Swift_Preferences::getInstance()->setCharset('iso-2022-jp'); }); } }
4.SwiftmailerConfigure()をBundleのgetParent()やコンストラクタに実装
App/UserBundle/UserBundle.phpなどのBundleクラスの親にSwiftmailerConfigureを実装します。もっといい方法があるかもしれませんが。これはここで実装するSwiftmailerのコンテナとは別にFOSUserBundleなどでメールが送信される際に日本語がしっかりと文字化けせずに送信するようにエンコードなどの初期化を行っています。
<?php namespace App\UserBundle; use App\CommonBundle\Classes\SwiftmailerConfigure; use Symfony\Component\HttpKernel\Bundle\Bundle; class AppUploadBundle extends Bundle { public function getParent() { new SwiftmailerConfigure(); } // .... }
5.Swiftmailerのメールテンプレートを準備
App/CommonBundle/Resources/views/Swiftmailer/mail.text.twig App/CommonBundle/Resources/views/Swiftmailer/mail.html.twig
の2つを準備します。mail という名前でテンプレートを作成すると、メール送信時にこのmailというキーワードを利用することになります。text, htmlの2つを準備してください。テンプレートはTwigテンプレートで記述します。{{ entity.title }} や {{ entity.email }} という感じです。
6.Swiftmailerをから送信する
$swiftmailer = $this->get('swiftmailer'); $swiftmailer->setTo('to@example.com', 'Your Name'); $swiftmailer->setTemplate('mail'); // template name "mail" $swiftmailer->setSubject('TEST SUBJECT'); $swiftmailer->setOptions(array('entity' => $entity)); // i.g.
これでメールが送信されるかと思います。
メールが送信されない場合はparametersなどを確認して下さい。例えば
parameters: mailer_transport: sendmail mailer_host: 127.0.0.1 mailer_user: null mailer_password: null
この辺りに問題がある気がしますので確認して下さい。あとは問題があるとしたらキャッシュをクリアしたりしてみてください。