独り言


Symfony4 で SwiftMailer を使ってSJISのメールを送る


symfony4 でSwiftMailer を使ってメールを送信する作業の記録です。
Symfony4 でClass を作る時は、Symfony\Bundle\FrameworkBundle\Controller\AbstractController を継承して Class を作ることが推奨されています。ただ、AbstructController を使うと制約が厳しく「$this->get(‘mailer’);」でメールオブジェクトを取得できません。制約の緩い Controller を継承すれば良いのですが推奨外だし・・・・
getSubscribedServices()を使って SwiftmailerBundle を登録しても、dev環境では動きますが、prodの環境にすると上手く動きません。
素直にSymfony Documentにある方法で作ることにします。


  1. Swift Mailer のインストール

    Composer からインストールします。

    Symfony をインストールしているディレクトリに移動します。
    [xxxx]$ composer require symfony/swiftmailer-bundle
    
  2. SwiftMailer の設定

    Symfony4 では.env ファイルで設定します。
    ここではローカルの Sendmail を使用しています。

    Symfony インストールディレクトリ/.env
    # This file is a "template" of which env vars need to be defined for your application
    # Copy this file to .env file for development, create environment variables when deploying to production
    # https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
    
    ###> symfony/framework-bundle ###
    APP_ENV=dev
    APP_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    #TRUSTED_PROXIES=127.0.0.1,127.0.0.2
    #TRUSTED_HOSTS=localhost,example.com
    ###< symfony/framework-bundle ###
    
    ###> symfony/swiftmailer-bundle ###
    # For Gmail as a transport, use: "gmail://username:password@localhost"
    # For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
    # Delivery is disabled by default via "null://localhost"
    #MAILER_URL=null://localhost <=ここをコメントアウト
    MAILER_URL=sendmail://localhost <=Sendmailを指定
    ###< symfony/swiftmailer-bundle ###
    
  3. メールの送信クラスを作成

    メールの送信クラスを作成します。ディレクトリーは src/Mail とすればよいと思います。
     ・SJISでメールを送信する設定です。
     ・$to は送信先のアドレスです。
     ・$from は送信者のアドレスです。['mailaddress' => '送信者名'] のように指定すれば送信者名も設定できます。
     ・$subject はメールタイトル
     ・$body はメール本文
     ・$view はtwig のテンプレートです。ここでは twig を使ってメールテンプレートを呼び込んでいます。

    src/Mail/SendMail.php
    <?php
    namespace App\Mail;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    
    class SendMail extends AbstractController // AbstructController を継承して作ります。
    {
        private $mailer;
    
        public function __construct(\Swift_Mailer $mailer)
        {
            $this->mailer = $mailer;
        // SJIS(iso-2022-jp)を使用するための設定をします
            \Swift_DependencyContainer::getInstance()
                ->register('mime.qpheaderencoder')
                ->asAliasOf('mime.base64headerencoder');
    
            \Swift_Preferences::getInstance()->setCharset('iso-2022-jp');
        }
        
      // メールを送信する関数です
        public function send($to, $from, $subject, $body, $view)
        {
            $message = (new \Swift_Message($subject))
                ->setFrom($from)
                ->setTo($to)
                ->setBody(
                    $this->renderView($view, $body) // ここでは twig の機能を使用してテンプレートを呼び込ませます
                );
            try { // メールの送信にー失敗すると'メールの送信に失敗しました。'を、成功するとfalse を返します。
                if (!$this->mailer->send($message)) {
                    throw new \Exception('メールの送信に失敗しました。');
                }
                return false;
            } catch(\Exception $e) {
                return $e->getMessage();
            }
        }
    }
    

    メールのテンプレートは以下のようにします。

    templates/emails/reply_mail.twig
    
    {{ user_name }} 様
    
    お問い合わせありがとうございました。
    
    早急にご回答をいたしますが、ご質問の内容によっては回答までに多少お時間を
    いただく場合がございます。
    ご了承の程、よろしくお願いいたします。
    
    お問い合わせ日時:{{ inquiry_time }}
    
    

    コントローラーからの呼び出しは以下のようにします。

    src/Controller/コントローラー
    
        public function send(POST で取得した配列)
        {
            .....//
            $inquiry_time = date('Y年m月d日 H:i:s');
            $fromAddress  = 'メール送信アドレス';
            $fromName     = '送信者名';
            $toAddress    = POSTで取得したユーザーメールアドレス;
    
            // サンクスメール
            $subject = 'お問合せありがとうございます。';
            $body = [
                'user_name'    => $data['user_name'], <=twig がテンプレートの値を置き換えてれます 
                'inquiry_time' => $inquiry_time       <=twig がテンプレートの値を置き換えてれます 
            ];
            if ($message = $this->sendMail->send($toAddress, [$fromAddress => $fromName], $subject, $body, 'emails/reply_mail.twig')) {
                return $message;
            }
    
    

    ページのトップへ

wordprass