All posts tagged email

logo_paypal

There is a bug in Paypal Standard for Magento, when a customer has finished the order process and validate his payment in Paypal, the customer doesn’t receive any email including his invoice. He receives only a confirmation payment of Paypal and a message after the process to tell him that the order is going to be proceeded.

To resolve this problem, two possibilities:

  • Overload the class in your own module : Mage_Paypal_Model_Standard (app/code/core/Mage/Paypal/Model/) at the line 418 after $invoice->register()->pay();, add the following line: $invoice->sendEmail();
  • Create an event with the help of a class Observer.php which trigger after the event sales_order_invoice_pay, which in Paypal standard start at line 418, after the treatment $invoice->register()->pay(). To do it, you have to create a module (there is lots of tutorials on Google to know how to do it) with the following files (replace Name by the name of your module):
    • /app/code/local/Name/Sales/etc/config.xml
    • /app/code/local/Name/Sales/Model/Observer.php
    • /app/etc/modules/Name_All.xm
Here the content:
/app/code/local/Name/Sales/etc/config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Name_Sales>
            <version>0.1.0</version>
        </Name_Sales>
    </modules>
    <global>
        <models>
            <sales>
                <rewrite>
                    <observer>Name_Sales_Model_Observer</observer>
                </rewrite>
            </sales>
        </models>
        <events>
            <sales_order_invoice_pay>
                <observers>
                    <sales_notification_observer>
                        <type>singleton</type>
                        <class>sales/observer</class>
                        <method>sendInvoiceEmail</method>
                    </sales_notification_observer>
                </observers>
            </sales_order_invoice_pay>
        </events>
    </global>
</config>

/app/code/local/Name/Sales/Model/Observer.php

<?php
/**
 * Event sales_order_invoice_pay
 *
 */
require_once 'Mage/Sales/Model/Observer.php';
class Name_Sales_Model_Observer extends Mage_Sales_Model_Observer {
 
    public function sendInvoiceEmail($observer) {
            $invoice = $observer->getEvent ()->getInvoice ();
 
            switch ($invoice->getState ()) {
                case Mage_Sales_Model_Order_Invoice::STATE_PAID :
 
		try {
			// Save first time the invoice to get an id and send the invoice to the customer with the correct id
			$invoice->save ();
			Mage::log ('Email sent to the customer by the Name/sales/observer - Invoice number ' . $invoice->getIncrementId(), Zend_Log::DEBUG );
			$invoice->sendEmail ();
			$invoice->setEmailSent ( true );
			// Save a second time to save the EmailSent value
			$invoice->save ();
		} catch ( Exception $e ) {
			$session = Mage::getSingleton ( 'core/session' );
			$exception = new Exception ( Mage::helper('Sales')->__('Error during the email sending.'), 0 );
			$session->addException ( $exception, Mage::helper('Sales')->__('Error to send invoice email. Please, contact the website administrator.') );
		}
            }
        return $this;
    }
}

/app/etc/modules/Name_All.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Name_Sales>
            <active>true</active>
            <codePool>local</codePool>
        </Name_Sales>
    </modules>
</config>

In Paypal Express, the interesting line is in the controller /app/code/core/Mage/Paypal/controllers/expressController.php, in the method updateorderAction(){} the code is near of $invoice->register()->capture(); add $invoice->sendEmail(); or use this observer (untested).

For more information about the events I invite you to visit the Magento website which make good explanation: Customizing Magento using Event-Observer Method