Php 通过Symfony Messenger执行邮件发送

Php 通过Symfony Messenger执行邮件发送,php,symfony,symfony4,api-platform.com,symfony-messenger,Php,Symfony,Symfony4,Api Platform.com,Symfony Messenger,我在寻找一个大的帮助与我的代码。 我尽我所能连接了一些Symfony功能,我想我会有所进展 我正在使用Symfony 4.2和API平台,并试图添加一个过程,即发送电子邮件消息以异步方式使用 我有我的注释实体,它在持久实体上触发它。它正在触发我的调用函数,但出现了一个问题。我不太明白下一步该怎么办 正如文档中所述,首先我需要配置数据持久器: <?php namespace App\DataPersister; use ApiPlatform\Core\DataPersister\Con

我在寻找一个大的帮助与我的代码。 我尽我所能连接了一些Symfony功能,我想我会有所进展

我正在使用Symfony 4.2和API平台,并试图添加一个过程,即发送电子邮件消息以异步方式使用

我有我的注释实体,它在持久实体上触发它。它正在触发我的调用函数,但出现了一个问题。我不太明白下一步该怎么办

正如文档中所述,首先我需要配置数据持久器:

<?php

namespace App\DataPersister;

use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
use ApiPlatform\Core\DataPersister\DataPersisterInterface;
use App\Entity\Comment;

final class EmailNotificationDataPersister implements ContextAwareDataPersisterInterface
{
private $decorated;
private $mailer;

public function __construct(ContextAwareDataPersisterInterface $decorated, \Swift_Mailer $mailer)
{
    $this->decorated = $decorated;
    $this->mailer = $mailer;
}

public function supports($data, array $context = []): bool
{
    return $this->decorated->supports($data, $context);
}

public function persist($data, array $context = [])
{
    $result = $this->decorated->persist($data, $context);

    if (
        $data instanceof Comment && (
            ($context['collection_operation_name'] ?? null) === 'post')
    ) {
        $this->sendWelcomeEmail($data);
    }

    return $result;
}

public function remove($data, array $context = [])
{
    return $this->decorated->remove($data, $context);
}

private function sendWelcomeEmail(Comment $comment)
{
    // Your welcome email logic...
    // $this->mailer->send(...);
}
}
和框架

messenger:
    transports:
        amqp: "%env(MESSENGER_TRANSPORT_DSN)%"

    routing:
        'App\Entity\Comment': amqp

还有,有没有办法向用户表中发布的任何随机邮件发送电子邮件?我想为此设置mailer配置。

对于异步运行操作,您需要。对于本地测试,symfony服务器和docker工作良好

#config/packages/messenger.yaml
transports:
    async: '%env(RABBITMQ_DSN)%'
在项目根目录下放置
docker compose.yaml

rabbitmq:
    image: rabbitmq:3-management
    ports: [5672, 15672]
运行控制台

docker-compose up -d
symfony server:start -d
symfony console messenger:consume async -vv
用于消费在控制台中运行的消息

docker-compose up -d
symfony server:start -d
symfony console messenger:consume async -vv

在生产过程中,您必须添加具有RABBITMQ、Amazon SQS等真实凭据的
RABBITMQ\u DSN
(或
MESSENGER\u TRANSPORT\u DSN
),并且可能用于消费消息。

Hi。首先,显示messenger和sendmail配置。其次,您可以在dataPersister类中使用
messageBus->dispatch
,这里不需要订阅服务器。您还需要使用
AsyncMessageInterface
创建消息。然后您可以在您的调用方法中使用
mailer->send($message)
。非常感谢您的重播!我更新了上面的帖子@EugeneRubanSo看,检查Symfony关于创建和发送电子邮件的文档。您只需创建新的电子邮件对象并使用mailer发送即可。
symfony console messenger:consume async -vv