{% 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 %}