ステップ20:管理者へメールを送信する

5.2版本
保持 不明意

管理者へメールをを信する

良いフィードバックをするために,管理者はすべてのコメントをモデレートする必要があります。コメントが火腿potential_spamの状態であったなら,メールが管理者へ送られるようにします。そして,そのメールには,コメントを受理するか拒否するかの2つリンクを入れるようにします。< / p >

まず,欧宝娱乐app下载地址symfony mailerコンポーネントコンポーネントインストールします:< / p >

1
$ 欧宝娱乐app下载地址symfony作曲家要求邮件

管理者のメールアドレスを設定する

管理者のメールアドレスを格納するには,コンテナのパラメーターを使用します。デモとして(実際に使うべきではありません),環境変数からセットすることも可能です。コンテナの绑定设定で,管理者のメールアドレス必要なサービスに注入するに定义します< / p >

patch_file.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
——/ config / services.yaml+ + + b / config / services.yaml@@ -4,6 + 4,7 @@#PLE参数在此处不需要更改应用程序部署的每台计算机#//www.oldmanjams.com/doc/current/best_practics/configuration.html#applicat欧宝娱乐app下载地址ion-related-configuration参数:+ default_admin_email:[电子邮件受保护]*this*文件中服务的默认配置@@ -13,6 +14,7 @@服务:绑定:$ photoDir:“%内核。project_dir % /公共/上传/照片”akismetKey美元:“% env (AKISMET_KEY) %”+ $ adminemail:“%env(string:default:default_admin_email:admin_email)%”这将为每个id为完全限定类名的类创建一个服务

環境変数が使用される前に”処理された”状態になるかもしれません。ここでは,ADMIN_EMAILの環境変数が存在しなければ,デフォルトのプロセッサーを使使用してdefault_admin_email.パラメーターの値にフォールバックするようにします。< / p >

通知メールを送信する

メールを送信する际,低レベルの消息や高レベルのnotificationEmail.といった,いくつかの电子邮件クラスのアブストラクションから选ぶことができます。ほとんどほとんどの合,电子邮件クラスクラスを使うことになります,内部的なメールにおいて,notificationEmail.がが最适な选択选択肢になりなり< / p >

メッセージハンドラー内の自动バリデーションのロジックを入れ替えましょ< / p >

patch_file.
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -7,6 +7,8 @@使用app \ repository \ commentRepository;使用app \ spamchecker;使用doctrine \ orm \ entityManagerInterface;使用psr \ log \ loggerInterface;+使用sy欧宝娱乐app下载地址mfony \ bridge \ twig \ mime \ notificationemail;+使用Sy欧宝娱乐app下载地址mfony \ \梅勒\ MailerInterface组件;使用sy欧宝娱乐app下载地址mfony \ component \ messenger \ handler \ messageHandlerInterface;使用sy欧宝娱乐app下载地址mfony \ component \ messenger \ MessageBusInterface;使用sy欧宝娱乐app下载地址mfony \ component \ workflow \ workflowinterface;@@ -18,15 +20,19 @@ class CommentMessageHandler实现MessageHandlerInterface私人commentRepository美元;私人美元总线;私人美元工作流;+私人$邮箱;+私人adminEmail美元;私人美元记录器;- 公共功能__Construct(EntityManagerInterface $ EntityManager,Spamchecker $ Spamchecker,CommentRepository $ CommentRepository,MessageBusInterface $总线,WorkFlowInterface $ CommentStateMachine,LoggerInterface $ logger = null)+公共功能__Construct(EntityManagerInterface $ EntityManager,Spamchecker $ Spamchecker,CommentRepository $ CommentRepository,MessageBusInterface $总线,Workflinterface $ CompougeStateMachine,MailerInterface $ Mailer,String $ Adminemail,LoggerInterface $ logger = null){$this->entityManager = $entityManager;$ this - > spamChecker = $ spamChecker;$ this - > commentRepository = $ commentRepository;$ this - >总线= $总线;= $ $ this - >工作流commentStateMachine;$this->mailer = $mailer;+ $ this-> adminemail = $ adminemail;$ this - >日志记录器= $记录器;}@@ -51,8 +57,13 @@类CommentMessageHandler实现messagehandler接口$ this - >总线- >调度($消息);} elseif ($this->workflow->can($comment, 'publish') || $this->workflow->can($comment, 'publish_ham')) {-  $以下 - >工作流 - >申请($评论,$以下 - >工作流 - > can($评论'发布')?'publish':'publish_ham');-  $ this-> entitymanager-> flush();+ $ this - >梅勒- >发送((新NotificationEmail ())+  - >主题('新评论发布')+  - > htmltemplate('电子邮件/ comment_notification.html.twig')+  - >来自($ this-> adminemail)+ - - - > ($ this - > adminEmail)+  - >上下文(['评论'=> $评论])+);} elseif ($this->logger) {$this->logger->debug(' drop comment message', ['comment' => $comment->getId(), 'state' => $comment->getState()]);}

