Php 在发送Yii2之前如何获取HTML电子邮件内容?

Php 在发送Yii2之前如何获取HTML电子邮件内容?,php,yii2,swiftmailer,Php,Yii2,Swiftmailer,我想用tracker替换HTML电子邮件中的所有链接。据我所知,在发送之前有一个事件。所以我创建了一些行为,可以像下面这样使用 $mailer = \Yii::$app->mailer; /* @var $mailer \yii\mail\BaseMailer */ $mailer->attachBehavior('archiver', [ 'class' => \app\MailTracker::class ]); 下面是MyTracker类的内容 class Mai

我想用tracker替换HTML电子邮件中的所有链接。据我所知,在发送之前有一个
事件。所以我创建了一些行为,可以像下面这样使用

$mailer = \Yii::$app->mailer;
/* @var $mailer \yii\mail\BaseMailer */
$mailer->attachBehavior('archiver', [
   'class' => \app\MailTracker::class
]);
下面是
MyTracker
类的内容

class MailTracker extends Behavior {
    public function events() {
        return [
            \yii\mail\BaseMailer::EVENT_BEFORE_SEND => 'trackMail',
        ];
    }

    /**
     * @param \yii\mail\MailEvent $event
     */
     public function trackMail($event) {
        $message = $event->message;

        $htmlOutput = $this->how_do_i_get_the_html_output();
        $changedOutput = $this->changeLinkWithTracker($htmlOutput);
        $message->getHtmlBody($changedOutput);
     }
}
现在的问题是
\yii\mail\BaseMailer
没有提供在发送之前呈现HTML输出的方法

如何做到这一点

更新

我能得到这个的唯一方法就是通过这种老套的方式

    /* @var $message \yii\swiftmailer\Message */
    if ($message instanceof \yii\swiftmailer\Message) {
        $swiftMessage = $message->getSwiftMessage();
        $r = new \ReflectionObject($swiftMessage);
        $parentClassThatHasBody = $r->getParentClass()
                ->getParentClass()
                ->getParentClass(); //\Swift_Mime_SimpleMimeEntity
        $body = $parentClassThatHasBody->getProperty('_immediateChildren');
        $body->setAccessible(true);
        $children = $body->getValue($swiftMessage);
        foreach ($children as $child) {
            if ($child instanceof \Swift_MimePart &&
                    $child->getContentType() == 'text/html') {
                $html = $child->getBody();
                break;
            }
        }
        print_r($html);
    }

为了编辑您的电子邮件内容,您可以尝试使用ckeditor在视图中编辑。Ckeditor可帮助您根据需要编辑内容


在发送电子邮件之前编辑内容。

我发现的一种方法是使用
render()
而不是
compose()
。 因此,我们需要在发送之前呈现消息字符串,然后重新编写它

$string = Yii::$app->mailer->render('path/to/view', ['params' => 'foo'], 'path/to/layout');
Yii文件:

我最后不得不做同样的事情。非常令人沮丧。为了避免使用反射,我通过调用
$message->getChildren()[0]->getBody()