{% raw %}
在 Symfony 中发送邮件
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 骨架项目,然后进入新创建的项目目录。
$ composer req twig annotations monolog
我们安装了 Web 应用所需的三个基本 Symfony 包。
$ composer req symfony/swiftmailer-bundle
我们安装symfony/swiftmailer-bundle
。
$ composer req maker server --dev
我们安装了用于开发的包:maker
和server
。
.env
...
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
,其中包含一个用于发送电子邮件的简单链接。
src/Controller/TestMailController.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()
方法中,我们发送电子邮件。 请注意,发送电子邮件的代码不应在生产应用的控制器中。 它应该在某种服务。 但是出于简单原因,我们将其保留在此处。
public function index(Request $request, \Swift_Mailer $mailer,
LoggerInterface $logger)
{
我们注入Request
,Swift_Mailer
和记录器。
$name = $request->query->get('name');
我们获取在 GET 请求中使用的名称。
$message = new \Swift_Message('Test email');
$message->setFrom('example@example.com');
$message->setTo('example2@example.com');
创建了Swift_Message
。 from
和to
电子邮件值经过硬编码,以简化此示例。 您可以删除硬编码的值作为练习。 (将源电子邮件设置为参数,从表单中获取目标电子邮件。)
$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');
我们重定向到显示 Flash 消息的主页。
templates/emails/myemail.html.twig
Hi {{ name }}! You've got a test email.
Thanks!
这是电子邮件的简单模板。
$ php bin/console make:controller HomeController
我们创建一个HomeController
。 它包含一个用于发送电子邮件的简单链接。
src/Controller/HomeController.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
{% 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>
动画由位于main.js
文件中的 JavaScript 代码控制。
public/main.js
const flash = document.getElementById('flash-notice');
flash.addEventListener('click', function () {
flash.classList.add('hide');
});
当我们单击 Flash 消息时,事件回调将hide
类添加到元素的类列表中,从而启动淡出动画。
templates/base.html.twig
<!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 服务教程, Symfony 请求教程, Symfony Flash 消息 , Symfony 表单教程, PHP 教程。
请参阅 Mailtrap 的如何在 Symfony 中发送电子邮件的示例。
{% endraw %}