企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
{% raw %} # 在 Symfony 中发送邮件 > 原文: [http://zetcode.com/symfony/mail/](http://zetcode.com/symfony/mail/) 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`建立应用。 ```php $ composer create-project symfony/skeleton mail $ cd mail ``` 我们创建一个新的 Symfony 骨架项目,然后进入新创建的项目目录。 ```php $ composer req twig annotations monolog ``` 我们安装了 Web 应用所需的三个基本 Symfony 包。 ```php $ composer req symfony/swiftmailer-bundle ``` 我们安装`symfony/swiftmailer-bundle`。 ```php $ composer req maker server --dev ``` 我们安装了用于开发的包:`maker`和`server`。 `.env` ```php ... 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 $ php bin/console make:controller TestMailController ``` 我们创建一个`TestMailController`,其中包含一个用于发送电子邮件的简单链接。 `src/Controller/TestMailController.php` ```php <?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()`方法中,我们发送电子邮件。 请注意,发送电子邮件的代码不应在生产应用的控制器中。 它应该在某种服务。 但是出于简单原因,我们将其保留在此处。 ```php public function index(Request $request, \Swift_Mailer $mailer, LoggerInterface $logger) { ``` 我们注入`Request`,`Swift_Mailer`和记录器。 ```php $name = $request->query->get('name'); ``` 我们获取在 GET 请求中使用的名称。 ```php $message = new \Swift_Message('Test email'); $message->setFrom('example@example.com'); $message->setTo('example2@example.com'); ``` 创建了`Swift_Message`。 `from`和`to`电子邮件值经过硬编码,以简化此示例。 您可以删除硬编码的值作为练习。 (将源电子邮件设置为参数,从表单中获取目标电子邮件。) ```php $message->setBody( $this->renderView( 'emails/mymail.html.twig', ['name' => $name] ), 'text/html' ); ``` 使用`setBody()`,我们设置电子邮件的正文。 `renderView()`方法从提供的 Twig 模板渲染视图。 我们将`$name`变量传递给模板。 ```php $mailer->send($message); ``` 电子邮件带有`send()`发送。 ```php $logger->info('email sent'); $this->addFlash('notice', 'Email sent'); ``` 我们登录&闪烁一条消息。 成功发送电子邮件后,将显示即显消息。 ```php return $this->redirectToRoute('home'); ``` 我们重定向到显示 Flash 消息的主页。 `templates/emails/myemail.html.twig` ```php Hi {{ name }}! You've got a test email. Thanks! ``` 这是电子邮件的简单模板。 ```php $ php bin/console make:controller HomeController ``` 我们创建一个`HomeController`。 它包含一个用于发送电子邮件的简单链接。 `src/Controller/HomeController.php` ```php <?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`呈现主页。 `templates/home/index.html` ```php {% 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 %} ``` 主页包含用于发送电子邮件的链接。 如果发送了电子邮件,我们会显示一条通知。 单击此通知可以将其隐藏。 ```php <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 中启动动画。 ```php <a href="/test/mail?name=Peter Novak">Send a test mail</a> ``` 此链接发出触发电子邮件的 GET 请求。 我们随请求发送一个`name`属性。 名称是硬编码的; 作为练习,您可以创建一个表单,该表单将指定名称和目标电子邮件。 ```php {% for message in app.flashes('notice') %} <div id="flash-notice" class="flash-notice"> {{ message }} </div> {% endfor %} ``` 如果有即时消息,我们将其显示。 ```php <script src="main.js"></script> ``` 动画由位于`main.js`文件中的 JavaScript 代码控制。 `public/main.js` ```php const flash = document.getElementById('flash-notice'); flash.addEventListener('click', function () { flash.classList.add('hide'); }); ``` 当我们单击 Flash 消息时,事件回调将`hide`类添加到元素的类列表中,从而启动淡出动画。 `templates/base.html.twig` ```php <!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 简介](/symfony/intro/), [Symfony 服务教程](/symfony/service/), [Symfony 请求教程](/symfony/request/), [Symfony Flash 消息](/symfony/flash/) , [Symfony 表单教程](/symfony/form/), [PHP 教程](/lang/php/)。 请参阅 Mailtrap 的[如何在 Symfony 中发送电子邮件的示例](https://blog.mailtrap.io/send-emails-in-symfony/)。 {% endraw %}