如何使用 Swift Mailer 生成 *.eml 文件(在 Laravel 中)



我想创建一个 *.eml 文件,我想将其用作 Outlook 的模板。我的项目正在使用拉拉维尔。

我知道SwiftMailer函数toString((,它用于将邮件转换为MIME格式。请参阅下面的方法。该代码正确生成标头,但是我传递给该方法的 body 和 html-template(blade( 不会以我想要的方式显示......

邮件不能发送,而是生成。

我在互联网上没有发现任何相关问题。保存生成的 *.eml 文件似乎并不流行:)有人能想到解决方案吗?

public function generateEmlFile(Request $request) {
    //...
    $data = array('name' => "recipient");
    Mail::send('emails.ordering', $data, function($message) {
        $message->from('example@mail.com');
        $message->to('example@mail.com');
        $message->subject('Subject');
        $content = $message->toString();
        dd($content);
    });
    return true;
}

到目前为止的工作转储:

Message-ID: <4900a58cfb9b22900d8500b6e80f3022@examlpe-domain>rn
Date: Wed, 17 Jul 2019 15:51:38 +0200rn
Subject: Subjectrn
From: example@mail.comrn
Reply-To: example-project <example-project@examlpe-domain.com>rn
To: example@mail.comrn
MIME-Version: 1.0rn
Content-Type: text/plain; charset=utf-8rn
Content-Transfer-Encoding: quoted-printablern

我建议不要使用任何外部 Swiftmailer 传输扩展或在 EventServiceProvider 中进行任何自定义编码。以下解决方案要简单得多:

创建日志目录logs/emails

添加额外的通道配置以config/logging.php

    'channels' => [
        // ...
        'emails' => [
            'driver' => 'single',
            'path' => storage_path('logs/emails/' . IlluminateSupportStr::uuid() . '.eml'),
            'level' => 'debug',
        ],

然后只需在.env中使用以下方法:

MAIL_MAILER=log
MAIL_LOG_CHANNEL=emails

这样,您可以获得只有一个缺点(无害(的精彩logs/emails/<UUID>.eml文件:电子邮件标题的第一行(Message-ID: ...之前(以日志格式前缀[_TIMESTAMP_] local.DEBUG: 为前缀。由于所有/大多数电子邮件客户端都会忽略非标准的电子邮件标头,因此这在开发中应该没有问题。

你可以侦听 LogSentMessage 事件

diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index 723a290..f7568ec 100644
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -18,6 +18,9 @@ class EventServiceProvider extends ServiceProvider
         Registered::class => [
             SendEmailVerificationNotification::class,
         ],
+       'IlluminateMailEventsMessageSent' => [
+           'AppListenersLogSentMessage',
+       ],
     ];

添加这 3 行后运行php artisan event:generate

这应该创建文件app/Listeners/LogSentMessage.php

在句柄功能中,您可以访问完整的味精 -> $event->message->toString();

https://laravel.com/docs/6.x/mail#events

如果您不在应用程序中发送电子邮件,则无需使用 laravel Mail外观。

Swiftmailer有一个扩展,支持将电子邮件另存为.eml文件https://github.com/geekdevs/swift-mailer-extensions

最新更新