Couple of days back I had to work with mail sending in magento e-commerce. Here I am giving a complete example of how to do that:-

Magento sends mails with it’s model “core/email_template”. Here is an example code for your understanding:-

01 /**
02   * $templateId can be set to numeric or string type value.
03   * You can use Id of transactional emails (found in
04   * "System->Trasactional Emails"). But better practice is
05   * to create a config for this and use xml path to fetch
06   * email template info (whatever from file/db).
07   */
08   const EMAIL_TEMPLATE_XML_PATH = 'customer/testemail/email_template';
09   $templateId = Mage::getStoreConfig(EMAIL_TEMPLATE_XML_PATH);
10  
11   $mailSubject = 'HI this is a test mail.';
12  
13   /**
14   * $sender can be of type string or array. You can set identity of
15   * diffrent Store emails (like 'support', 'sales', etc.) found
16   * in "System->Configuration->General->Store Email Addresses"
17   */
18   $sender = Array('name'  => 'S. M. Asad Rahman',
19                   'email' => 'asad.dk.bd@gmail.com');
20  
21   /**
22   * In case of multiple recipient use array here.
23   */
24   $email = 'smasadrahman@yahoo.com';
25  
26   /**
27   * If $name = null, then magento will parse the email id
28   * and use the base part as name.
29   */
30   $name = 'Asad Rahman';
31  
32   $vars = Array();
33   /* An example how you can pass magento objects and normal variables*/
34   /*
35   $vars = Array('customer'=>$customer,
36                 'address' =>$address,
37                 'varification_data'=>'fake data for example');*/
38  
39   /*This is optional*/
40   $storeId = Mage::app()->getStore()->getId();
41  
42   $translate  = Mage::getSingleton('core/translate');
43   Mage::getModel('core/email_template')
44       ->setTemplateSubject($mailSubject)
45       ->sendTransactional($templateId, $sender, $email, $name, $vars, $storeId);
46   $translate->setTranslateInline(true);

Now lets put email template information in config.xml of the corresponding module.

01 <?xml version="1.0"?>
02 <config>
03 <!-- Other config infos
04 goes here
05  .
06  .
07  .-->
08    <global>
09     <!-- Other config infos
10     goes here
11     .
12     .
13     .-->
14     <template>
15       <email>
16         <customer_testemail_email_template translate="label" module="mymodulename">
17           <label>Test email sending</label>
18           <file>test_email_template.html</file>
19           <type>html</type>
20           </customer_testemail_email_template>
21         </email>
22       </template>
23     </global>
24  </config>

This config xml says there is a email template in “app/locale/en_US/template/email” there is a email template named “test_email_template.html”, so lets create the template file:-

01 <div style="font:11px/1.35em Verdana, Arial, Helvetica, sans-serif;">
02   <table cellspacing="0" cellpadding="0" border="0" width="98%" style="margin-top:10px; font:11px/1.35em Verdana, Arial, Helvetica, sans-serif; margin-bottom:10px;">
03     <tr>
04       <td align="center" valign="top">
05         <!-- [ header starts here] -->
06           <table cellspacing="0" cellpadding="0" border="0" width="650">
07             <tr>
08               <td valign="top">
09                 <p>
10                   <a href="{{store url=""}}" style="color:#1E7EC8;"><img src="{{skin url="images/logo_email.gif" _area='frontend'}}" alt="Magento" border="0"/></a>
11                 </p>
12               </td>
13             </tr>
14           </table>
15  
16           <!-- [ middle starts here] -->
17           <table cellspacing="0" cellpadding="0" border="0" width="650">
18             <tr>
19               <td valign="top">
20                 <p>
21                 <strong>Dear {{var customer.name}}</strong>,<br/>
22                 This is a test mail.:-)
23                 </p>
24               </td>
25             </tr>
26           </table>
27  
28       </td>
29     </tr>
30   </table>
31 </div>

In config.xml we set values for “customer_testemail_email_template”, but in code we use Mage::getStoreConfig(“customer/testemail_email/template”) to set $templateId. So we need to create a relation in between two. To do so we will create a installer to insert a data in db config.

01 <?php
02  
03 $installer = $this;
04 /* @var $installer Mage_Core_Model_Resource_Setup */
05  
06 $configValuesMap = array(
07   'customer/testemail_email/template' =>
08   'customer_testemail_email_template',
09 );
10  
11 foreach ($configValuesMap as $configPath=>$configValue) {
12     $installer->setConfigData($configPath, $configValue);
13 }

That’s it. Now this code snippet is good enough to send a customized mail. If you want the facility to set email template from admin panel, use the following system.xml in your module.

01 <?xml version="1.0"?>
02 <config>
03   <sections>
04     <customer>
05       <groups>
06         <testemail translate="label">
07           <label>Apply Non-Profit Account Options</label>
08           <sort_order>100</sort_order>
09           <show_in_default>1</show_in_default>
10           <show_in_website>1</show_in_website>
11           <show_in_store>1</show_in_store>
12           <fields>
13             <email_template translate="label">
14               <label>Email Template</label>
15               <frontend_type>select</frontend_type>
16               <source_model>adminhtml/system_config_source_email_template</source_model>
17               <sort_order>3</sort_order>
18               <show_in_default>1</show_in_default>
19               <show_in_website>1</show_in_website>
20               <show_in_store>1</show_in_store>
21             </email_template>
22           </fields>
23         </testemail>
24       </groups>
25     </customer>
26   </sections>
27 </config>

That’s it !!! I hope this post will help you sending emails from magento. Please leave comments :-) .