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()

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~