Laravel覆盖邮件以自动添加纯文本版本

时间:2016-09-10 18:45:25

标签: laravel laravel-5.3

我在我的Laravel应用程序中进行了一些更改,以自动将纯文本版本添加到我的电子邮件中。我通过使用该库来实现这一目标

https://packagist.org/packages/html2text/html2text

我会通过运行

获得文本版本
\Html2Text\Html2Text::convert($content)

现在我想覆盖laravels Mailable.php buildView()函数来自动生成文本。我的问题是:如何正确覆盖它?我可以在哪里重新声明它?

2 个答案:

答案 0 :(得分:1)

邮件程序由邮件服务提供商定义,您可以在config/app.php下的'providers'下看到它的注册,您将在此处看到:

\Illuminate\Mail\MailServiceProvider::class,

因此,您需要做的就是删除MailServiceProvider注册并根据您的更改创建您自己的Provider并注册您的。

确保您实施Illuminate\Contracts\Mail\Mailer合同。

但你不需要!

Laravel附带的邮件程序已经支持发送电子邮件的HTML和纯文本版本。

Mailer::send()方法的第一个参数是@param string|array $view,您通常会在其中发送电子邮件的HTML版本的视图名称,但是,您可以发送这样的数组。

Mailer::send([
    'html' => 'my-mails.notification-in-html',
    'text' => 'my-mails.notification-in-text',
  ], $data, $callback);

您甚至可以定义不同的文本并删除您不会在纯文本版本中放置的内容,或者调整在普通文本中看起来不错的不同签名,并格式化不同的内容。

有关详细信息,请查看parseView()课程中的Illuminate\Mail\Mailer

所以,你有它,2个选项:

  • 创建自己的邮件程序并注册,而不是默认的
  • 或只是使用一系列视图调用邮件程序。

答案 1 :(得分:0)

当需要为纯文本版本使用相同的HTML模板时,我已通过以下方式覆盖Mailable:

<?php

namespace App\Mail;

// [...] some other imports

use Illuminate\Mail\Mailable;

class BaseMailable extends Mailable
{
    // [...] some other code

    /**
     * Method to add plain text version by converting it from HTML version
     * Separate plain text view could be used if exists
     */
    public function viewHtmlWithPlainText($view, array $data = [])
    {
        // NOTE: we render HTML separately because HTML and Plain versions have the same data
        // and we need to pass `plain` parameter to the HTML template to render it differently
        $this->html( view($view, $this->buildViewData())->render() );

        $plainTextView = str_replace('emails.', 'emails.txt.', $view);
        $plainTextAttrs = [
            'plain' => true,
            'senderName' => config('app.name')
        ];
        if (view()->exists($plainTextView)) {
            $this->text( $plainTextView, array_merge($plainTextAttrs, $data) );
        } else {
            $this->text( $view, array_merge($plainTextAttrs, $data) );
        }

        return $this;
    }
}

然后在子Mailable中,您可以像之前的view()方法一样使用它:

<?php

namespace App\Mail;

use App\Mail\BaseMailable;

class UserResetPasswordLink extends BaseMailable
{
    public function build()
    {
        return $this
            ->subject(trans('ui.reset_password'))
            ->viewHtmlWithPlainText('emails.client.user-reset-password-link', [
                'token' => $this->token,
            ]);
    }
}

在模板中,您将拥有$plain=true用于纯文本电子邮件的变量,因此您可以将HTML模板文件重新用于纯文本,

@if (empty($plain))
<div>Some HTML content</div>
@else
Some plain text content
@endif