Symfony 发送邮件

Symfony 邮件教程显示了如何在 Symfony 中发送简单邮件。 Symfony 使用 SwiftMailer 发送电子邮件。

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     

我们安装了用于开发的软件包: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_Mailermailer, 
        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');

        returnthis->redirectToRoute('home');
    }
}

TestMailController's index()方法中,我们发送电子邮件。 请注意,发送电子邮件的代码不应在生产应用的控制器中。 它应该在某种服务。 但是出于简单原因,我们将其保留在此处。

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

我们注入RequestSwift_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 Flash 消息Symfony 表单教程PHP 教程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程