ZetCode

在 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     

我们安装开发所需的包:makerserver

.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');
    }
}

TestMailControllerindex() 方法中,我们发送邮件。请注意,发送邮件的代码在生产应用程序中不应放在控制器中;它应该放在某个服务中。但出于简化的原因,我们将其放在这里。

public function index(Request $request, \Swift_Mailer $mailer, 
    LoggerInterface $logger)
{

我们注入 RequestSwift_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');

我们重定向到主页,在那里会显示闪现消息。

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>

动画由 JavaScript 代码控制,该代码位于 main.js 文件中。

public/main.js
const flash = document.getElementById('flash-notice');

flash.addEventListener('click', function () {

    flash.classList.add('hide');
});

当我们单击闪现消息时,事件回调会将 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 教程

请参阅 Mailtrap 的 如何在 Symfony 中发送带示例的电子邮件