MainInterface ()は,メール送信のエントリーポイントで,send ()メソッドを使用してメールを送ることができるようになっています。< / p >

メールを诚信するに,センダー(/发送方ヘッダー)が必要です。电子邮件のインスタンスに明示的に設定するのではなく、グローバルに定義してください:< / p >

patch_file.
1 2 3 4 5 6 7 8
——/ config /包/ mailer.yaml+++ b / config / packages / mailer.yaml@@ -1,3 +1,5 @@框架:mailer: dsn: '%env(MAILER_DSN)%'+信封:+发件人:“%env(string:default:default_admin_email:admin_email)%”

通知メールのテンプレートを拡張する

通讯,SYMFONYををインス欧宝娱乐app下载地址トールした际のの知知メールテンメールテンを継承していますの継承していい:< / p >

模板/电子邮件/ comment_notification.html.twig
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{%延伸'@电子邮件/默认/ notification / body.html.twig'%}{%内容%}作者:{{评论。答案}}
电子邮件:{{comment.email.}}
状态:{{评论.State.}}

{{comment.text}}< / p >{%endblock%}{%行动%} <按钮href =“{{url“review_comment”,idcomment.id.})}}“>接受> < /按钮<按钮href =“{{url“review_comment”,idcomment.id.,拒绝真的})}}“>拒绝{%endblock%}

テンプレートには,メールメールのメッセージをカスタマイズできるがありありのでのでをで管拒否するがのを追か拒否するかののししましょましょましょましょしましょましょないルートルートはは字てましょないないルートパラメーターはは字拒否ましょましょないないパラメーターはは字字としてましょとしてと字は字字字としてとしてとしてととは字字字としてとしてとしてとと字字字列としてとしてとしてとしてとはは字字列としてとしてとしてとと字字字列としてとしてとしてととは字字列としてとしてととれ字字列列としてとしてとしてとしてとして字れ字字列としてとしてととれ(例えば,拒否するurlは/ admin /评论/评论/审查/ 42?拒绝= trueのようになります)。< / p >

notificationEmail.のデフォルトのテンプレートは,メールを装飾するのにHTMLではなく,漆黑的を使用します。漆黑的は、ほとんどのメールクライアントに互換性のあるレスポンシブなメールを作ってくれます。< / p >

メールリーダーへの互換性のため,通知メールのベースのレイアウトは,デフォルトで全てのスタイルシートをインラインにします(CSSインライナーパッケージが使われます)。< / p >

これらの2つの機能は,树枝拡張のオプショナルな機能で,別にインストールする必要があります:< / p >

1
$ 欧宝娱乐app下载地址Symfony Composer Req“Twig / Cssinler  - 额外:^ 3”“树枝/墨西哥 - 额外:^ 3”

コマンド内で絶対URLを生成する

メールにおいては,路径()の代わりにurl ()を使用して,スキームやホストなどの情報も入っている絶対URLを生成してください。< / p >

コンソールのコンテキストで,メッセージハンドラーからメールが送らます.webのコンテキストでは,现处于ののスキームやドメインわかる绝対urlを生成するは简体ですです,コンソールのコンテストが,コンソールのコンテストははいきませませませませませんんん。< / p >

ドメイン名とスキームを明示的に定義する< / p >

patch_file.
12 3 4 5 6 7 8 9 10 11 12 13 14
——/ config / services.yaml+ + + b / config / services.yaml@@ -5,6 +5,111 @@# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/best_practices/configuration.html#application-related-configuration参数:default_admin_email:[电子邮件受保护]+ default_domain: 127.0.0.1的+ default_scheme:“http”++ router.request_context.host.host:'%env(默认值:default_domain:欧宝娱乐app下载地址symfony_default_route_host)%'+ router.request_context。方案:' % env(默认值:default_scheme: SYMFON欧宝娱乐app下载地址Y_DEFAULT_ROUTE_SCHEME) % '*this*文件中服务的默认配置

欧宝娱乐app下载地址symfony_default_route_host.欧宝娱乐app下载地址SYMFONY_DEFAULT_ROUTE_PORTの环境変数は,欧宝娱乐app下载地址CLIでは自動的にローカルに設定されます。また,欧宝娱乐app欧宝体育应用最新版app下载下载地址SymfonyCloudの際は設定をベースに指定されます。< / p >

