symfony4 でSwiftMailer を使ってメールを送信する作業の記録です。
Symfony4 でClass を作る時は、Symfony\Bundle\FrameworkBundle\Controller\AbstractController を継承して Class を作ることが推奨されています。ただ、AbstructController を使うと制約が厳しく「$this->get(‘mailer’);」でメールオブジェクトを取得できません。制約の緩い Controller を継承すれば良いのですが推奨外だし・・・・
getSubscribedServices()を使って SwiftmailerBundle を登録しても、dev環境では動きますが、prodの環境にすると上手く動きません。
素直にSymfony Documentにある方法で作ることにします。
Composer からインストールします。
Symfony をインストールしているディレクトリに移動します。
[xxxx]$ composer require symfony/swiftmailer-bundle
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 ###
メールの送信クラスを作成します。ディレクトリーは 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; }