Magento 1.9.1.0を使用しています。
バックエンドでは、顧客が注文するたびにセールスコピーメールを受信するように4つの異なる受信者を設定しました。問題は、バックエンドに挿入したすべての受信者が同じコピーメールを複数回受信することです。
誰かがこの問題を以前に経験したことがありますか?
Magento 1.9.1.0を使用しています。
バックエンドでは、顧客が注文するたびにセールスコピーメールを受信するように4つの異なる受信者を設定しました。問題は、バックエンドに挿入したすべての受信者が同じコピーメールを複数回受信することです。
誰かがこの問題を以前に経験したことがありますか?
回答:
TL; DR:Magento 1.9.1では注文コピーメールが深刻に壊れているため、注文コピーメールには「個別のメール」オプションの代わりに「Bcc」オプションを使用します。それはあなたのコピーのメールアドレスを顧客に公開します。
Magentoがこれを処理する方法には、根本的に何か問題があります。「Send Order Email Copy To」で「Send Order Email Copy Method」を「Separate Email」に設定して複数の(カンマ区切り)メールアドレスを指定すると、Magentoはcore_email_queue
テーブルに複数の個別のメッセージを作成しますコピーの受信者ごとに。
(例:test @ example.com、foobar @ example.comにコピーするように設定)
message_id entity_id entity_type event_type message_body_hash
4 19 order new_order b0faf3b948557fc38cf1ef564d0db16e
5 19 order new_order b0faf3b948557fc38cf1ef564d0db16e
6 19 order new_order b0faf3b948557fc38cf1ef564d0db16e
これで問題ありません。受信者ごとに個別のメッセージが作成されます。
ただし、実際の受信者は別のテーブルに保存されます- core_email_queue_recipients
。ここが問題です。各メッセージに1人の受信者を割り当てる代わりに、次のことが起こります。
recipient_id message_id recipient_email
13 4 foobar@example.com
14 5 foobar@example.com
15 5 test@example.com
16 6 foobar@example.com
17 6 test@example.com
18 6 customer@example.com
最初のメッセージに1人の受信者、2番目に2番目、3番目に3番目などを割り当てます。[コピー]フィールドに追加する受信者が多いほど、リストの最後のメールを受信するメールが多くなります。
何をすべきに追加されたことはcore_email_queue_recipients
これです:
recipient_id message_id recipient_email
13 4 foobar@example.com
14 5 test@example.com
15 6 customer@example.com
さらに悪いのは、顧客に送信された電子メールの[宛先]フィールドに他のすべての電子メールアドレスのリストが含まれているため、電子メールが「分離」していないことです(顧客の知識なしに個別に送信する必要があります) )-したがって、お客様にコピーリスト全体を公開します。
この問題を修正するには、Mage/Sales/Model/Order::queueNewOrderEmail()
と同様にで壊れたコピーロジックをオーバーライドして大幅に書き換える必要がありますがMage/Core/Model/Email/Queue
、これは簡単なことではありません。
短期的な修正は、コピー方法を「個別の電子メール」から「Bcc」に変更することです。このオプションは期待どおりに機能し、1つの電子メールのみを生成します。
Magentoはデータベースのキューエントリを比較し、結果が見つかった場合にのみ受信者をクリアします。
私の場合、Magentoがこのテンプレートが呼び出されるたびにインクリメントするtax / order / tax.phtmlでグローバル変数($ taxIter)を使用しているため、message_body_hashは異なりました。
<tr class="summary-details-1 summary-details summary-details-first">
この行をlocal.xmlに追加してみてください
<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>
そして、テンプレート "tax / order / tax.phtml"を "tax / order / tax-email.phtml"にコピーして変更します:
...
global $taxIter; $taxIter++;
...
に:
...
$taxIter=0; $taxIter++;
...
それ以外の場合は、私が説明しようとしたプロセスを理解して、うまくいけばその違いを見つけてください。
「Send Order Email Copy Method」の設定が「Separate Email」に設定されている場合、Magentoは「core_email_queue」に2つのメッセージをキューイングします。最初のメールは、バックエンドの指定された受信者宛です。2通目のメールでお客様をお迎えします。
メッセージは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;
}
...
}
このメソッドは2回トリガーされ、最初の実行の変数($ _recipients)を含む同じキューモデル(Mage_Core_Model_Email_Queue $ emailQueue)を続行します。
->addRecipients($emails, $names, Mage_Core_Model_Email_Queue::EMAIL_TYPE_TO)
この行は、顧客のメールアドレスを既存の_recipients配列に追加します。
$emailQueue->addMessageToQueue();
Magentoはキューモデルをデータベースに保存しようとし、要求された受信者のキューに電子メールがすでに追加されているかどうかを確認します。
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;
}
同じデータ(entity_id、entity_type、event_type、およびmessage_body_hash)を持つcore_email_queueのキューエントリが見つかった場合、受信者をクリアするメソッドが呼び出されます。それを理解するのに少し時間がかかりました。
まだこの問題に苦しんでいるすべての人のために、私は@solarissmokeが公開したのと同じ問題を経験しています。
これを修正するための非常に単純なカスタムモジュールを作成しました。これは、「個別の電子メール」のコピー方法でも期待どおりに機能します。あなたはそれをチェックしてここで複製することができます:https://github.com/UQPPA/FixSeparateCopyMethod
問題は、保存されているMage_Core_Model_Email_Queueにあります(受信者データを保存するときがあります。@ Mage_Core_Model_Email_Queue :: _ afterSaveメソッドを参照してください)。異なる保存を介して受信者をクリアせずに、新しい受信者を追加すると、現在の受信者だけでなく、古いものも。
この問題は、受信者テーブルに孤立したレコードを残す新しいMagento Email Queueシステムに関連している可能性があります。
これがあなたの問題である場合、私はこの投稿に修正を送信しました(外部キーを追加することにより):https : //magento.stackexchange.com/a/87299/23057
$mailer = new Zend_Mail('utf-8'); $mailer->send();
)を使用していますか、それともSMTPを使用していますか、それともサードパーティモジュールを使用していますか