2013-11-14 101 views
3

我正在使用Swift Mailer將郵件發送到相當大的電子郵件地址列表。該郵件是爲每個收件人稍微定製的。一些佔位符被替換爲獨特的文本。使用Swiftmailer,我可以替換或刪除消息部分嗎?

我認爲它會更有效率(更少的垃圾回收等)重複使用Swift_Message多次實例。我只是setTo(),setBody()並再次發送到下一個地址。

這適用於單個零件體,通常只是html。但是...當我想要第二部分,通常是文本時,我可以做addPart(),但下一次循環時,會添加另一部分,然後再添加另一部分等等......該問題不會發生在setBody之上,因爲覆蓋現有的機構。

有沒有辦法覆蓋或刪除現有的部分?

感謝

+0

我只是不斷地在每個循環中創建一條新消息。 – Phil

回答

0

按照Swift Mailer Docs,有沒有這樣的方法作爲getBody()真的。

我建議你到賣場實際消息模板包含在一個變量的佔位符,並使用setBody()在每次迭代中解析出的模板替換郵件的完整的身體爲新的收件人,而不是試圖取代它的一小部分。

我看你的代碼可能是這個樣子:

$template = '<h1>Hello {{firstname}}</h1>, ...'; 
$recipients = [ 
    ['firstname' => 'John', 'email' => '[email protected]'], 
    ... 
]; 
$message = Swift_Message::newInstance('Subject here'); 

foreach ($recipients as $recipient) { 
    $body = str_replace('{{firstname}}', $recipient['firstname'], $template); 
    $message->setBody($body, 'text/html'); 

    // continue building the mail object and send it ... 
} 

這種方式,你確實可以重新使用Swift_Message實例每個郵件。儘管如果您在每次循環迭代中重新使用該實例或創建一個新實例,它對PHP沒有任何影響。

+0

對於單個零件消息,這可以正常工作,但問題是多部分消息,您需要在$ message-> addPart()中設置第二個(通常是純文本)零件。 「零件」積累。我已經改變它每次創建一個新的實例,並且工作正常。對我來說,首先關心它可能是一個微觀優化。 – tetranz

0

@tetranz由於@Hendrik概述您可以使用$message->getBody()$message->setBody($body)作爲主體部分。

您可以通過子女的相同方法訪問部件(您提到的多部分addPart())。即類似於:

$children = $message->getChildren(); 
foreach($children as &$child) { 
    $c_body = $child->getBody(); 
    //manipulate as you wish 
    $child->setBody($c_body); 
} 
$message->setChildren($children); 

這部作品斯威夫特V5.0.1

0

要由亨德里克和阿拉斯代爾答案擴大,我建議正在研究使用裝飾插件。 http://swiftmailer.org/docs/plugins.html#using-the-decorator-plugin

插件將替換每個收件人的整個郵件的所需佔位符,而不是操縱各個郵件部分。

例如

$message = \Swift_Message::newInstance(); 

$replacements = array(); 
foreach ($users as $user) { 
    $replacements[$user['email']] = array(
     '{username}' => $user['username'], 
     '{password}' => $user['password'] 
    ); 
    $message->addTo($user['email']); 
} 
$decorator = new \Swift_Plugins_DecoratorPlugin($replacements); 
$mailer->registerPlugin($decorator); 

$message 
    ->setSubject('Important notice for {username}') 
    ->setBody(
     "Hello {username}, we have reset your password to {password}\n" . 
     "Please log in and change it at your earliest convenience." 
    ); 
$message->addPart('{username} has been reset with the password: {password}', 'text/plain'); 
//.. 
$mailer->send($message); 

另外在PHP中,目的是通過引用傳遞,所以可以直接操縱各個部件體,或內容類型。

$textPart = \Swift_MimePart::newInstance('Hello World', 'text/plain'); 
$htmlPart = clone $textPart; 
$htmlPart->setContentType('text/html'); 
$message->setTo('[email protected]'); 
$message->attach($htmlPart); 
$message->attach($textPart); 
//... 
$mailer->send($message); 

$textPart->setBody('Something Else'); 
$htmlPart->setBody('Something Else'); 
$message->setTo('[email protected]'); 
$mailer->send($message); 

您還可以通過使用

$message->detach($textPart); 

而不是使用分離,在部分其迭代,尋求如何addPartattach工作,他們只需撥打setChildren(array_merge($this->getChildren(), array($part)))

刪除子零件因此,您可以通過定義子部件來手動設置兒童部件,該部件將取代呼叫addPartattach

$message->setChildren([$htmlPart, $textPart]); 

對於所有意圖和目的,如果你有不同的內容(儘管略)爲另一個收件人沿着移除消息的部分,你實際上創建一個新的消息。當消息部分需要被替換時,編程邏輯可以通過調用$message = \Swift_Message::newInstance()來反映。

相關問題