创建一个 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
发起讨论 只看当前版本


暂无话题~