everlutionsk / email-bundle-2
Everlution 邮件组件,用于 Symfony 框架
Requires
- php: >=5.4.0
- doctrine/orm: ^2.3
- symfony/config: ^2.6 || ~3.0 || ~4.0 || >=5.0
- symfony/dependency-injection: ^2.6 || ~3.0 || ~4.0 || >=5.0
- symfony/http-kernel: ^2.6 || ~3.0 || ~4.0 || >=5.0
README
这个 Symfony 组件提供通过各种邮件系统发送和接收邮件消息的机制。
安装
composer require everlutionsk/email-bundle-2
启用组件
// app/AppKernel.php public function registerBundles() { return array( // ... new Everlution\EmailBundle\EverlutionEmailBundle() ); }
配置组件
以下配置片段描述了如何配置组件。配置需要服务的名称,这些服务实现相应的接口。唯一的例外是 域名,其中您应设置类似于 appdomain.com 的内容。
# app/config/config.yml # Doctrine Configuration doctrine: orm: entity_managers: default: mappings: EverlutionEmailBundle: ~ # EmailBundle Configuration everlution_email: domain_name: APP_DOMAIN enforced_delivery_address: EMAIL_ADDRESS|NULL mail_system: Implementation of Outbound\MailSystem\MailSystem async_stream: Implementation of Support\Stream\Stream attachment_swappers: inbound: Implementation of Inbound\Attachment\AttachmentSwapper outbound: Implementation of Outbound\Attachment\AttachmentSwapper request_processors: inbound: Implementation of Inbound\RequestProcessor outbound_message_event: Implementation of Outbound\MessageEvent\RequestProcessor
mail_system - 用于发送邮件消息的服务名称。此服务通常与 SMTP 服务器或某些事务性邮件平台(如 Mandrill)进行通信。
enforced_delivery_address - [可选] 用于覆盖每条外发消息中的收件人地址的电子邮件地址。
async_stream - 组件允许异步发送邮件消息。邮件消息存储在内存中,直到向此 Stream 添加某个值。一个好的例子是 Symfony 的 kernel.terminate 事件 Stream。
attachment_swappers - 在发送或接收消息后,组件尝试使用此 附件交换器 保存消息的附件。这些交换器可以以各种方式保存附件。
request_processors - 组件提供处理 传入消息 和 外发消息事件 的通用机制。这些事件可能发生在例如外部 邮件系统 尝试发送计划中的消息时。然而,不同的 邮件系统 以不同的格式发送数据。请求处理器将此数据转换为此组件所知格式。
路由
组件提供处理 传入消息 和 外发消息事件 的控制器。
# Handle outbound message events. everlution.email.outbound_message_event: pattern: CUSTOM_PATTERN defaults: { _controller: everlution.email.outbound.message_event.controller:handleMessageEvent } methods: POST # Handle inbound messages. everlution.email.inbound: pattern: CUSTOM_PATTERN defaults: { _controller: everlution.email.inbound.controller:handleInbound } methods: POST
基本用法
创建新的外发消息
$message = new OutboundMessage(); $message->setSubject('Subject'); $message->setText('Message text.'); // Text for basic insight in email client. $message->setHtml('<img src="cid:logo">'); // Email body. $message->setFromEmail('support@example.com'); $message->setFromName('Sender name'); $message->setReplyTo('reply@example.com'); $message->setRecipients([ new ToRecipient('recipient@mail.com', 'Recipient name'), new CcRecipient('cc-recipient@mail.com', 'Cc recipient name'), new BccRecipient('bcc-recipient@mail.com', 'Bcc recipient name'), ]); $image = new BasicAttachment('image/png', 'logo', file_get_contents('logo.png')); $attachment = new BasicAttachment('application/pdf', 'document.pdf', file_get_contents('document.pdf')); $message->setImages([$image]); // Images included into email body. $message->setAttachments([$attachment]);
获取邮件发送器
同步邮件发送器 - 立即调用邮件系统。
$mailer = $this->get('everlution.email.outbound.synchronous_mailer');
异步邮件发送器 - 在向相应的 Stream 添加值后调用邮件系统。
$mailer = $this->get('everlution.email.outbound.asynchronous_mailer');
发送/安排消息
$mailer->sendMessage($message);
$mailer->scheduleMessage($message, new \DateTime('+ 30 minutes'));
高级用法
消息转换器
每个消息在转发到 邮件系统 之前都可以进行修改。
转换外发消息
注册实现 OutboundMessageTransformer 的服务并添加以下标签
everlution.email.outbound.message_transformer
转换传入消息
注册实现 InboundMessageTransformer 的服务并添加以下标签
everlution.email.inbound.message_transformer
消息模板
某些 邮件系统 支持消息模板,这些模板在该系统中定义。以下代码显示了如何使用这些模板。
$parameter = new Parameter('PARAMETER_NAME', 'PARAMETER_VALUE'); $template = new Template('TEMPLATE_NAME', [$parameter]); $message->setTemplate($template);
处理传入消息
传入消息可以通过监听 everlution.email.inbound
事件来处理。事件是 InboundEvent 的实例,包含有关 传入消息 和其 可存储版本(已保存到数据库中)的信息。
注意:如果应用程序不需要在数据库中创建与传入消息的关联,则应忽略消息的可存储版本。
模拟邮件系统
使用 everlution.email.mock.mail_system
服务作为邮件系统(请参阅 配置组件 部分)。