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:-

/**
  * $templateId can be set to numeric or string type value.
  * You can use Id of transactional emails (found in
  * "System->Trasactional Emails"). But better practice is
  * to create a config for this and use xml path to fetch
  * email template info (whatever from file/db).
  */
  const EMAIL_TEMPLATE_XML_PATH = 'customer/testemail/email_template';
  $templateId = Mage::getStoreConfig(EMAIL_TEMPLATE_XML_PATH);

  $mailSubject = 'HI this is a test mail.';

  /**
  * $sender can be of type string or array. You can set identity of
  * diffrent Store emails (like 'support', 'sales', etc.) found
  * in "System->Configuration->General->Store Email Addresses"
  */
  $sender = Array('name'  => 'S. M. Asad Rahman',
                  'email' => 'asad.dk.bd@gmail.com');

  /**
  * In case of multiple recipient use array here.
  */
  $email = 'smasadrahman@yahoo.com';

  /**
  * If $name = null, then magento will parse the email id
  * and use the base part as name.
  */
  $name = 'Asad Rahman';

  $vars = Array();
  /* An example how you can pass magento objects and normal variables*/
  /*
  $vars = Array('customer'=>$customer,
                'address' =>$address,
                'varification_data'=>'fake data for example');*/

  /*This is optional*/
  $storeId = Mage::app()->getStore()->getId(); 

  $translate  = Mage::getSingleton('core/translate');
  Mage::getModel('core/email_template')
      ->setTemplateSubject($mailSubject)
      ->sendTransactional($templateId, $sender, $email, $name, $vars, $storeId);
  $translate->setTranslateInline(true);

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

<?xml version="1.0"?>
<config>
<!-- Other config infos 
goes here
 .
 .
 .-->
   <global>
    <!-- Other config infos 
    goes here
    .
    .
    .-->
    <template>
      <email>
        <customer_testemail_email_template translate="label" module="mymodulename">
          <label>Test email sending</label>
          <file>test_email_template.html</file>
          <type>html</type>
          </customer_testemail_email_template>
        </email>
      </template> 
    </global>
 </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:-

<div style="font:11px/1.35em Verdana, Arial, Helvetica, sans-serif;">
  <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;">
    <tr>
      <td align="center" valign="top">
        <!-- &#91; header starts here&#93; -->
          <table cellspacing="0" cellpadding="0" border="0" width="650">
            <tr>
              <td valign="top">
                <p>
                  <a href="{{store url=""}}" style="color:#1E7EC8;"><img src="{{skin url="images/logo_email.gif" _area='frontend'}}" alt="Magento" border="0"/></a>
                </p>
              </td>
            </tr>
          </table>

          <!-- &#91; middle starts here&#93; -->
          <table cellspacing="0" cellpadding="0" border="0" width="650">
            <tr>
              <td valign="top">
                <p>
                <strong>Dear {{var customer.name}}</strong>,<br/>
                This is a test mail.:-)
                </p>
              </td>
            </tr>
          </table>

      </td>
    </tr>
  </table>
</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.

<?php

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */

$configValuesMap = array(
  'customer/testemail_email/template' =>
  'customer_testemail_email_template',
);

foreach ($configValuesMap as $configPath=>$configValue) {
    $installer->setConfigData($configPath, $configValue);
}

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.

<?xml version="1.0"?>
<config>
  <sections>
    <customer>
      <groups>
        <testemail translate="label">
          <label>Apply Non-Profit Account Options</label>
          <sort_order>100</sort_order>
          <show_in_default>1</show_in_default>
          <show_in_website>1</show_in_website>
          <show_in_store>1</show_in_store>
          <fields>
            <email_template translate="label">
              <label>Email Template</label>
              <frontend_type>select</frontend_type>
              <source_model>adminhtml/system_config_source_email_template</source_model>
              <sort_order>3</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </email_template>
          </fields>
        </testemail>
      </groups>
    </customer>
  </sections>
</config>

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