Symfony2のSwiftmailer便利ライブラリ公開


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

この辺りに問題がある気がしますので確認して下さい。あとは問題があるとしたらキャッシュをクリアしたりしてみてください。

  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です