コントローラーコントローラーへのルートルートをワイヤー

点评_Comment.ルートはまだ作成していないので,管理控制器でハンドルするように作成しましょう:< / p >

src /控制器/ AdminController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 32 32 32 29 32 32 32 32 32 32 42 42 43 42 43 44 44 44 44 49 49 49 49 45 49 49 4051 52 53.
名称空间App \ Controller.使用应用实体\ \发表评论使用应用\ \ CommentMessage消息使用Doctrine \ orm \ entityManagerInterface使用欧宝娱乐app下载地址symfony \ bundle \ frameworkbundle \ controller \ AbstractController使用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件请求使用欧宝娱乐app下载地址Symfony \ HttpFoundation \ \组件响应使用欧宝娱乐app下载地址Symfony \ \信使\ MessageBusInterface组件使用欧宝娱乐app下载地址Symfony \ Component \ Routing \ Annotation \ Route使用欧宝娱乐app下载地址Symfony \工作流组件\ \注册表使用树枝\环境AdminController延伸AbstractController.私人美元的树枝私人$ EntityManager.私人美元的公共汽车公共函数__construct环境美元的树枝,EntityManagerInterface.$ EntityManager.,MessageBusInterface美元的公共汽车$这一点- >枝条美元的树枝$这一点- >entityManager$ EntityManager.$这一点- >公共汽车美元的公共汽车}#(路线(' / admin /评论/审查/ {id}’,名字:“review_comment”))公共函数reviewComment要求美元的请求,评论$评论,注册表美元注册表响应$接受美元的请求- >询问- >得到'拒绝');美元的机器美元注册表- >得到$评论);如果美元的机器- >可以$评论,'发布'))美元转换$接受'发布''拒绝'}eleesif美元的机器- >可以$评论,“publish_ham”))美元转换$接受“publish_ham”“reject_ham”}其他的返回新的响应“已经在正确的状态下审查了”评论“。);}美元的机器- >申请$评论,美元转换);$这一点- >entityManager- >fl();如果$接受$这一点- >公共汽车- >调度新的CommentMessage$评论- >getid.()));}返回$这一点- >使成为“管理/ review.html.twig”,“过渡”=>美元转换,“评论”=>$评论,]);}}

前前のステップで定义定义しようよう,コメントをレビューするurlは/行政/から始まり,前のステップで定義したファイアーウォールで保護されます。管理者は,このリソースへアクセスするのに認証が必要です。< / p >

响应インスタンスを作成するのではなく,ベースクラスのAbstractController.にある呈现()メソッドを使用しました。< / p >

レビューが終わったら,簡単なテンプレートで管理者へ感謝しましょう:< / p >

模板/ admin / review.html.twig
1 2 3 4 5 6 7 8
{%延伸“base.html.twig”%}{%身体%}

评论收到,谢谢!< / h2 >

应用转换:{{过渡}}< /强> < / p >< p >新状态:< >强{{评论.State.}}< /强> < / p >{%endblock%}

メールキャッチャーを使用する

“本当の“SMTPやメール送信のサードパーティプロバイダーを使用するのではなく,メールキャッチャーを使ってみましょう。メールキャッチャーは,メールを実際に送信しないSMTPサーバーです。そして、Webインターフェースでそのメールの内容を確認することができます:< / p >

1 2 3 4 5 6 7 8 9 10
——/ docker-compose.yaml+ + + b / docker-compose.yaml@@ -8,3 +8,7 @@服务:postgres_password:main postgres_db:主端口:[5432]++梅勒:+图片:schickling / mailcatcher+端口:[1025,1080]

メールキャッチャーを追加するには,コンテナを再起動してください:< / p >

1 2
$ docker-compose up $ docker-compose up

邮件捕获者をを知らない状态状态な,メッセージのコンシューマーも止める必要があり< / p >

1
$ 欧宝娱乐app下载地址symfony控制台消息:停止工人

そして再び起动词。今度今度mailer_dsn.が自动的に利用できるできるにます:< / p >

1
$ 欧宝娱乐app下载地址symfony run -d——观察Config,SRC,Templates,供应商Symf欧宝娱乐app下载地址ony Console Messenger:消耗Async
1
$睡眠10.

网页メールへアクセスする

ターミナルから网页メールを开启ことが可です:< / p >

1
美元欧宝娱乐app下载地址symfony开放:本地:邮箱

网页デバッグツールバーからも可です:< / p >

コメントを投稿すると,webメールのインターフェースで,メールを受け取るはずです:< / p >

Webメールのインターフェースからメールのをクリックして,コメントコメントを定理もしくは拒否しみましょ< / p >

