为了扩展 Hendrik 和 Alasdair 的答案,我建议考虑使用装饰器插件。
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('someone@example.com');
$message->attach($htmlPart);
$message->attach($textPart);
//...
$mailer->send($message);
$textPart->setBody('Something Else');
$htmlPart->setBody('Something Else');
$message->setTo('someone.else@example.com');
$mailer->send($message);
您还可以使用删除子部件
$message->detach($textPart);
他们没有使用 detach 来迭代各个部分,而是查看如何addPart
和attach
工作,而是简单地调用setChildren(array_merge($this->getChildren(), array($part)))
因此,您可以通过定义它们来手动设置子部件,这取代了调用addPart
or attach
。
$message->setChildren([$htmlPart, $textPart]);
出于所有意图和目的,如果您要删除消息的一部分以及另一个收件人的不同内容(尽管是轻微的),那么您实际上是在创建一条新消息。$message = \Swift_Message::newInstance()
编程逻辑可以通过在需要替换消息部分时调用来反映这一点。