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

时间:2019-07-17 14:20:18

标签: php laravel swiftmailer eml

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

我知道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>\r\n
Date: Wed, 17 Jul 2019 15:51:38 +0200\r\n
Subject: Subject\r\n
From: example@mail.com\r\n
Reply-To: example-project <example-project@examlpe-domain.com>\r\n
To: example@mail.com\r\n
MIME-Version: 1.0\r\n
Content-Type: text/plain; charset=utf-8\r\n
Content-Transfer-Encoding: quoted-printable\r\n

3 个答案:

答案 0 :(得分:0)

如果您未在应用程序中发送电子邮件,则无需使用laravel _pickle.PicklingError: Can't pickle <function Worker.long_calculation at 0x7fdbccd4bea0>: it's not the same object as __main__.Worker.long_calculation 门面。

Swiftmailer的扩展程序支持将电子邮件另存为Mail文件 https://github.com/geekdevs/swift-mailer-extensions

答案 1 :(得分:0)

您可以收听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,
         ],
+       'Illuminate\Mail\Events\MessageSent' => [
+           'App\Listeners\LogSentMessage',
+       ],
     ];

添加这三行后,运行php artisan event:generate

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

在handle函数中,您可以访问完整的msg-> $event->message->toString();

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

答案 2 :(得分:0)

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

创建日志目录useState

logs/emails添加额外的频道配置:

config/logging.php

然后在您的 'channels' => [ // ... 'emails' => [ 'driver' => 'single', 'path' => storage_path('logs/emails/' . \Illuminate\Support\Str::uuid() . '.eml'), 'level' => 'debug', ], 中使用以下内容:

.env

这样,您将获得精美的MAIL_MAILER=log MAIL_LOG_CHANNEL=emails 文件,但只有一个缺点(无害):电子邮件标题的第一行(在logs/emails/<UUID>.eml之前)以日志格式前缀{{1 }}。由于所有/大多数电子邮件客户端都会忽略非标准电子邮件标头,因此在开发中应该没有问题。