期间どおりに动作しない合并は,服务器:日志でログをチェックしてください。< / p >

長時間実行するスクリプトを管理する

长时间行程されるれるスクリプトににははは気気べきべきべきべきべきべきべき.httpで使われるphpのモデルではリクエストはな状态开头さますが,メッセージの取得行,バックグラウンドで継続はメッセージれれますますます�ようにクリアすべきか否かを确认してください。< / p >

非同期にメールを送信する

メッセージハンドラーに送られたメールの送信は時間がかかることもあります。また,例外が投げられるかもしれません。メッセージを処理しているときに例外が投げられたときには,リトライを行います。しかし,コメントメッセージの取得実行をリトライするのではなく,メールの送信のみをリトライした方がより良いです。< / p >

すでにこのやり方针ているメールですメールメールメールメールををををてて。< / p >

MailerInterfaceのインスタンスは,次の処理を行います。メッセージバスが定義されていたら,メールを送るのではなく,メール・メッセージをディスパッチします。コードを修正する必要はありません。< / p >

しかし,まだメール送信でキューを使用するように設定していないので,このままではメッセージバスがメールを同期的に送信してしまいます。またRabbitMQを使用しましょう:< / p >

patch_file.
1 2 3 4 5 6 7
——/ config /包/ messenger.yaml+ + + b / config /包/ messenger.yaml@@ -19,3 +19,4路由:#路由你的消息到传输应用程序\消息\评论消息:async+ 欧宝娱乐app下载地址Symfony \组件\梅勒\ \ SendEmailMessage使者:异步

コメント・メッセージとメール・メッセージの両方でRabbitMQのような同じトランスポートを使用していますが,異なるようにすることも可能です。たとえば,メッセージの優先度を管理するために別のトランスポートを使うことも可能です。別のトランスポートを使用すると,異なるワーカーマシンでメッセージを処理することも可能になり,とても柔軟です。< / p >

メールをテストする

メールをテストするするに函数のありありますます。< / p >

各メール毎のクラスを作成するのであれば,ユニットテストを書くことが可能です(电子邮件,TemplateEmailを拡张することで)。< / p >

ここで書くテストのほとんどは,アクションがメールをトリガーするかをチェックしたり,メールの内容の確認の機能テストになります。< / p >

欧宝娱乐app下载地址Symfonyはこういったテストを簡単にするアサーションがビルトインされています。下記はアサーション機能の使い方を示すサンプルのテストです:< / p >

12 3 4 5 6 7 8 9 10 11 12 13 14
公共函数testMailerAssertions()美元的客户静态::createClient();美元的客户- >请求'得到',' / ');$这一点- >assertEmailCount1);美元的事件$这一点- >getMailerEvent0);$这一点- >Assertemailisqueued.美元的事件);$电子邮件$这一点- >getMailerMessage0);$这一点- >assertEmailHeaderSame$电子邮件,”到“,[电子邮件受保护]);$这一点- >assertEmailTextBodyContains$电子邮件,“酒吧”);$这一点- >assertEmailAttachmentCount$电子邮件,1);}

同期,非同期関係なく,メール送信時のアサーションは動作します。< / p >

欧宝娱乐app欧宝体育应用最新版app下载下载地址SymfonyCloudでメールを送信する

欧宝娱乐app欧宝体育应用最新版app下载下载地址SymfonyCloudでは,特別な設定は必要ありません。全てのアカウントは,SendGridのアカウントが付いてくるので,メール送信の際には,自動的にそのアカウントが使用されます。< / p >

漆黑的で使用するPHPエクステンションのxslをインクルードするよう,s欧宝娱乐app欧宝体育应用最新版app下载下载地址ymfonycloudの设定を変更する必要あります:< / p >

patch_file.
1 2 3 4 5 6 7 8 9 10
--- a /欧宝娱乐app下欧宝体育应用最新版app下载载地址 .symfony.cloud.yaml+ + + b欧宝娱乐app下欧宝体育应用最新版app下载载地址 / .symfony.cloud.yaml@@ -4,6 + 4,7 @@ type:php:7.4运行时:扩展:+  -  XSL.- pdo_pgsql - apcu - mbstring

注釈< / p >

安全のために,デフォルトでは,メールは掌握ブランチのみで送られます。掌握ブランチ以外で送るにはSMTPを明示的に有効化してください:< / p >

1
$ 欧宝娱乐app下载地址symfony env:设置:设置电子邮件

  • «前ステップ19:ワークフローを使って判定する
  • 下一个”ステップ21:パフォーマンス向上のためにキャッシュする

这个工作,包括代码示例,是根据Creative Commons By-NC-SA 4.0许可证。< / p >