2015-02-26 19 views
8

HTML e-postasındaki tüm bağlantıları izleyici ile değiştirmek istiyorum. Bildiğim kadarıyla bu EVENT_BEFORE_SEND olay var. Bu yüzdenYii2'de göndermeden önce HTML e-posta içeriğini nasıl alabilirim?

$mailer = \Yii::$app->mailer; 
/* @var $mailer \yii\mail\BaseMailer */ 
$mailer->attachBehavior('archiver', [ 
    'class' => \app\MailTracker::class 
]); 

İşte MyTracker sınıfın içeriği olduğu için aşağıdaki gibi kullanılabilir bazı davranış yarattı.

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); 
    } 
} 

sorun şimdi \yii\mail\BaseMailer göndermeden önce Teslim edilen HTML çıktısını almak için bir yöntem sağlamaz olduğunu.

Bu nasıl yapılır? Bunu elde edebilirsiniz

GÜNCELLEME

tek yolu bu hacky şekilde geçer.

/* @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); 
    } 
+0

ben aynı şeyi yapmak zorunda sona erdi ettik. Çok sinir bozucu. –

+0

Yansıma'yı kullanmaktan kaçınmak için, posta gövdesini (kodlama olmaksızın) '$ message-> getChildren() [0] -> getBody() ' – nevermind

cevap

0

E-posta içeriğinizi düzenlemek için, editörünü ckeditor ile birlikte görüntüleyebilirsiniz. Ckeditor, içeriği istediğiniz gibi düzenlemenize yardımcı olur.

https://github.com/2amigos/yii2-ckeditor-widget

düzenle e-posta göndermeden önce içeriği.

+0

numarasını arayarak almayı başardım. Nasıl içeriğin nasıl alınacağını soruyor. düzenlemek için – arogachev

4

Bulduğum bir yaklaşım, compose() yerine render() kullanmaktır. Bu yüzden mesaj dizisini göndermeden önce oluşturmalı ve tekrar oluşturmalıyız.

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

Yii doc: yii\mail\BaseMailer::render()

İlgili konular