Magento was not sending email notification to customer and magento web store owner after new order was placed. When I checked order in admin it was showing "Customer Notified" with a green tick but no one were receiving any notifications.
When I was updating order through admin, customer was getting notifications.
After a quick look, I couldn't find the issue as there were so many custom extensions on this client and not sure if any of them was interfering. So, I decided to write an observer that will be called after every successful order placement.
file: /trunk/wholesale/app/code/local/Technooze/Checkout/etc/config.xml
<config> ... <global> ... <models> <technooze_checkout> <class>Technooze_Checkout_Model</class> </technooze_checkout> </models> <events> <checkout_onepage_controller_success_action> <observers> <sendOrderEmails> <type>singleton</type> <class>Technooze_Checkout_Model_Observer</class> <method>sendOrderEmails</method> </sendOrderEmails> </observers> </checkout_onepage_controller_success_action> </events> </global> </config>
file: /trunk/wholesale/app/code/local/Technooze/Checkout/Model/Observer.php
<?php class Technooze_Checkout_Model_Observer { public function sendOrderEmails(Varien_Event_Observer $observer){ $orderIds = $observer->getData('order_ids'); foreach($orderIds as $_orderId){ $order = Mage::getModel('sales/order')->load($_orderId); try { $order->sendNewOrderEmail(); Mage::log('email sent'); } catch (Exception $e) { Mage::logException($e); } } return $this; } }
Added store owner's email address at:
admin / system / configuration / SALES / Sales Emails / Order /
Send Order Email Copy To: owner's email
Send Order Email Copy To: Bcc or Separate Email
Deleted cache and test. I was able to finally get emails on every new order placed. So the issue is solved. Below files and functions helped me to resolve this issue:
file: /trunk/wholesale/app/code/core/Mage/Checkout/Model/Type/Onepage.php
public function saveOrder(){... $order->sendNewOrderEmail(); ...}
file: /trunk/wholesale/app/code/core/Mage/Checkout/controllers/OnepageController.php
public function successAction(){... Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId))); ...}
file: /trunk/wholesale/app/code/core/Mage/Sales/Model/Order.php
/** * Sending email with order data * * @return Mage_Sales_Model_Order */ public function sendNewOrderEmail() { if (!Mage::helper('sales')->canSendNewOrderEmail($this->getStore()->getId())) { return $this; } $translate = Mage::getSingleton('core/translate'); /* @var $translate Mage_Core_Model_Translate */ $translate->setTranslateInline(false); $paymentBlock = Mage::helper('payment')->getInfoBlock($this->getPayment()) ->setIsSecureMode(true); $paymentBlock->getMethod()->setStore($this->getStore()->getId()); $mailTemplate = Mage::getModel('core/email_template'); /* @var $mailTemplate Mage_Core_Model_Email_Template */ $copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO); $copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStoreId()); if ($copyTo && $copyMethod == 'bcc') { foreach ($copyTo as $email) { $mailTemplate->addBcc($email); } } if ($this->getCustomerIsGuest()) { $template = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStoreId()); $customerName = $this->getBillingAddress()->getName(); } else { $template = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $this->getStoreId()); $customerName = $this->getCustomerName(); } $sendTo = array( array( 'email' => $this->getCustomerEmail(), 'name' => $customerName ) ); if ($copyTo && $copyMethod == 'copy') { foreach ($copyTo as $email) { $sendTo[] = array( 'email' => $email, 'name' => null ); } } foreach ($sendTo as $recipient) { $mailTemplate->setDesignConfig(array('area'=>'frontend', 'store'=>$this->getStoreId())) ->sendTransactional( $template, Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $this->getStoreId()), $recipient['email'], $recipient['name'], array( 'order' => $this, 'billing' => $this->getBillingAddress(), 'payment_html' => $paymentBlock->toHtml(), ) ); } $this->setEmailSent(true); $this->_getResource()->saveAttribute($this, 'email_sent'); $translate->setTranslateInline(true); return $this; }
Let me know if there is easier method.
davids posted on - Monday 2nd of June 2014 10:56:59 AM
Kreshnik posted on - Tuesday 25th of March 2014 08:24:22 AM
Whut posted on - Thursday 21st of July 2016 11:35:02 PM
If the root cause ever resolves itself, like when the problematic extension is uninstalled, customers will be getting 2 order emails.
devikajain posted on - Thursday 4th of August 2016 11:53:32 PM