Magento vergleicht Warteschlangeneinträge aus der Datenbank und löscht Empfänger nur, wenn Ergebnisse gefunden wurden.
In meinem Fall war message_body_hash anders, da Magento eine globale Variable ($ taxIter) in tax / order / tax.phtml verwendet , die bei jedem Aufruf dieser Vorlage erhöht wird.
<tr class="summary-details-1 summary-details summary-details-first">
Versuchen Sie einfach, diese Zeile zu Ihrer local.xml hinzuzufügen
<sales_email_order_items>
<reference name="order_totals">
<reference name="tax">
<action method="setTemplate"><template>tax/order/tax-email.phtml</template></action>
</reference>
</reference>
</sales_email_order_items>
Kopieren Sie die Vorlage "tax / order / tax.phtml" nach "tax / order / tax-email.phtml" und ändern Sie:
...
global $taxIter; $taxIter++;
...
zu:
...
$taxIter=0; $taxIter++;
...
Versuchen Sie andernfalls, den Prozess zu verstehen, den ich zu erklären versucht habe, und finden Sie hoffentlich den Unterschied.
Magento stellt zwei Nachrichten in "core_email_queue" in die Warteschlange, wenn Ihre Konfiguration für "Send Order Email Copy Method" auf "Separate Email" eingestellt ist. Die erste Mail ist für bestimmte Empfänger im Backend. Die zweite Mail erhält Ihren Kunden.
Die Nachrichten werden in Mage_Core_Model_Email_Template # send () gespeichert .
public function send($email, $name = null, array $variables = array())
{
if (!$this->isValidForSend()) {
Mage::logException(new Exception('This letter cannot be sent.')); // translation is intentionally omitted
return false;
}
$emails = array_values((array)$email);
$names = is_array($name) ? $name : (array)$name;
$names = array_values($names);
foreach ($emails as $key => $email) {
if (!isset($names[$key])) {
$names[$key] = substr($email, 0, strpos($email, '@'));
}
}
$variables['email'] = reset($emails);
$variables['name'] = reset($names);
$this->setUseAbsoluteLinks(true);
$text = $this->getProcessedTemplate($variables, true);
$subject = $this->getProcessedTemplateSubject($variables);
$setReturnPath = Mage::getStoreConfig(self::XML_PATH_SENDING_SET_RETURN_PATH);
switch ($setReturnPath) {
case 1:
$returnPathEmail = $this->getSenderEmail();
break;
case 2:
$returnPathEmail = Mage::getStoreConfig(self::XML_PATH_SENDING_RETURN_PATH_EMAIL);
break;
default:
$returnPathEmail = null;
break;
}
if ($this->hasQueue() && $this->getQueue() instanceof Mage_Core_Model_Email_Queue) {
/** @var $emailQueue Mage_Core_Model_Email_Queue */
$emailQueue = $this->getQueue();
$emailQueue->setMessageBody($text);
$emailQueue->setMessageParameters(array(
'subject' => $subject,
'return_path_email' => $returnPathEmail,
'is_plain' => $this->isPlain(),
'from_email' => $this->getSenderEmail(),
'from_name' => $this->getSenderName(),
'reply_to' => $this->getMail()->getReplyTo(),
'return_to' => $this->getMail()->getReturnPath(),
))
->addRecipients($emails, $names, Mage_Core_Model_Email_Queue::EMAIL_TYPE_TO)
->addRecipients($this->_bccEmails, array(), Mage_Core_Model_Email_Queue::EMAIL_TYPE_BCC);
$emailQueue->addMessageToQueue();
return true;
}
...
}
Diese Methode wird zweimal ausgelöst und fährt mit demselben Warteschlangenmodell (Mage_Core_Model_Email_Queue $ emailQueue) fort, einschließlich der Variablen ($ _recipients) des ersten Laufs.
->addRecipients($emails, $names, Mage_Core_Model_Email_Queue::EMAIL_TYPE_TO)
In dieser Zeile wird die E-Mail-Adresse des Kunden zum vorhandenen Array _recipients hinzugefügt.
$emailQueue->addMessageToQueue();
Magento versucht, das Warteschlangenmodell in der Datenbank zu speichern und prüft, ob E-Mail bereits zur Warteschlange für angeforderte Empfänger hinzugefügt wurde.
Mage_Core_Model_Resource_Email_Queue # wasEmailQueued
public function wasEmailQueued(Mage_Core_Model_Email_Queue $queue)
{
$readAdapter = $this->_getReadAdapter();
$select = $readAdapter->select()
->from(
array('recips' => $this->getTable('core/email_recipients')),
array('recipient_email', 'recipient_name', 'email_type')
)
->join(array('queue' => $this->getMainTable()), 'queue.message_id = recips.message_id', array())
->where('queue.entity_id =? ', $queue->getEntityId())
->where('queue.entity_type =? ', $queue->getEntityType())
->where('queue.event_type =? ', $queue->getEventType())
->where('queue.message_body_hash =? ', md5($queue->getMessageBody()));
$existingRecipients = $readAdapter->fetchAll($select);
if ($existingRecipients) {
...
$queue->clearRecipients();
foreach ($diff as $recipient) {
list($email, $name, $type) = $recipient;
$queue->addRecipients($email, $name, $type);
}
...
}
return false;
}
Wenn ein Warteschlangeneintrag in core_email_queue mit denselben Daten (entity_id, entity_type, event_type und message_body_hash) gefunden wird, wird eine Methode zum Löschen von Empfängern aufgerufen. Ich brauchte einige Zeit, um es herauszufinden.
$mailer = new Zend_Mail('utf-8'); $mailer->send();
) oder verwenden Sie SMTP oder ein Modul eines Drittanbieters?