创建一个 Mail 驱动
创建一个邮件驱动程序
介绍
由于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方法,该方法将从配置文件中获取驱动程序,并从容器中检索MailXDriver。create_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方法。所有其他to和 template方法都继承自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_body和self.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,以便其他人可以使用它。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
          
 Masonite 中文文档
            
            
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: