Magento so sánh các mục hàng đợi từ cơ sở dữ liệu và chỉ xóa người nhận nếu tìm thấy kết quả.
Trong trường hợp của tôi, message_body_hash khác nhau vì Magento sử dụng biến toàn cục ($ taxIter) trong tax / order / tax.phtml , tăng lên mỗi khi mẫu này được gọi.
<tr class="summary-details-1 summary-details summary-details-first">
Chỉ cần cố gắng thêm dòng này vào tệp localDB của bạn
<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>
Và sao chép mẫu "tax / order / tax.phtml" sang "tax / order / tax-email.phtml" và thay đổi:
...
global $taxIter; $taxIter++;
...
đến:
...
$taxIter=0; $taxIter++;
...
Nếu không, hãy cố gắng hiểu quá trình tôi đã cố gắng giải thích và hy vọng tìm thấy sự khác biệt.
Magento đang xếp hàng hai tin nhắn trong "core_email_queue" nếu cấu hình của bạn cho "Phương thức sao chép email gửi đơn đặt hàng" được đặt thành "Email riêng biệt". Thư đầu tiên dành cho người nhận được chỉ định trong phụ trợ. Thư thứ hai sẽ nhận được khách hàng của bạn.
Các tin nhắn sẽ được lưu trong Mage_Core_Model_Email_Template # send () .
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;
}
...
}
Phương thức này được kích hoạt hai lần và tiến hành cùng một mô hình hàng đợi (Mage_Core_Model_Email_Queue $ emailQueue) bao gồm các biến ($ _reciprons) của lần chạy đầu tiên.
->addRecipients($emails, $names, Mage_Core_Model_Email_Queue::EMAIL_TYPE_TO)
Dòng này sẽ thêm địa chỉ email của khách hàng vào mảng _reciprons hiện có.
$emailQueue->addMessageToQueue();
Magento đang cố lưu mô hình hàng đợi vào cơ sở dữ liệu và kiểm tra xem email đã được thêm vào hàng đợi cho người nhận được yêu cầu chưa.
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;
}
Nếu mục nhập hàng đợi trong core_email_queue có cùng dữ liệu (entity_id, entity_type, event_type và message_body_hash) được tìm thấy, một phương thức để xóa người nhận sẽ được gọi. Tôi phải mất một thời gian để tìm ra nó.
$mailer = new Zend_Mail('utf-8'); $mailer->send();
) hoặc bạn đang sử dụng SMTP hoặc qua mô-đun của bên thứ 3?