创建一个 Mail 驱动

未匹配的标注
本文档最新版为 4.0,旧版本可能放弃维护,推荐阅读最新版!

创建一个邮件驱动程序#

介绍#

由于 Masonite 的服务容器,只需添加服务提供者,就可以使驱动程序变得非常容易使用。

入门#

Masonite 附带了一个名为 MailProvider 的服务提供者,该服务提供者将一些类加载到容器中,并使用 MailManager 引导默认的邮件驱动程序。该管理器类将从容器中获取驱动程序并将其实例化。我们可以看一下 MailProvider 类,它将为我们提供了更好的解释:

class MailProvider(ServiceProvider):

    wsgi = False

    def register(self):
        self.app.bind('MailConfig', mail)
        self.app.bind('MailSmtpDriver', MailSmtpDriver)
        self.app.bind('MailMailgunDriver', MailMailgunDriver)

    def boot(self):
        self.app.bind('Mail', MailManager(self.app))

在这里可以看到,因为我们仅将内容绑定到容器中,并且不需要运行 WSGI 服务器,所以将设置 wsgi = False。 将 wsgi 设置为 False 的服务提供者仅在服务器启动时运行,而不是在每个请求上都运行。

我们可以在此处看到我们正在将一些驱动程序绑定到容器中,然后在启动时绑定 MailManager。请记住,我们的启动方法可以访问已注册到容器中的所有内容。在执行引导方法之前,将在所有提供程序上执行 register 方法。

邮件管理器#

此处对 MailManager 的理解非常重要。 实例化 MailManager 时,它接受容器作为参数。 实例化 MailManager 时,它将触发 create_driver 方法,该方法将从配置文件中获取驱动程序,并从容器中检索 MailXDrivercreate_driver 方法是一个非常简单的方法:

def create_driver(self, driver=None):
    if not driver:
        driver = self.container.make('MailConfig').DRIVER.capitalize()
    else:
        driver = driver.capitalize()

    try:
        self.manage_driver = self.container.make('Mail{0}Driver'.format(driver))
    except KeyError:
        raise DriverNotFound('Could not find the Mail{0}Driver from the service container. Are you missing a service provider?'.format(driver))

注意当驱动器创建后,它尝试从容器中获取 Mail{0}Driver。因此,我们仅要注册一个 MailXDriver 到容器 ('X' 为驱动器的名字),Masonite 知道如何获取该驱动器。

创建驱动器#

现在我们知道我们需要一个 MailXDriver,现在我们来学习如何创建一个 maildrill 邮件驱动器。

我可以简单创建一个类来作为我们驱动器。我们不需要继承任何类,虽然 Masonite 提供了一个 BaseMailDriver 加快实现,出于一致性原则,所有的驱动器原则上都需要区继承它。你可以自己创建一个普通类对象,但它很难
会被接受 Pull Requests。

让我们继承 BaseMailDriver 来实现一个类:

from masonite.driver import BaseMailDriver

class MailMaildrillDriver(BaseMailDriver):
    pass

真棒!我们快好了。我们只需要在该类中实现一个方法,它就是 send 方法。所有其他 totemplate 方法都继承自 BaseMailDriver 类。你会学习如何使用 Maildirll 来发送邮件,并且在 send 方法中来实现。

我们可以参考其他启动器,不过我们先来看看 MailMailgunDriver 类:

import requests
from masonite.drivers import BaseMailDriver

class MailMailgunDriver(BaseMailDriver):

    def send(self, message=None):
        if not message:
            message = self.message_body

        domain = self.config.DRIVERS['mailgun']['domain']
        secret = self.config.DRIVERS['mailgun']['secret']
        return requests.post(
            "https://api.mailgun.net/v3/{0}/messages".format(domain),
            auth=("api", secret),
            data={"from": "{0} <mailgun@{1}>".format(self.config.FROM['name'], domain),
                  "to": [self.to_address, "{0}".format(self.config.FROM['address'])],
                "subject": self.message_subject,
                "html": message})

如果你疑惑 self.message_bodyself.config 从哪里来的,查看 BaseMailDriver 后。我们得知所有的驱动器构造均是通过服务容器来获取,所有你可以通过从容器中后任何你想要的对象。注意,这里我们都不需要一个构造函数,因为它继承了 BaseMailDriver 的实现。

注册你的邮件驱动器#

由于 MailManager 类在 boot 时创建,我们可以简单通过任何 service providers 注册方法将启动器注册到容器。我可以创建一个新的 Service Provider 注册它。你可以阅读更多关于创建 Service Providers 文档。现在,我们仅在 AppProvider 中注册它。

我们的 AppProvider 类看起来类似如下:

from your.driver.module import MailMandrillDriver
class AppProvider(ServiceProvider):

    wsgi = True

    def register(self):
        self.app.bind('WebRoutes', web.ROUTES)
        self.app.bind('ApiRoutes', api.ROUTES)
        self.app.bind('Response', None)
        self.app.bind('Storage', storage)

        # Register new mail driver
        self.app.bind('MailMandrillDriver', MailMandrillDriver)

    def boot(self):
        self.app.bind('Request', Request(self.app.make('Environ')))
        self.app.bind('Route', Route(self.app.make('Environ')))

真棒!我们新驱动器已经注册到容器里了。现在我们可以创建 Masonite 的 MailManager 类。我们可以通过以下方式来获取新的驱动器:

def show(self, Mail)
    Mail.driver('mandrill') # 从容器获取 MailMandrillDriver

配置#

如果我们想 MailManager 默认使用新的启动器,在 config/mail.py 文件中修改 DRIVER。另外,我们可能还需要加入一些其他配置项到 DRIVERS 字典中:

DRIVERS = {
    'smtp': {
        'host': os.getenv('MAIL_HOST', 'smtp.mailtrap.io'),
        'port': os.getenv('MAIL_PORT', '465'),
        'username': os.getenv('MAIL_USERNAME', 'username'),
        'password': os.getenv('MAIL_PASSWORD', 'password'),
    },
    'mailgun': {
        'secret': os.getenv('MAILGUN_SECRET', 'key-XX'),
        'domain': os.getenv('MAILGUN_DOMAIN', 'sandboxXX.mailgun.org')
    },
    'maildrill': {
        'secret': 'xx'
        'other_key': 'xx'
    }
}

通过这种方式,用户可以通过修改配置文件来切换驱动器。

就是这样!我们扩展了我们的 Masonite 项目,并创建了一个新的驱动器。考虑将它发布到 PyPI,以便其他人可以使用它。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/2.3/ad...

译文地址:https://learnku.com/docs/masonite/2.3/ad...

上一篇 下一篇
贡献者:3
讨论数量: 0
发起讨论 只看当前版本


暂无话题~