在 Symfony 中发送邮件
最后修改于 2020 年 7 月 5 日
Symfony 邮件教程展示了如何在 Symfony 中发送简单邮件。Symfony 使用 SwiftMailer 来发送电子邮件。
Symfony
Symfony 是一套可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。Symfony 是免费软件,并带有一些商业插件。Symfony 的灵感来源于 Ruby on Rails、Django 和 Spring Framework。
SwiftMailer
SwiftMailer
是一个免费且功能丰富的 PHP 邮件发送库。Symfony 通过其 symfony/swiftmailer-bundle
集成了 SwiftMailer。
Symfony 发送邮件示例
在示例中,我们发送了一封简单的电子邮件。我们使用 Twig 来创建电子邮件模板。
设置应用程序
我们首先使用 composer 来设置应用程序。
$ composer create-project symfony/skeleton mail $ cd mail
我们创建一个新的 Symfony skeleton 项目,并进入新创建的项目目录。
$ composer req twig annotations monolog
我们安装 Web 应用程序所需的三个基本 Symfony 包。
$ composer req symfony/swiftmailer-bundle
我们安装 symfony/swiftmailer-bundle
。
$ composer req maker server --dev
我们安装开发所需的包:maker
和 server
。
... MAILER_URL=smtp://smtp.example.com:465?encryption=ssl&auth_mode=login&username=admin@example.com&password=s$cret
在 .env
文件中,我们设置 MAILER_URL
变量。它包含将要发送电子邮件的 SMTP 服务器。如果您是初学者,请避免使用 Gmail,因为由于 Gmail 的高安全性,正确设置 Gmail 是一项复杂的任务。
取而代之的是,使用您托管提供商的 SMTP 服务器,或使用 mailgun 或 mailtrap 等服务。提供商/服务会提供必要的选项,例如端口号和加密方式。
$ php bin/console make:controller TestMailController
我们创建一个 TestMailController
,其中包含一个用于发送电子邮件的简单链接。
<?php namespace App\Controller; use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class TestMailController extends AbstractController { /** * @Route("/test/mail", name="test_mail") */ public function index(Request $request, \Swift_Mailer $mailer, LoggerInterface $logger) { $name = $request->query->get('name'); $message = new \Swift_Message('Test email'); $message->setFrom('admin@zetcode.com'); $message->setTo('admin2@zetcode.com'); $message->setBody( $this->renderView( 'emails/mymail.html.twig', ['name' => $name] ), 'text/html' ); $mailer->send($message); $logger->info('email sent'); $this->addFlash('notice', 'Email sent'); return $this->redirectToRoute('home'); } }
在 TestMailController
的 index()
方法中,我们发送邮件。请注意,发送邮件的代码在生产应用程序中不应放在控制器中;它应该放在某个服务中。但出于简化的原因,我们将其放在这里。
public function index(Request $request, \Swift_Mailer $mailer, LoggerInterface $logger) {
我们注入 Request
、Swift_Mailer
和 logger。
$name = $request->query->get('name');
我们获取 GET 请求中使用的名称。
$message = new \Swift_Message('Test email'); $message->setFrom('example@example.com'); $message->setTo('example2@example.com');
我们创建了一个 Swift_Message
。发件人和收件人的电子邮件地址是硬编码的,以便使此示例更简单。您可以作为练习删除硬编码的值。(将源电子邮件设置为参数,从表单获取目标电子邮件。)
$message->setBody( $this->renderView( 'emails/mymail.html.twig', ['name' => $name] ), 'text/html' );
通过 setBody()
,我们设置了电子邮件的正文。renderView()
方法使用提供的 Twig 模板渲染视图。我们将 $name
变量传递给模板。
$mailer->send($message);
使用 send()
发送电子邮件。
$logger->info('email sent'); $this->addFlash('notice', 'Email sent');
我们记录并闪现一条消息。成功发送邮件后,会显示该闪现消息。
return $this->redirectToRoute('home');
我们重定向到主页,在那里会显示闪现消息。
Hi {{ name }}! You've got a test email. Thanks!
这是一个简单的电子邮件模板。
$ php bin/console make:controller HomeController
我们创建一个 HomeController
。它包含一个用于发送电子邮件的简单链接。
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class HomeController extends AbstractController { /** * @Route("/", name="home") */ public function index() { return $this->render('home/index.html.twig'); } }
HomeController
渲染主页。
{% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block stylesheets %} <style> .flash-notice { margin: 8px; padding-left: 8px; width: 150px; background-color: rgb(113, 241, 113) } .hide { opacity: 0; transition: opacity 1000ms; } </style> {% endblock %} {% block body %} <a href="/test/mail?name=Peter Novak">Send a test mail</a> {% for message in app.flashes('notice') %} <div id="flash-notice" class="flash-notice"> {{ message }} </div> {% endfor %} {% block javascripts %} <script src="main.js"></script> {% endblock %} {% endblock %}
主页包含一个发送电子邮件的链接。如果邮件已发送,我们会显示一个通知。可以通过单击此通知来隐藏它。
<style> .flash-notice { margin: 8px; padding-left: 8px; width: 150px; background-color: rgb(113, 241, 113) } .hide { opacity: 0; transition: opacity 1000ms; } </style>
我们为通知设置了一些样式。此外,hide
类提供了一个简单的淡出动画。动画通过将此类添加到通知元素中,在 JavaScript 中启动。
<a href="/test/mail?name=Peter Novak">Send a test mail</a>
此链接发出一个触发电子邮件发送的 GET 请求。我们在请求中发送了一个 name
属性。姓名是硬编码的;作为练习,您可以创建一个表单来指定姓名和目标电子邮件。
{% for message in app.flashes('notice') %} <div id="flash-notice" class="flash-notice"> {{ message }} </div> {% endfor %}
如果存在闪现消息,我们会显示它。
<script src="main.js"></script>
动画由 JavaScript 代码控制,该代码位于 main.js
文件中。
const flash = document.getElementById('flash-notice'); flash.addEventListener('click', function () { flash.classList.add('hide'); });
当我们单击闪现消息时,事件回调会将 hide
类添加到元素的类列表中,从而启动淡出动画。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %} {% endblock %} </head> <body> {% block body %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html>
这是基本的 Twig 模板。
在本教程中,我们展示了如何在 Symfony 中发送简单电子邮件。
列出 所有 Symfony 教程。
请参阅 Mailtrap 的 如何在 Symfony 中发送带示例的电子邮件。