この記事は以下のサイトを、 DeepL版プロの翻訳家 テンプレートを使用して翻訳して引用しています。AI翻訳のため一部訳がおかしい箇所がありましたらご容赦ください。
背景
swiftmailer は保守されなくなり Symfony Mailerに置き換えられます 。
この新しいモジュールは、この記事の執筆時点ではまだアルファ リリース中です (アルファ 10)。 これは、このモジュールの最初の概要と実装です。 テスト目的で、バックオフィス アプリケーションにモジュールをインストールし、HTML 電子メール通知でメッセージを送信することを目的としたモジュール ek_messaging のカスタム開発を実装しました。 バックオフィス ツールとこの特定のモジュールの詳細については、 ドキュメント を参照してください。
インストール
Symfony Mailer をインストールする最良の方法は、composer を使用することです。
composer require drupal/symfony_mailer
https://www.drupal.org/project/symfony_mailer
このモジュールは Drupal 9.1 以降と互換性があることに注意してください。 モジュールがインストールされたら、通常 Drupal モジュールを有効にするのと同じように有効にできます。
2 つのモジュールがあり、1 つ目はコア メーラー モジュールで、2 つ目は swiftmailer との下位互換性を管理します。 電子メールを送信するインストールまたはモジュールが Swiftmailer を使用するように構成されている場合は、これを有効にする必要があります。
![symfony モジュール](https://arrea-systems.com/sites/arrea-systems.com/files/inline-images/symailermodules.jpeg)
もしくは、Drushコマンドを使用してインストールすることも可能です。
drush pm:install symfony_mailer
移行手順
すでに Swiftmailer を使用している場合、移行は自動化されます。 swifmailer 設定を symfony メーラーに自動的にインポートされます。インストール完了後にSWIFTMAILERから移行されたポリシーがデフォルトに設定されています。
symfony メーラーモジュールのドキュメントで はすでにプロセスの詳細が説明されているため、ここでは割愛します。
手動で設定する
ここでは、SMTPを使用してメール送信を行う場合について設定方法を記載しています。
Configuration -> System -> Mailer policyを選択して、メーラ設定画面を表示します。
Transportタグを選択します。
Transport TypeでSMTPを選択します。
![TRANSPORT](/sites/default/files/inline-images/image_30.png)
SMTP情報を設定します。
![Edit Transport](/sites/default/files/inline-images/image_31.png)
最後に、作成したメーラーポリシー(設定)をデフォルトに変更します。
![DEFAULT SETTING](/sites/default/files/inline-images/image_32.png)
以上で設定は完了です。
テストメールの送信
テストタブを選択して、テストメールを送信して正しく設定できていることを確認します。
Recipientに送信先メールアドレスを設定します。
![テスト構成](https://arrea-systems.com/sites/arrea-systems.com/files/inline-images/symfony-test-config.jpeg)
メーラー ユーザー インターフェイスを使用すると、各電子メール タイプおよびサブタイプ (swifmailer 開発ではモジュールおよびキーとして認識されます) ごとに電子メール ポリシーを直接編集および変更できます。 モジュールのドキュメントには次のように記載されています。
適用できるポリシーは次のとおりです。 件名、 アドレス (送信元、宛先、など)、本文、テーマ、トランスポート設定、プレーンテキストへの変換。 各ポリシーは全体に対して設定を適用することも、特定の種類の電子メールに対してのみ設定を適用することも可能です。
プログラムでメールを送信する方法
以下のサイトより引用させて頂き、翻訳・加筆しました。
Sending Emails with Drupal Symfony Mailer
By Jigariu
要件
ユーザーが自分のアカウントにログインできる Drupal Web サイトがあるとします。 セキュリティ上の理由から、次のイベントに関してユーザーに電子メール通知を送信することにしました。
- アカウントにログインするとき。
- アカウントからログアウトするとき。
この記事では、上記の電子メール通知を実現するコードを作成します。
手順
この記事の執筆時点では、Drupal + Symfony Mailer の統合は Drupal Symfony Mailer モジュールによって提供されています。 Drupal の新しい Email API を使用する場合は、このモジュールを (Composer を使用して) インストールする必要があります。
さらに、電子メールを送信するためのコードを含むカスタム モジュールを作成する必要があります。 この例では、custom_email_example
モジュールを使用しました .
手順1 : 電子メール ビルダーを作成する
hook_mail()
で行っていた処理は Email Builder クラスによって実行されるようになりました。 ここで電子メールのタイプとサブタイプを定義します。 @EmailBuilderアノテーションを持つ
次のプラグインを作成することで可能です。
namespace Drupal\custom_email_example\Plugin\EmailBuilder;
/**
* Email Builder plug-in for the custom_email_example module.
*
* @EmailBuilder(
* id = "custom_email_example",
* sub_types = {
* "login" = @Translation("Login notification"),
* "logout" = @Translation("Logout notification"),
* },
* common_adjusters = {"email_subject", "email_body"},
* )
*/
class ExampleEmailBuilder extends EmailBuilderBase { ... }
特筆すべきは、::build()
メソッドです。 電子メール オブジェクトの構築時に EMAILの各種設定を変更することができます。 電子メールの件名、本文などの初期値や変数・パラメータを設定することが可能です。
# In the class ExampleEmailBuilder.
public function build(EmailInterface $email) {
$email->setFrom('noreply@jigarius.com');
$email->setVariable('ip', $_SERVER['REMOTE_ADDR']);
}
変数(ip)は、電子メールの件名や本文で使用できます。 (TWIGテンプレート内で{{ ip }}
)
![](/sites/default/files/inline-images/image_26.png)
手順2: デフォルトの定義を作成する
昔は hook_mail()
このアプローチでは、電子メールの内容をハードコーディングするか、管理者が 電子メールの内容を変更 できるように構成 UI を提供するという面倒なプロセスを経ることになります。 Symfony Mailer のアプローチでは、電子メールのコンテンツはメーラー ポリシーによって管理されます。 このようなポリシーは Drupal の設定の一部であるため、(設定の変換を使用して) オーバーライドおよび変換できます。
![電子メール ポリシーを編集して電子メール コンテンツを構成するスクリーンショット](https://jigarius.com/sites/default/files/styles/rte_desktop/public/2023-10/drupal%20symfony%20mailer%20-%20email%20content.png?itok=5ydfzwOQ)
この例では、電子メール通知のデフォルトの件名と本文を作成し 、構成をエクスポートして、それをモジュールの config/install
ディレクトリに置きます。 以下は、サブジェクトと本文を定義するポリシーの例です。
# symfony_mailer.mailer_policy.custom_email_example.login.yml
# ...
id: custom_email_example.login
configuration:
email_body:
content:
value: |-
<h4>Logged in</h4>
<p>Hello user.</p>
<p>This is to notify you that you have logged into your account on <a href="[site:url]">[site:name]</a> from the IP Address <strong>{{ ip }}</strong>.</p>
<p>Regards.</p>
format: email_html
email_subject:
value: 'Logged into [site:name]'
電子メールの本文または コンテンツは、 いくつかの標準トークンと、渡される変数をサポートしていることに注意してください。 電子メールビルダークラス内::setVariable()
。 これは、管理者が[構成] > [システム] > [メーラー] ページから編集できます 。 ポリシーを有効にするには、ポリシーを有効にするを設定する必要があります。
手順3 : 電子メールを送信する
この時点で、面倒な作業は完了です。
不足しているのは、電子メール メッセージを送信するコードだけです。 この API は今のところ機能しますが、変更される可能性があります。
$emailFactory = \Drupal::service('email_factory');
$emailFactory->sendTypedEmail('custom_email_example', 'login', $account->getEmail());
カスタム パラメーターと変数を含むより複雑な電子メールを送信する場合は 、もう少し作業が必要になります。 面白いのは、コードが非常にオブジェクト指向であることです。
use Drupal\symfony_mailer\Address as EmailAddress;
$email = $emailFactory->newTypedEmail('custom_email_example', 'logout')
->setTo($account->getEmail())
->setCc(new EmailAddress('r2d2@example.com', 'R2D2'))
// This will be available as a Twig variable in the email body.
->setVariable('account', $account);
$email->send();
これは、このチュートリアルの準備中に Mailpit の受信箱で受信したテスト電子メールのスクリーンショットです。 Mailpit は Mailhog に似たユーティリティです。 ローカルの Ddev 環境 から送信された電子メールをキャッチします 。
![Mailpit 受信箱のサンプルメールのスクリーンショット](https://jigarius.com/sites/default/files/styles/rte_desktop/public/2023-10/drupal%20symfony%20mailer%20-%20email%20example.png?itok=Pg9unU-y)
総括
Drupal が API の最新化を続け、OOP に向けてますます移行するにつれて、物事を行うための新しいバージョンが次々と登場しています。 Drupal は Symfony に大きく依存しているため、Symfony Mailer を使用して電子メールを送信するのは自然であり、歓迎されるアップグレードであることは驚くべきことではありません。
新しい電子メール API を使用すると、モジュール開発者は 電子メールの送信にオブジェクト指向のプラグインを活用した アプローチを使用できるようになります。 同時に、管理者は 電子メールのコンテンツを簡単に定義したり翻訳したり、また管理者画面上で様々な設定を行うことも可能になります。
参考
https://www.drupal.org/project/symfony_mailer
Drupal: swiftmailer is abandoned, use symfony mailer (part 1)
Replace swiftmailer and mailsystem by Symfony Mailer
https://jigarius.com/blog/drupal-symfony-mailer
サンプルプログラムはこちらから入手可能です
https://github.com/jigarius/drupal-custom-email-example/