在监听mailer.sending事件

时间:2016-10-07 22:49:25

标签: php laravel laravel-5 swiftmailer

我试图捕获通过Laravel的Mail类发送的电子邮件的正文。通过收听事件mailer.sending,我可以获得Swift_Message个对象,但是,当我调用getBody()时,它会返回null。

但是,我可以使用__toString()魔术方法打印出整个电子邮件(带标题)。任何人都知道是否有办法获取电子邮件的正文?

使用修补程序(从事件触发中检索$ message):

>>> $message
=> <Swift_Message #000000004598a18f0000000059c6cf6b> {}
>>> $message->getBody(); 
=> null
>>> echo (string) $message;
Message-ID: <135138ac89676fd3487ff75b10989803@swift.generated>
Date: Fri, 07 Oct 2016 22:41:02 +0000
Subject: ...
From: ...
To: ...
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="_=_swift_v4_1475880062_895bd5de56ade4842a3c198ee264ced0_=_"


--_=_swift_v4_1475880062_895bd5de56ade4842a3c198ee264ced0_=_
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Email body here

--_=_swift_v4_1475880062_895bd5de56ade4842a3c198ee264ced0_=_--

1 个答案:

答案 0 :(得分:1)

深入了解Laravel代码,他们使用Mime部分而不是正文来发送纯文本电子邮件。 (也许这是由于Swiftmailer的设计,我对图书馆的了解还不够。)

我的快速解决方案是:

        $htmlBody = $message->getBody();
        $textBody = '';
        $children = $message->getChildren();
        if (isset($children[0]) && $children[0] instanceof \Swift_MimePart) {
            $textBody = $children[0]->getBody();
        }
        $body = ($htmlBody) ? $htmlBody : $textBody;

但是,可能需要进行额外检查以确保第一个孩子是纯文本电子邮件。希望这可以帮助遇到问题的其他人。