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