Mail 邮件
邮件
介绍
Masonite提供了开箱即用的邮件支持。大部分项目在用户创建或者通知时常需要发送邮件。就因为邮件功能如此常用,masonite提供了多个驱动支持。
入门
所有邮件配置均在config/mail.py
文件,提供了较为直译的配置项目。提供内建驱动支持,你也可以自行创建。
可以参考创建邮件驱动来创建自己的驱动,且发布到PyPI中,以便其他用户可以使用,也许我们也会将它默认置入Masonite中。
默认,Masonite使用smtp
驱动。在.env
文件中,配置smtp认证信息。如果你要使用Mailgun的话,将驱动配置为mailgun
,且将Mailgun的认证信息配置子.env
文件。
配置驱动
masonite提供过了两个开箱即用的驱动,只需要少量配置。
SMTP 驱动
SMTP驱动.env
文件可以配置选项如下:
.env
MAIL_DRIVER=smtp
MAIL_FROM_ADDRESS=admin@email.com
MAIL_FROM_NAME=Masonite
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=admin@email.com
MAIL_PASSWORD=password
因为使用SMTP,那么我们可以使用支持SMTP的所有服务,类似mailtrap和gmail。
SSL (可选的)
你也许想在SMTP中使用ssl协议。你可以在config/mail.py
中通过打开SSL选项来实现:
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'),
'ssl': True
},
就是这样!只要验证通过,我们就可以发送邮件了。
记住最好是将敏感信息放在
.env
文件,因为它不会提交到版本控制中,.gitignore
默认将它配置为忽略状态。
Mailgun 驱动
Mailgun使用API来发送邮件而不是SMTP。Mailgun只需要两个配置项:
.env
MAILGUN_SECRET=key-xx
MAILGUN_DOMAIN=sandboxXX.mailgun.org
如果你要使用Mailgun,你需要修改默认的驱动:
config/mail.py
DRIVER = os.getenv('MAIL_DRIVER', 'smtp')
这意味你可以在.env
文件指定驱动:
.env
MAIL_DRIVER=mailgun
或者直接在config/mail.py
指定:
config/mail.py
DRIVER = 'mailgun'
你无需做其他操作,Masonite会自动从DRIVERS
配置中来读取mailgun的配置:
config/mail.py
DRIVERS = {
...
'mailgun': {
'secret': os.getenv('MAILGUN_SECRET', 'key-XX'),
'domain': os.getenv('MAILGUN_DOMAIN', 'sandboxXX.mailgun.org')
}
}
终端驱动
终端驱动会将你的邮件信息输出到终端。这样在测试和开发过程就简单多了。要使用终端驱动,你进行些许配置。
.env
MAIL_DRIVER=terminal
MAIL_FROM_ADDRESS=admin@email.com
MAIL_FROM_NAME=Masonite
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
日志驱动
日志驱动仅简单将邮件写入日志文件。要使用日志驱动,要进行些许配置:
.env
MAIL_DRIVER=log
MAIL_FROM_ADDRESS=admin@email.com
MAIL_FROM_NAME=Masonite
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
Masonite将会从DRIVERS
配置中获取到日志驱动配置。
config/mail.py
DRIVERS = {
...
'log': {
'file': os.getenv('LOG_FILE', 'mail.log'),
'location': 'bootstrap/logs'
}
}
发送邮件
Mail
类通过MailProvider
加载到容器中。我们可以在控制器方法中来取得Mail
类:
from masonite import Mail
def show(self, mail: Mail):
print(mail) # returns the default mail driver
我们可以如下发送邮件:
from masonite import Mail
def show(self, mail: Mail):
mail.to('hello@email.com').send('Welcome!')
你也可以如下方式来发送到指定用户:
from app.User import User
from masonite import Mail
...
def show(self, mail: Mail):
mail.to(User.find(1).email).send('Welcome!')
邮件队列
你可以使用如下方式使用邮件队列发送来发送:
from app.User import User
from masonite import Mail
...
def show(self, mail: Mail):
mail.to(User.find(1).email).queue().send('Welcome!')
切换驱动
所有邮件驱动都是由MailManager
类管理,并由MailProvider
引导。
我们可以指定所使用的驱动。虽然Masonite会使用mail
配置里的DRIVER
选项,我们也可以在运行过程中变更。
你可以看到在MailProvider
中我们可以使用MailManager
类来设置driver。我们也可以使用它来变更驱动:
from masonite.manager import MailManager
def show(self, manager: MailManager):
manager.driver('mailgun') # now uses the Mailgun driver
队列
发送邮件可能需要一些时间,最好还通过创建一个Job来完成。Jobs是继承Queueable
类的子类,可以放入队列中异步执行。类似如下:
from app.jobs.SendWelcomeEmail import SendWelcomeEmail
from masonite import Queue
def show(self, queue: Queue):
queue.push(SendWelcomeEmail)
这里将使用队列方式立即返回,而不是等待邮件发出。默认使用async
驱动,这里不需要配置其他选项,它简单使用线程方式在后台发送jobs。
阅读更多创建任务和异步邮件发送文档队列和任务。
方法
我们还可以定义主题:
mail.subject('Welcome!').to('hello@email.com').send('Welcome!')
可以设定要显示的发送者邮件地址:
mail.send_from('Admin@email.com').to('hello@email.com').send('Welcome!')
模板
通常邮件模板放置在:
resources/templates/mail
.
如果你不想邮箱内容仅为字符串,那么你可以选择发送模板。
mail.to('idmann509@gmail.com').template('mail/welcome').send()
这样就会实现模板来渲染作为邮件内容,并以html方式发送。注意,这里我们没有传递任何参数给send
方法。
给模板传递数据
你还可以给邮件模板传递数据。使用字典作为参数来实现,类似如下:
mail.to('idmann509@gmail.com').template('mail/welcome', {'name': 'Masonite User'}).send()
可邮件类
可邮件类是帮助你抽象一些逻辑来发送邮件。
你可以通过在app/mailables
目录创建可邮件类。可以借助craft命令来实现:
$ craft mailable WelcomeEmail
现在我们可以进一步完成可邮件类。让我们来实现一个欢迎邮件:
from masonite.drivers import Mailable
class WelcomeEmail(Mailable):
def __init__(self, to):
self.to = to
def build(self):
return (
self.subject('Welcome To My Application')
.reply_to('service@example.com')
.send_from('admin@example.com')
.view('emails/welcome')
.to(self.to)
)
一旦创建好后,我们就可以在需要的地方使用它:
from masonite import Mail
from app.mailables import WelcomeEmail
def show(self, mail: Mail):
mail.mailable(WelcomeEmail('user@example.com')).send()
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。