创建一个 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。